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

Kubeletから読み解くKubernetesのコンテナ管理の裏側/Kubelet & Containers

3499a1d71fa70b8ee44816ca9e7329fe?s=47 bells17
January 24, 2021

Kubeletから読み解くKubernetesのコンテナ管理の裏側/Kubelet & Containers

July Tech Festa 2021 winter
https://youtu.be/HNtRBkP4LZ8
で発表を行った資料になります。
Kubernnetesの中で各Worker Nodeでのコンテナ管理を行うKubeletがどんなふうに動作しているのかについてお話しています。

3499a1d71fa70b8ee44816ca9e7329fe?s=128

bells17

January 24, 2021
Tweet

Transcript

  1. Kubeletから読み解く Kubernetesのコンテナ管理の裏側 July Tech Festa(2021/01/24) @bells17

  2. ▶ @bells17 ▶ Software Engineer ▶ IDC Frontier inc. ▶

    普段やってること: + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発の調査・研究 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_
  3. 今⽇話すこと ▶ Kubernetesの概要 ▶ Kubernetes Core Componentについて ▶ Kubeletの動作について ▶

    dockershimの動作とCRIについて
  4. 注意点 ▶ Kubernetes v1.19ベースでのお話になります ▶ あくまでKubeletの実装を追った結果での理解の説明になるので、とこ ろどころ間違いが含まれている可能性があります

  5. Kubelet本体についてのより詳しい 詳細はこの本に書いてます ▶ 技術書典: http://bit.ly/tbf-kubelet ▶ Booth: http://bit.ly/booth-kubelet Kubeletの詳細が気になる⽅は 良ければ買ってください!

    またKubernetes Internal #4ではKubeletの実装が、 コードレベルでどうなっているかについて説明して ます https://youtu.be/gWS38gSiDZ0
  6. アジェンダ 1. そもそもKubernetesとは? 2. Kubernetesコントローラー 3. Kubernetes Core Component 4.

    Kubeletとは? 5. dockershimについて 6. CRIについて 7. Kubeletのメイン処理 8. その他のアプリケーション 9. 実際にPodからコンテナが作られる様⼦を(ふわっと)⾒てみよう 10. まとめ
  7. そもそもKubernetesとは?

  8. Kubernetes とは? ▶ Kubernetesはコンテナオーケストレーターの1つ ▶ etcd/control plane/worker nodeによって構成されたクラスターを構築し、 様々なコンテナをKubernetes上のnodeで動作させたり、動作させてるコン テナとネットワークをいい感じに連携できるようにすることができる

    ▶ デプロイするコンテナなどをmanifestファイルで宣⾔的に記述することで、 宣⾔した状態になるようにKubernetesがいい感じに調整処理を⾏ってくれる ▶ Googleが内部で運⽤していたコンテナ基盤であるBorgをOSS向けに作り直 したコンテナオーケストレーター ▶ また、KubernetesはCloud Native Computing Foundation(CNCF)に寄贈さ れており、CNCFのGraduatedプロジェクトとしてコミュニティベースで管理 されている
  9. manifestをKubernetesに適⽤することで 宣⾔されたmanifestの通りにコンテナが作成される

  10. Kubernetesコントローラー

  11. https://github.com/kubernetes/website/blob/fb6364da0afd19e8a9515aaae2de9bc74a0a6abd/static/images/docs/components-of-kubernetes.png

  12. None
  13. 基本パターン ▶ Managerプロセス全体の中で1つ、または複数のコントローラーが実⾏ される ▶ コントローラーは1つにつき、1種類のKubernetesリソースのみに対す る調整ループ(Reconciliation Loop)が実⾏される + 調整ループ:

    リソースのあるべき状態(Desired State)と実際の状態 (Actual State)を⽐較~あるべき状態になるように調整処理を⾏うもの + なので、2種類のリソースに対しては、最低2コントローラー以上が あるのが基本
  14. 調整ループ ▶ 主に以下の2種類の⽅法で実⾏される + Event Handlers: 監視対象のKubernetes Resourceの更新といった、 なんらかのイベントを元に実⾏される +

    無限ループによる定期実⾏: 設定値に基づいて数秒毎などの間隔で定 期実⾏が⾏われる
  15. https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg

  16. None
  17. ▶ Kubernetesのコードリーディングをする上で知っておくと良さそうなこと こういったKubernetesコントローラー実装周りについてはコード リーディングについての記事の中で書いたので良ければ⾒てください

  18. Kubernetes Core Component

  19. https://github.com/kubernetes/website/blob/fb6364da0afd19e8a9515aaae2de9bc74a0a6abd/static/images/docs/components-of-kubernetes.png

  20. Core Component ▶ etcd: API Serverのバックエンドで使⽤されている分散型のKVS ▶ Control Plane ▶

    API Server: KubernetesのAPIリクエストを処理するサーバー ▶ Kube Controller Manager: Kubernetesの様々なリソースのためのロジックを動かす 様々なコントローラーを動作させるマネージャー ▶ Cloud Controller Manager: Kubernetesとクラウド(実⾏基盤)を連携するための コントローラーを動作させるマネージャー ▶ Scheduler: PodをどのWorker Nodeに配置するかを決める ▶ Worker Node ▶ Kubelet: Worker Nodeで実⾏するコンテナを管理するアプリケーション ▶ Kube Proxy: Serviceリソースに基づくネットワーク設定を⾏うアプリケーション
  21. ▶ Cloud Controller Manager Deep Dive Cloud Controller Managerについては以下のスライドで まとめてあるので参考にしてください

  22. https://github.com/kubernetes/website/blob/fb6364da0afd19e8a9515aaae2de9bc74a0a6abd/static/images/docs/components-of-kubernetes.png

  23. Kubeletとは?

  24. Kubeletとは? ▶ コンテナランタイムと連携しWorker Nodeで動かすコンテナとその関連 リソースを管理する ▶ Static PodをMirror PodとしてAPI Serverに登録する

    ▶ Kubeletを動かしているサーバーをKubernetesクラスターのWorker Node として登録する ▶ Healthcheckや各種メトリクス情報などを公開するServerを起動 ▶ コンテナへのPortForward/ContainerLog/Execなどのエンドポイントもある ▶ dockershimを使う場合はdockershimサーバーの起動も Kubeletの機能の(あくまで)概要としてはこのくらい
  25. Kubeletのアーキテクチャ ▶ KubeletはGo⾔語のgoroutineとチャネルによる⾮同期処理によるアーキ テクチャとなっている ▶ goroutineとチャネルを使⽤して、Kubelet内部で数⼗のアプリケーショ ンが並⾏で動作しており、チャネルを通したイベントの送受信を通した、 イベント駆動モデルで処理が⾏われていく

  26. Kubeletとは? ▶ コンテナランタイムと連携しWorker Nodeで動かすコンテナとその関連 リソースを管理する ▶ Static PodをMirror PodとしてAPI Serverに登録する

    ▶ Kubeletを動かしているサーバーをKubernetesクラスターのWorker Node として登録する ▶ Healthcheckや各種メトリクス情報などを公開するWeb Serverを起動 ▶ コンテナへのPortForward/ContainerLog/Execなどのエンドポイントもある ▶ dockershimを使う場合はdockershimサーバーの起動も Kubeletの機能の(あくまで)概要としてはこのくらい 特にここらへんの実装が超巨⼤
  27. Kubeletの中では数多くのコンポーネント動いており、数⼗〜数百以上の goroutineが同時に動き、チャネルを通じてイベントを処理する

  28. ▶ Startup/Liveness/Readinessの各Probeはgoroutineによって制御される ▶ そのため、例えば1ノードで同じPodが100動いており、Startup/ Liveness/ReadinessそれぞれのProbeが設定されていた場合には、100*3 で300のgoroutineがそれぞれで動くことになる ▶ configMapAndSecretChangeDetectionStrategyがデフォルト(=watch)の 場合は、Podに設定されたSecret/ConfigMapの数だけgoroutineによる対 象のSecret/ConfigMapの変更監視を⾏うReflectorが起動する

    ▶ etc 中には動的に起動される goroutineもいくつか存在する
  29. None
  30. dockershimについて

  31. dockershim ▶ KubernetesにはContainer Runtime Interface(CRI)というコンテナランタ イムとのやり取りをする仕様が存在する ▶ しかしDockerにはCRIを満たした実装が存在しないため、CRIを通して Dockerの操作を⾏うためにdockershimが使⽤される ▶

    そのため、dockershimはdockerのためのCRI実装とも⾔える ▶ dockershimはKubeletに内蔵されていて、dockershim⽤にサーバーを⽴ ち上げ、KubeletはUNIXドメインソケットなどを介してdockershimサー バーと通信を⾏う
  32. None
  33. dockershimが⽴ち上げるプロセス ▶ gRPC Server: CRIのgRPCサーバー ▶ Streaming Server: kubectl execやkubectl

    port-forwardなどを処理するtcp サーバー API Server → kubelet → Streaming Server → コンテナ のようにプロキシされていく ▶ Container Manager: コンテナプロセスのoom_score_adjの設定などを⾏う
  34. CRIについて

  35. CRI ▶ CRIは以下の2種類のgRPC Serviceに分類できる ▶ Runtime Service: コンテナの操作に関するもの ▶ Image

    Service: コンテナイメージの取得などに関わるもの ▶ Runtime ServiceとImage Serviceは別々のランタイムを使い分けること が可能なよう(実装を⾒る限り) ▶ PodSandboxというPodのベースとなるコンテナを作り、他のコンテナと ネットワーク空間などをシェアする ▶ kubectl execやkubectl port-fowardなどの通信の仕様についてもCRIで定 義されている
  36. その他のアプリケーション

  37. kubeletのメイン処理以外にも例えばこういった アプリケーションも同時に動いている

  38. Server ▶ Healthz Server: ヘルスチェック⽤のエンドポイントだけを提供する サーバー ▶ Kubelet Server: 以下のようなエンドポイントを持ったサーバーを起動

    ▶ Podのログやexec、port-forwardなどを⾏うproxyエンドポイント ▶ 各種メトリクス⽤のエンドポイント ▶ Pod情報を返すエンドポイント ▶ pprof⽤のエンドポイント ▶ etc
  39. その他のアプリケーション ▶ syncNodeStatus: nodeリソースの登録とステータス更新を⾏う ▶ NodeLeaseController: NodeLeaseリソースの登録・更新を⾏う ▶ dynamicKubeletConfigController: ConfigMapから動的にKubeletの

    Configをダウンロードして、⼿元のConfigをアップデート~Kubelet プロセスを停⽌する(停⽌することでsystemdなどにより再起動)こと で、Kubelet Configを動的に更新するコントローラー ▶ Plugin Manager: プラグインディレクトリにソケットファイルが作られ た際に、作られたソケットファイルと通信を⾏い、CSI Driver/Device Pluginを登録~管理するManager ▶ clientCertificateManager: KubernetesのCertificateSigningRequestを 利⽤してKubeletが使う証明書の⽣成~更新を⾏う
  40. KubeletのPluginWatcher

  41. Kubelet Plugin Watcher

  42. Kubelet ~ CSI Drier間の通信

  43. Kubeletのメイン処理

  44. None
  45. 実際にPodからコンテナが作られる様⼦を(ふわっと)⾒てみよう

  46. API Serverからのイベント受信まで

  47. メインループからのPodの処理フロー

  48. Podの起動処理

  49. RuntimeManagerのPodの起動処理

  50. こんな感じでKubeletではgoroutineやチャネルを使い 様々なコンポーネントがイベント駆動で動作します

  51. まとめ

  52. まとめ ▶ Kubeletがコンテナを管理するメインプロセスの⼤まかな動作や仕組みについて解説しま した ▶ dockershimとCRIについても簡単に解説しました ▶ また、Kubeletのメインとなるコンテナ管理やdockershim以外にも⽴ち上げているWeb Serverやその他のアプリケーションについても⼀部紹介しました

  53. 感想 ▶ OSSで単体のアプリケーションとして読んだコードとしてはKubeletが今までで⼀番⼤きく、 goroutineとチャネルを使って様々なアプリケーションを1つのプロセスで⾮同期に管理する仕 組みは⼤まかでも把握するのがかなり⼤変でした ▶ ただKubeletはコンテナやコンテナと紐づくPodリソース、Volumeなどの関連するファイルな ど状態を⾃分⾃⾝で管理しなければ⾏けないものが⼤量にあるためある程度仕⽅ないのかなと いう印象です ▶

    1つのGoのアプリケーションの中で⼤量のgoroutineとチャネルを起動~管理している実装を初 めてちゃんと読んだので、かなりGoの勉強になりました ▶ CRIの実装としてはdockershimが内部で直接Dockerのコマンドをライブラリ越しに叩いてい るようなものなので、コンテナ管理をどのようにしているかのイメージがしやすかったです ▶ とはいえDockerのネットワークやCGroupなどまだまだわかっていない領域も多いので、そこ らへんはこれからの課題かなと思いました
  54. 参考資料 ▶ Kubernetes v1.19: https://github.com/kubernetes/kubernetes/tree/release-1.19 ▶ Control Topology Management Policies

    on a node: https://kubernetes.io/docs/tasks/administer-cluster/topology-manager ▶ Control CPU Management Policies on the Node: https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/ ▶ Configure Quality of Service for Pods: https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/ ▶ Certificate Signing Requests: https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/ ▶ Dynamic Kubelet Configuration: https://kubernetes.io/blog/2018/07/11/dynamic-kubelet-configuration/ ▶ Reconfigure a Node's Kubelet in a Live Cluster: https://kubernetes.io/docs/tasks/administer-cluster/reconfigure-kubelet/ ▶ CRI: the Container Runtime Interface: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/container-runtime-interface.md ▶ Redefine Container Runtime Interface: https://github.com/kubernetes/kubernetes/blob/release-1.5/docs/proposals/container-runtime-interface-v1.md ▶ Container Runtime Interface (CRI) Networking Specifications: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/kubelet- cri-networking.md ▶ Container Runtime Interface: Container Metrics: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/cri-container-stats.md ▶ CRI Streaming Requests: https://docs.google.com/document/d/1OE_QoInPlVCK9rMAx9aybRmgFiVjHpJCHI9LrfdNM_s/edit#heading=h.4yfjiw58o8d3 ▶ CRI: Log management for container stdout/stderr streams: https://github.com/kubernetes/kubernetes/blob/release-1.5/docs/proposals/kubelet-cri- logging.md ▶ Pod Shared PID Namespace: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/495-pod-pid-namespace/README.md ▶ Client/Server container runtime: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/runtime-client-server.md ▶ Introducing Container Runtime Interface (CRI) in Kubernetes: https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/ ▶ docker update: https://docs.docker.com/engine/reference/commandline/update/ ▶ docker container create: https://docs.docker.com/engine/reference/commandline/container_create/
  55. まとめ資料 ▶ Zenn scrap: https://zenn.dev/bells17/scraps/c351f36a94e72f74c3c8 ▶ Miro board: https://miro.com/app/board/o9J_lbLT0xU=/

  56. Kubelet本体についてのより詳しい 詳細はこの本に書いてます ▶ 技術書典: http://bit.ly/tbf-kubelet ▶ Booth: http://bit.ly/booth-kubelet Kubeletの詳細が気になる⽅は 良ければ買ってください!

    またKubernetes Internal #4ではKubeletの実装が、 コードレベルでどうなっているかについて説明して ます https://youtu.be/gWS38gSiDZ0
  57. Thanks / Question? ▶ @bells17 ▶ Slide: https://speakerdeck.com/bells17 ▶ @bells17_