Slide 1

Slide 1 text

Metrics Server Kubernetes Novice Tokyo #16(2022/02/15) @bells17

Slide 2

Slide 2 text

▶ @bells17 ▶ Software Engineer ▶ 普段やってること: + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_

Slide 3

Slide 3 text

#kubenews ほぼ毎週⾦曜22:00~YouTubeで配信中 Kubernetes/Cloud Native関連のニュースを中⼼に技術雑談してます

Slide 4

Slide 4 text

今⽇話すこと ▶ metrics-serverとは? ▶ Kube API Server ▶ metrics-serverの実装 ▶ metrics-serverを利⽤するアプリケーション

Slide 5

Slide 5 text

注意点 ▶ metrics-server v0.6.1 での内容になります ▶ Kubernetesの基礎知識周りは細かい説明はあんまりしてないです

Slide 6

Slide 6 text

metrics-serverとは?

Slide 7

Slide 7 text

metrics-server ▶ Kubernetesのnode/podのメトリクスをKubernetes APIとして公開する ことができるようになる拡張API Server ▶ KubernetesのHPA/VPAを利⽤するためのデータソースとして利⽤される 他、kubectl topコマンドを通してメトリクスデータを⾒ることができる ようになる ▶ HPA/VPAやkubectlに組み込まれているtopコマンドを利⽤するために必 要なアプリケーションであるため、個⼈的には実質Kubernetesのコアア プリケーションみたいな感じがしてる

Slide 8

Slide 8 text

拡張API Server(Extention API Server)

Slide 9

Slide 9 text

拡張API Server ▶ KubernetesのAPIサーバーは外部に⽴てたAPIサーバーによって拡張する ことができる ▶ 拡張API Serverを構築~APIServiceリソースを登録というプロセスによっ て指定groupのAPIリクエストを拡張API Serverに処理させることが可能に なる

Slide 10

Slide 10 text

Kube API Server

Slide 11

Slide 11 text

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)

Slide 12

Slide 12 text

Kube API Server Overview

Slide 13

Slide 13 text

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など実際のデータストアへのデータ保存/読み出しなどを担当

Slide 14

Slide 14 text

ServerChain

Slide 15

Slide 15 text

ServerChain ServerChainは各リクエストの処理前に実⾏される前処理になる ▶ HSTS/CacheControl/CORSといったHTTP headerを設定 ▶ リクエスト処理時間を記録 ▶ リクエスト⽤のaudit eventレコーダーを⽣成 ▶ リクエスト情報を元にRequestInfoオブジェクトを⽣成 ▶ リクエストの種類を元にタイムアウト時間を設定 ▶ 認証 ▶ ユーザーのなりすまし設定 ▶ APIリクエストの優先度コントロール ▶ 認可 といったことを⾏なっている これらの前処理後に実際に要求した各種のリソース操作などの処理を⾏なっている

Slide 16

Slide 16 text

Aggregator Server

Slide 17

Slide 17 text

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サーバーが起動するわけではない (それぞれが別々に⾃⽴して起動できるような実装にはなっているよう)

Slide 18

Slide 18 text

Kube API Serverのより詳しい 説明はこちらの本で⾏なってます ▶ 技術書典: https://bit.ly/tbf-kube-api-server ▶ Booth: https://bit.ly/booth-kube-api-server Kube API Serverの詳細が気になる⽅は 良ければ買ってください! 内容を短くまとめたセッション資料はこちら ▶ Kube API Server(資料) ▶ Kube API Server(セッション動画)

Slide 19

Slide 19 text

metrics-serverの実装

Slide 20

Slide 20 text

metrics-server Architecture

Slide 21

Slide 21 text

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の認証情報を使⽤してリクエスト + 取得したメトリクスをパース〜メモリにキャッシュ

Slide 22

Slide 22 text

metrics-serverを利⽤するアプリケーション

Slide 23

Slide 23 text

kubectl top

Slide 24

Slide 24 text

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の推奨値を設定する

Slide 25

Slide 25 text

https://raw.githubusercontent.com/kubernetes/design-proposals-archive/main/autoscaling/images/vpa-architecture.png

Slide 26

Slide 26 text

まとめ

Slide 27

Slide 27 text

metrics-serverを調査してみた感想 ▶ metrics-serverがどのようにメトリクスを収集し、拡張API Serverとしてデータを返してい るのか?の仕組みが理解できた ▶ 拡張API Serverの実際の実装を初めて読んだので作り⽅やユースケース例の勉強になった ▶ また、調査過程でKubelet APIの認証⽅法にServiceAccountのkubeconfigにあるcacert/ keyを利⽤していることも把握できた

Slide 28

Slide 28 text

参考資料 ▶ 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

Slide 29

Slide 29 text

Thanks / Question? ▶ @bells17 ▶ Slide: https://speakerdeck.com/bells17 ▶ @bells17_