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. ▶ @bells17 ▶ Software Engineer ▶ IDC Frontier inc. ▶

    普段やってること: + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発の調査・研究 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_
  2. Kubelet本体についてのより詳しい 詳細はこの本に書いてます ▶ 技術書典: http://bit.ly/tbf-kubelet ▶ Booth: http://bit.ly/booth-kubelet Kubeletの詳細が気になる⽅は 良ければ買ってください!

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

    Kubeletとは? 5. dockershimについて 6. CRIについて 7. Kubeletのメイン処理 8. その他のアプリケーション 9. 実際にPodからコンテナが作られる様⼦を(ふわっと)⾒てみよう 10. まとめ
  4. Kubernetes とは? ▶ Kubernetesはコンテナオーケストレーターの1つ ▶ etcd/control plane/worker nodeによって構成されたクラスターを構築し、 様々なコンテナをKubernetes上のnodeで動作させたり、動作させてるコン テナとネットワークをいい感じに連携できるようにすることができる

    ▶ デプロイするコンテナなどをmanifestファイルで宣⾔的に記述することで、 宣⾔した状態になるようにKubernetesがいい感じに調整処理を⾏ってくれる ▶ Googleが内部で運⽤していたコンテナ基盤であるBorgをOSS向けに作り直 したコンテナオーケストレーター ▶ また、KubernetesはCloud Native Computing Foundation(CNCF)に寄贈さ れており、CNCFのGraduatedプロジェクトとしてコミュニティベースで管理 されている
  5. 基本パターン ▶ Managerプロセス全体の中で1つ、または複数のコントローラーが実⾏ される ▶ コントローラーは1つにつき、1種類のKubernetesリソースのみに対す る調整ループ(Reconciliation Loop)が実⾏される + 調整ループ:

    リソースのあるべき状態(Desired State)と実際の状態 (Actual State)を⽐較~あるべき状態になるように調整処理を⾏うもの + なので、2種類のリソースに対しては、最低2コントローラー以上が あるのが基本
  6. 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リソースに基づくネットワーク設定を⾏うアプリケーション
  7. Kubeletとは? ▶ コンテナランタイムと連携しWorker Nodeで動かすコンテナとその関連 リソースを管理する ▶ Static PodをMirror PodとしてAPI Serverに登録する

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

    ▶ Kubeletを動かしているサーバーをKubernetesクラスターのWorker Node として登録する ▶ Healthcheckや各種メトリクス情報などを公開するWeb Serverを起動 ▶ コンテナへのPortForward/ContainerLog/Execなどのエンドポイントもある ▶ dockershimを使う場合はdockershimサーバーの起動も Kubeletの機能の(あくまで)概要としてはこのくらい 特にここらへんの実装が超巨⼤
  9. dockershim ▶ KubernetesにはContainer Runtime Interface(CRI)というコンテナランタ イムとのやり取りをする仕様が存在する ▶ しかしDockerにはCRIを満たした実装が存在しないため、CRIを通して Dockerの操作を⾏うためにdockershimが使⽤される ▶

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

    port-forwardなどを処理するtcp サーバー API Server → kubelet → Streaming Server → コンテナ のようにプロキシされていく ▶ Container Manager: コンテナプロセスのoom_score_adjの設定などを⾏う
  11. CRI ▶ CRIは以下の2種類のgRPC Serviceに分類できる ▶ Runtime Service: コンテナの操作に関するもの ▶ Image

    Service: コンテナイメージの取得などに関わるもの ▶ Runtime ServiceとImage Serviceは別々のランタイムを使い分けること が可能なよう(実装を⾒る限り) ▶ PodSandboxというPodのベースとなるコンテナを作り、他のコンテナと ネットワーク空間などをシェアする ▶ kubectl execやkubectl port-fowardなどの通信の仕様についてもCRIで定 義されている
  12. Server ▶ Healthz Server: ヘルスチェック⽤のエンドポイントだけを提供する サーバー ▶ Kubelet Server: 以下のようなエンドポイントを持ったサーバーを起動

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

    Configをダウンロードして、⼿元のConfigをアップデート~Kubelet プロセスを停⽌する(停⽌することでsystemdなどにより再起動)こと で、Kubelet Configを動的に更新するコントローラー ▶ Plugin Manager: プラグインディレクトリにソケットファイルが作られ た際に、作られたソケットファイルと通信を⾏い、CSI Driver/Device Pluginを登録~管理するManager ▶ clientCertificateManager: KubernetesのCertificateSigningRequestを 利⽤してKubeletが使う証明書の⽣成~更新を⾏う
  14. 感想 ▶ OSSで単体のアプリケーションとして読んだコードとしてはKubeletが今までで⼀番⼤きく、 goroutineとチャネルを使って様々なアプリケーションを1つのプロセスで⾮同期に管理する仕 組みは⼤まかでも把握するのがかなり⼤変でした ▶ ただKubeletはコンテナやコンテナと紐づくPodリソース、Volumeなどの関連するファイルな ど状態を⾃分⾃⾝で管理しなければ⾏けないものが⼤量にあるためある程度仕⽅ないのかなと いう印象です ▶

    1つのGoのアプリケーションの中で⼤量のgoroutineとチャネルを起動~管理している実装を初 めてちゃんと読んだので、かなりGoの勉強になりました ▶ CRIの実装としてはdockershimが内部で直接Dockerのコマンドをライブラリ越しに叩いてい るようなものなので、コンテナ管理をどのようにしているかのイメージがしやすかったです ▶ とはいえDockerのネットワークやCGroupなどまだまだわかっていない領域も多いので、そこ らへんはこれからの課題かなと思いました
  15. 参考資料 ▶ 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/
  16. Kubelet本体についてのより詳しい 詳細はこの本に書いてます ▶ 技術書典: http://bit.ly/tbf-kubelet ▶ Booth: http://bit.ly/booth-kubelet Kubeletの詳細が気になる⽅は 良ければ買ってください!

    またKubernetes Internal #4ではKubeletの実装が、 コードレベルでどうなっているかについて説明して ます https://youtu.be/gWS38gSiDZ0