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

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

bells17
January 24, 2021

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

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

bells17

January 24, 2021
Tweet

More Decks by bells17

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. 今⽇話すこと
    ▶ Kubernetesの概要
    ▶ Kubernetes Core Componentについて
    ▶ Kubeletの動作について
    ▶ dockershimの動作とCRIについて

    View Slide

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

    View Slide

  5. Kubelet本体についてのより詳しい
    詳細はこの本に書いてます
    ▶ 技術書典: http://bit.ly/tbf-kubelet
    ▶ Booth: http://bit.ly/booth-kubelet
    Kubeletの詳細が気になる⽅は
    良ければ買ってください!
    またKubernetes Internal #4ではKubeletの実装が、
    コードレベルでどうなっているかについて説明して
    ます https://youtu.be/gWS38gSiDZ0

    View Slide

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

    View Slide

  7. そもそもKubernetesとは?

    View Slide

  8. Kubernetes とは?
    ▶ Kubernetesはコンテナオーケストレーターの1つ
    ▶ etcd/control plane/worker nodeによって構成されたクラスターを構築し、
    様々なコンテナをKubernetes上のnodeで動作させたり、動作させてるコン
    テナとネットワークをいい感じに連携できるようにすることができる
    ▶ デプロイするコンテナなどをmanifestファイルで宣⾔的に記述することで、
    宣⾔した状態になるようにKubernetesがいい感じに調整処理を⾏ってくれる
    ▶ Googleが内部で運⽤していたコンテナ基盤であるBorgをOSS向けに作り直
    したコンテナオーケストレーター
    ▶ また、KubernetesはCloud Native Computing Foundation(CNCF)に寄贈さ
    れており、CNCFのGraduatedプロジェクトとしてコミュニティベースで管理
    されている

    View Slide

  9. manifestをKubernetesに適⽤することで
    宣⾔されたmanifestの通りにコンテナが作成される

    View Slide

  10. Kubernetesコントローラー

    View Slide

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

    View Slide

  12. View Slide

  13. 基本パターン
    ▶ Managerプロセス全体の中で1つ、または複数のコントローラーが実⾏
    される
    ▶ コントローラーは1つにつき、1種類のKubernetesリソースのみに対す
    る調整ループ(Reconciliation Loop)が実⾏される
    + 調整ループ: リソースのあるべき状態(Desired State)と実際の状態
    (Actual State)を⽐較~あるべき状態になるように調整処理を⾏うもの
    + なので、2種類のリソースに対しては、最低2コントローラー以上が
    あるのが基本

    View Slide

  14. 調整ループ
    ▶ 主に以下の2種類の⽅法で実⾏される
    + Event Handlers: 監視対象のKubernetes Resourceの更新といった、
    なんらかのイベントを元に実⾏される
    + 無限ループによる定期実⾏: 設定値に基づいて数秒毎などの間隔で定
    期実⾏が⾏われる

    View Slide

  15. https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg

    View Slide

  16. View Slide

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

    View Slide

  18. Kubernetes Core Component

    View Slide

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

    View Slide

  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リソースに基づくネットワーク設定を⾏うアプリケーション

    View Slide

  21. ▶ Cloud Controller Manager Deep Dive
    Cloud Controller Managerについては以下のスライドで
    まとめてあるので参考にしてください

    View Slide

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

    View Slide

  23. Kubeletとは?

    View Slide

  24. Kubeletとは?
    ▶ コンテナランタイムと連携しWorker Nodeで動かすコンテナとその関連
    リソースを管理する
    ▶ Static PodをMirror PodとしてAPI Serverに登録する
    ▶ Kubeletを動かしているサーバーをKubernetesクラスターのWorker Node
    として登録する
    ▶ Healthcheckや各種メトリクス情報などを公開するServerを起動
    ▶ コンテナへのPortForward/ContainerLog/Execなどのエンドポイントもある
    ▶ dockershimを使う場合はdockershimサーバーの起動も
    Kubeletの機能の(あくまで)概要としてはこのくらい

    View Slide

  25. Kubeletのアーキテクチャ
    ▶ KubeletはGo⾔語のgoroutineとチャネルによる⾮同期処理によるアーキ
    テクチャとなっている
    ▶ goroutineとチャネルを使⽤して、Kubelet内部で数⼗のアプリケーショ
    ンが並⾏で動作しており、チャネルを通したイベントの送受信を通した、
    イベント駆動モデルで処理が⾏われていく

    View Slide

  26. Kubeletとは?
    ▶ コンテナランタイムと連携しWorker Nodeで動かすコンテナとその関連
    リソースを管理する
    ▶ Static PodをMirror PodとしてAPI Serverに登録する
    ▶ Kubeletを動かしているサーバーをKubernetesクラスターのWorker Node
    として登録する
    ▶ Healthcheckや各種メトリクス情報などを公開するWeb Serverを起動
    ▶ コンテナへのPortForward/ContainerLog/Execなどのエンドポイントもある
    ▶ dockershimを使う場合はdockershimサーバーの起動も
    Kubeletの機能の(あくまで)概要としてはこのくらい
    特にここらへんの実装が超巨⼤

    View Slide

  27. Kubeletの中では数多くのコンポーネント動いており、数⼗〜数百以上の
    goroutineが同時に動き、チャネルを通じてイベントを処理する

    View Slide

  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もいくつか存在する

    View Slide

  29. View Slide

  30. dockershimについて

    View Slide

  31. dockershim
    ▶ KubernetesにはContainer Runtime Interface(CRI)というコンテナランタ
    イムとのやり取りをする仕様が存在する
    ▶ しかしDockerにはCRIを満たした実装が存在しないため、CRIを通して
    Dockerの操作を⾏うためにdockershimが使⽤される
    ▶ そのため、dockershimはdockerのためのCRI実装とも⾔える
    ▶ dockershimはKubeletに内蔵されていて、dockershim⽤にサーバーを⽴
    ち上げ、KubeletはUNIXドメインソケットなどを介してdockershimサー
    バーと通信を⾏う

    View Slide

  32. View Slide

  33. dockershimが⽴ち上げるプロセス
    ▶ gRPC Server: CRIのgRPCサーバー
    ▶ Streaming Server: kubectl execやkubectl port-forwardなどを処理するtcp
    サーバー
    API Server → kubelet → Streaming Server → コンテナ
    のようにプロキシされていく
    ▶ Container Manager: コンテナプロセスのoom_score_adjの設定などを⾏う

    View Slide

  34. CRIについて

    View Slide

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

    View Slide

  36. その他のアプリケーション

    View Slide

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

    View Slide

  38. Server
    ▶ Healthz Server: ヘルスチェック⽤のエンドポイントだけを提供する
    サーバー
    ▶ Kubelet Server: 以下のようなエンドポイントを持ったサーバーを起動
    ▶ Podのログやexec、port-forwardなどを⾏うproxyエンドポイント
    ▶ 各種メトリクス⽤のエンドポイント
    ▶ Pod情報を返すエンドポイント
    ▶ pprof⽤のエンドポイント
    ▶ etc

    View Slide

  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が使う証明書の⽣成~更新を⾏う

    View Slide

  40. KubeletのPluginWatcher

    View Slide

  41. Kubelet Plugin Watcher

    View Slide

  42. Kubelet ~ CSI Drier間の通信

    View Slide

  43. Kubeletのメイン処理

    View Slide

  44. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. Podの起動処理

    View Slide

  49. RuntimeManagerのPodの起動処理

    View Slide

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

    View Slide

  51. まとめ

    View Slide

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

    View Slide

  53. 感想
    ▶ OSSで単体のアプリケーションとして読んだコードとしてはKubeletが今までで⼀番⼤きく、
    goroutineとチャネルを使って様々なアプリケーションを1つのプロセスで⾮同期に管理する仕
    組みは⼤まかでも把握するのがかなり⼤変でした
    ▶ ただKubeletはコンテナやコンテナと紐づくPodリソース、Volumeなどの関連するファイルな
    ど状態を⾃分⾃⾝で管理しなければ⾏けないものが⼤量にあるためある程度仕⽅ないのかなと
    いう印象です
    ▶ 1つのGoのアプリケーションの中で⼤量のgoroutineとチャネルを起動~管理している実装を初
    めてちゃんと読んだので、かなりGoの勉強になりました
    ▶ CRIの実装としてはdockershimが内部で直接Dockerのコマンドをライブラリ越しに叩いてい
    るようなものなので、コンテナ管理をどのようにしているかのイメージがしやすかったです
    ▶ とはいえDockerのネットワークやCGroupなどまだまだわかっていない領域も多いので、そこ
    らへんはこれからの課題かなと思いました

    View Slide

  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/

    View Slide

  55. まとめ資料
    ▶ Zenn scrap: https://zenn.dev/bells17/scraps/c351f36a94e72f74c3c8
    ▶ Miro board: https://miro.com/app/board/o9J_lbLT0xU=/

    View Slide

  56. Kubelet本体についてのより詳しい
    詳細はこの本に書いてます
    ▶ 技術書典: http://bit.ly/tbf-kubelet
    ▶ Booth: http://bit.ly/booth-kubelet
    Kubeletの詳細が気になる⽅は
    良ければ買ってください!
    またKubernetes Internal #4ではKubeletの実装が、
    コードレベルでどうなっているかについて説明して
    ます https://youtu.be/gWS38gSiDZ0

    View Slide

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

    View Slide