Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

そもそもKubernetesとは?

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Kubernetesコントローラー

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Kubernetes Core Component

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Kubeletとは?

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

dockershimについて

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

CRIについて

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

KubeletのPluginWatcher

Slide 41

Slide 41 text

Kubelet Plugin Watcher

Slide 42

Slide 42 text

Kubelet ~ CSI Drier間の通信

Slide 43

Slide 43 text

Kubeletのメイン処理

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Podの起動処理

Slide 49

Slide 49 text

RuntimeManagerのPodの起動処理

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

まとめ

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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