Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Metrics Server

bells17
February 15, 2022

Metrics Server

bells17

February 15, 2022
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. metrics-serverとは?

    View Slide

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

    View Slide

  8. 拡張API Server(Extention API Server)

    View Slide

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

    View Slide

  10. Kube API Server

    View Slide

  11. 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)

    View Slide

  12. Kube API Server Overview

    View Slide

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

    View Slide

  14. ServerChain

    View Slide

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

    View Slide

  16. Aggregator Server

    View Slide

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

    View Slide

  18. 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(セッション動画)

    View Slide

  19. metrics-serverの実装

    View Slide

  20. metrics-server Architecture

    View Slide

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

    View Slide

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

    View Slide

  23. kubectl top

    View Slide

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

    View Slide

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

    View Slide

  26. まとめ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide