Kubernetes Novice Tokyo #16(https://k8s-novice-jp.connpass.com/event/236328/)で発表したセッション資料です。
Metrics ServerKubernetes Novice Tokyo #16(2022/02/15)@bells17
View Slide
▶ @bells17▶ Software Engineer▶ 普段やってること:+ Kubernetes 関連コンポーネントの開発+ Kubernetes as a Service開発▶ Kubernetes SIG-Docs Japanese localization reviewer▶ Kubernetes Internal Organizer▶ #kubenews▶ @bells17_
#kubenews ほぼ毎週⾦曜22:00~YouTubeで配信中Kubernetes/Cloud Native関連のニュースを中⼼に技術雑談してます
今⽇話すこと▶ metrics-serverとは?▶ Kube API Server▶ metrics-serverの実装▶ metrics-serverを利⽤するアプリケーション
注意点▶ metrics-server v0.6.1 での内容になります▶ Kubernetesの基礎知識周りは細かい説明はあんまりしてないです
metrics-serverとは?
metrics-server▶ Kubernetesのnode/podのメトリクスをKubernetes APIとして公開することができるようになる拡張API Server▶ KubernetesのHPA/VPAを利⽤するためのデータソースとして利⽤される他、kubectl topコマンドを通してメトリクスデータを⾒ることができるようになる▶ HPA/VPAやkubectlに組み込まれているtopコマンドを利⽤するために必要なアプリケーションであるため、個⼈的には実質Kubernetesのコアアプリケーションみたいな感じがしてる
拡張API Server(Extention API Server)
拡張API Server▶ KubernetesのAPIサーバーは外部に⽴てたAPIサーバーによって拡張することができる▶ 拡張API Serverを構築~APIServiceリソースを登録というプロセスによって指定groupのAPIリクエストを拡張API Serverに処理させることが可能になる
Kube API Server
Kube API Server▶ Kubernetesの様々なデータ保存や取得、イベント通知を⾏うAPI Server▶ Rest APIを中⼼としたAPI Serverを提供する▶ API定義はProtocol Buffersによって⾏われる▶ 定義したAPIはAPI Server側でOpenAPI形式に変換され、APIからスキーマ定義が取得可能▶ etcdをデータ永続のためのデータストアとして使⽤▶ 独⾃リソース管理のための機能を提供+ Extension API Server+ Custom Resource Definition(CRD)
Kube API Server Overview
API Serverの主なコンポーネント▶ ServerChain: 認証/認可などの各種前処理を担当▶ Aggregator Server: リクエスト対象のgroupに応じて拡張API Serverや組み込みのAPI Serverなどに処理を委譲▶ API Server/API Extentions Server: Kubernetes組み込みリソースを処理するAPI Server+ API Serverが基本的な組み込みリソースの処理を担当+ API Extentions Serverが主にCRDリソースの処理を担当▶ Admission Controller: 永続化前のデータ書き換え/バリデーション処理を担当+ Admission WebhookもAdmission Controllerの1機能として実現してる▶ Transformer: 永続化するデータの暗号化処理を担当▶ Storage: etcdなど実際のデータストアへのデータ保存/読み出しなどを担当
ServerChain
ServerChainServerChainは各リクエストの処理前に実⾏される前処理になる▶ HSTS/CacheControl/CORSといったHTTP headerを設定▶ リクエスト処理時間を記録▶ リクエスト⽤のaudit eventレコーダーを⽣成▶ リクエスト情報を元にRequestInfoオブジェクトを⽣成▶ リクエストの種類を元にタイムアウト時間を設定▶ 認証▶ ユーザーのなりすまし設定▶ APIリクエストの優先度コントロール▶ 認可といったことを⾏なっているこれらの前処理後に実際に要求した各種のリソース操作などの処理を⾏なっている
Aggregator Server
Aggregator Server▶ Aggregator Serverは初期化時にAPI ServerとAPI Extensions ServerのOpenAPIスキーマ定義を読み取り、APIServiceリソースを⽣成する▶ Aggregator ServerではAPIServiceリソースを監視するKubernetes Controllerが動作していて、APIServiceリソースの変更に基づいて、動的にリクエストを処理するためのhttp handlerの設定が⾏われる▶ また、ユーザーが⼿動で追加したExtension API Serverについては、ユーザーが⼿動でAPIServiceリソースを作成することにより、設定した条件に基づいてリクエストがExtension API Serverにプロキシされる▶ API Extentions ServerやAPI Serverは、実際にはAggregator Serverに組み込まれて動作するので、複数のHTTPサーバーが起動するわけではない(それぞれが別々に⾃⽴して起動できるような実装にはなっているよう)
Kube API Serverのより詳しい説明はこちらの本で⾏なってます▶ 技術書典: https://bit.ly/tbf-kube-api-server▶ Booth: https://bit.ly/booth-kube-api-serverKube API Serverの詳細が気になる⽅は良ければ買ってください!内容を短くまとめたセッション資料はこちら▶ Kube API Server(資料)▶ Kube API Server(セッション動画)
metrics-serverの実装
metrics-server Architecture
metrics-server Architecture▶ APIService: metrics.k8s.ioグループの拡張API Serverとして登録▶ Extension API Server:+ apigroup: metrics.k8s.io+ Version: v1beta1+ リソース: nodemetrics/podmetrics▶ Scraper:+ Kubelet APIをコールしてworker nodeのメトリクスを取得+ エンドポイント: https://:10250/metrics/resource+ デフォルトのメトリクス取得間隔: 15秒+ ServiceAccountのkubeconfigの認証情報を使⽤してリクエスト+ 取得したメトリクスをパース〜メモリにキャッシュ
metrics-serverを利⽤するアプリケーション
kubectl top
HPA/VPA▶ HPA:+ spec.metrics[].typeでResource/ContainerResourceを使⽤した際にメトリクスの取得に利⽤される▶ VPA:+ VPAのコンポーネントの1つであるVPA Recommenderによるコンテナメトリクスの取得に利⽤される+ VPAは以下の3つのコンポーネントによって構成される+ Recommender: VPAの設定値に従ってPod resourceの推奨値を⽣成+ Updater: Recommenderが⽣成した推奨値になっていないPodをevictして再⽣成を⾏う+ Admission Plugin: Pod resourceにRecommenderの推奨値を設定する
https://raw.githubusercontent.com/kubernetes/design-proposals-archive/main/autoscaling/images/vpa-architecture.png
まとめ
metrics-serverを調査してみた感想▶ metrics-serverがどのようにメトリクスを収集し、拡張API Serverとしてデータを返しているのか?の仕組みが理解できた▶ 拡張API Serverの実際の実装を初めて読んだので作り⽅やユースケース例の勉強になった▶ また、調査過程でKubelet APIの認証⽅法にServiceAccountのkubeconfigにあるcacert/keyを利⽤していることも把握できた
参考資料▶ https://github.com/kubernetes-sigs/metrics-server/tree/v0.6.1▶ https://github.com/kubernetes/kubernetes/tree/v1.23.3▶ https://github.com/kubernetes/autoscaler/tree/vertical-pod-autoscaler-0.10.0▶ https://medium.com/p/f73cb17888b7▶ https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/▶ https://github.com/kubernetes/design-proposals-archive/blob/main/autoscaling/vertical-pod-autoscaler.md
Thanks / Question?▶ @bells17▶ Slide: https://speakerdeck.com/bells17▶ @bells17_