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

Kubernetesソースコードリーディング入門

bells17
September 12, 2023

 Kubernetesソースコードリーディング入門

Kubernetes Novice Tokyo #27 で発表した資料です。
https://k8s-novice-jp.connpass.com/event/293144/

発表のライブ配信はこちら。
TODO

スライドで紹介した参考リンク集:
https://bells17.medium.com/things-you-should-know-about-reading-kubernetes-codes-933b0ee6181d
https://www.amazon.co.jp/dp/4297104385/
https://www.amazon.co.jp/dp/4297118378/
https://go.dev/tour/welcome/1
https://gopherdojo.org/studyroom/
https://www.amazon.co.jp/dp/4621300253/
https://speakerdeck.com/bells17/kubelet-and-containers
https://speakerdeck.com/ryusa/servicewotazunete3000xing-kuberneteskodorideingufalselu
https://speakerdeck.com/bells17/kube-api-server-k8sjp
https://speakerdeck.com/sanposhiho/zi-zuo-sitexue-bukubernetes-schedulerru-men
https://speakerdeck.com/bells17/cloud-controller-manager-deep-dive
https://speakerdeck.com/masayaaoyama/infrastudy2-k8s
https://github.com/kubernetes/client-go/tree/master/examples/workqueue
https://github.com/kubernetes/sample-controller/blob/master/controller.go
https://github.com/kubernetes-sigs/kubebuilder
https://speakerdeck.com/bells17/kubebuilder-introduction
https://zoetrope.github.io/kubebuilder-training/
https://github.com/cybozu-go
https://www.youtube.com/watch?v=yqB_le-N6EE
https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1602-structured-logging/README.md
https://github.com/kubernetes/enhancements/issues/1602
https://github.com/kubernetes/klog/issues/125
https://github.com/kubernetes/klog/pull/126
https://github.com/kubernetes-csi
https://kubernetes-csi.github.io/docs/drivers.html
https://speakerdeck.com/bells17/introduction-to-csi
https://github.com/kubernetes/kubeadm
https://speakerdeck.com/bells17/implementation-of-kubeadm-init
https://github.com/kubernetes-sigs/metrics-server
https://speakerdeck.com/bells17/metrics-server
https://speakerdeck.com/bells17/accurate-introduction
https://github.com/cybozu-go/accurate
https://slack.k8s.io/
https://www.youtube.com/watch?v=Ayo5w-CSmP0
https://github.com/kubernetes/community

bells17

September 12, 2023
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

  1. Kubernetes 
 ソースコー ド リー デ ィン グ ⼊⾨ Kubernetes

    Novice Tokyo # 2 7 ( 2 0 2 3 / 0 9 / 1 2 ) @bells 1 7
  2. ▶ @bells 1 7 ▶ Software Engineer@ 3 -shake inc.

    ▶ kubernetes & kubernetes-csi member ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ X(Twitter): @bells 1 7 _ ▶ GitHub: @bells 1 7
  3. Kubernetes とは? ▶ Kubernetesはコンテナオーケストレーターの1つ ▶ etcd/control plane/worker nodeによって構成されたクラスターを構築し、 様々なコンテナをKubernetes上のnodeで動作させたり、動作させてるコン テナとネットワークをいい感じに連携できるようにすることができる

    ▶ デプロイするコンテナなどをmanifestファイルで宣⾔的に記述することで、 宣⾔した状態になるようにKubernetesがいい感じに調整処理を⾏ってくれる ▶ Googleが内部で運⽤していたコンテナ基盤であるBorgをOSS向けに作り直 したコンテナオーケストレーター ▶ また、KubernetesはCloud Native Computing Foundation(CNCF)に寄贈さ れており、CNCFのGraduatedプロジェクトとしてコミュニティベースで管理 されている
  4. これからKubernetesを学ぶ場合 まだKubernetesを触ったことがない⼈は何はともあれ触ってみましょう ▶ Deploymentを使ってPod(コンテナグループ)がクラスター内で⾃動的に 分散配置されるのを検証する ▶ Podを削除してもSelf-healing機能によりDeploymentに設定したreplica の数に⾃動的に調整されるのを確認する ▶ Con

    fi gmap/Secretを利⽤してコンテナに各種設定や秘密情報を環境変数/ ボリュームとして渡せることを確認する ▶ Service/Ingressを使うことでロードバランサーなどを介して外部からコ ンテナに接続できることを確認する ▶ etc …
  5. ⼊⾨にオススメの書籍 画像引⽤元: https://www.amazon.co.jp/dp/ 4 2 9 7 1 0 4

    3 8 5 / https://www.amazon.co.jp/dp/ 4 2 9 7 1 1 8 3 7 8 /
  6. Go⾔語を学ぶには Go⾔語はインターネット上で良質な学習コンテンツが公開されているので、 個⼈的には下記のコンテンツを学んでおけば⼗分かとは思います ▶ A Tour of Go ▶ Gopher道場

    ⾃習室 ⾃分の場合はサンプルコードを書きながらわからないところを 
 書籍の『プログラミング⾔語Go』を読んで、という感じで覚えていきました
  7. https://github.com/kubernetes/website/blob/fb 6 3 6 4 da 0 afd 1 9

    e 8 a 9 5 1 5 aaae 2 de 9 bc 7 4 a 0 a 6 abd/static/images/docs/components-of-kubernetes.png
  8. Kube API Server ▶ Control Planeとして動作するコンポーネント ▶ Kubernetesの様々なデータ保存や取得、イベント通知を⾏うAPI Server ▶

    Rest APIを中⼼としたAPI Serverを提供する ▶ API定義はProtocol Bu ff ersによって⾏われる ▶ 定義したAPIはAPI Server側でOpenAPI形式に変換され、APIからスキーマ定義が 
 取得可能 ▶ etcdをデータ永続のためのデータストアとして使⽤ ▶ リソース操作時の⾃動的なデータ改変/バリデーションを可能にするWebhookを提供 ▶ 独⾃リソース管理のための機能を提供 ▶ Extension API Server ▶ Custom Resource De fi nition(CRD)
  9. Kube Schedulerの全体像 https://github.com/kubernetes/website/blob/ 0 b 6 cfc 4 9 a

    5 b 9 6 9 3 1 aa 3 d 6 9 d 4 f 3 7 0 5 8 ec 2 2 9 1 2 e 1 d/static/images/docs/scheduling-framework-extensions.png
  10. Kube Controller Manager ▶ Control Planeとして動作するコンポーネント ▶ Reconciliation loopを実⾏する、約30種類程度のコントローラーの動作 を束ねるコンポーネント

    ▶ 「あるべき状態」を実現するためのKubernetesの様々な仕組みの多くは このコントローラー群によって⾏われている
  11. Cloud Controller Manager ▶ Control Planeとして動作するコンポーネント ▶ Kube Controller Managerで動作するコントローラーの中から実⾏環境の

    APIと連携して設定‧実現する機能を切り出したもの ▶ Cloud Providerと呼ばれる実⾏環境向けの実装を利⽤してL 4 ロードバラン サー(ServiceのType: LoadBalancer)の設定や各ノードの設定などを⾏う
  12. ▶ Kubeletから読み解くKubernetesのコンテナ管理の裏側 ▶ Serviceをたずねて3000⾏ ▶ Kube API Server ▶ ⾃作して学ぶKubernetes

    Scheduler⼊⾨ ▶ Cloud Controller Manager Deep Dive 各コンポーネントについて詳しく知りたい⽅は 
 下記を参照してください
  13. Reconciliation loopとは? ▶ Reconciliation loop(調整ループ)は各Kubernetesリソース(e.g. Deployment)に 対して実⾏される ▶ リソースに設定された「あるべき状態」と「現在の状態」とを⽐較して、「現在 の状態」を「あるべき状態」にするべく処理を⾏う

    ▶ Kubernetesの⼤半のロジックはこのReconciliation loopを⽤いて実現されてい るため、Reconciliation loopを⾃分で書いて体験しておくのがコードリーディン グの近道にもなる ▶ 例えば下記のようなことがReconciliation loopによって実現されている ▶ Deploymentの設定に基づきReplicaSetを⽣成 ▶ ReplicaSetに設定されたreplica数に応じてPodを⽣成 ▶ etc … ▶ 参考情報: 「VM 時代の開発とKubernetes による Cloud Native な開発のこれから」
  14. Reconciliation loopを体験する 簡単にReconciliation loopを体験するには下記のような⽅法がある ▶ client-goのexampleである”Workqueue Example” ▶ kubernetes/sample-controller ▶

    kubebuilder 特にkubebuilderについてはKubernetes Operator構築のSDKにもなっている のでKubernetes Operator⾃作にも役⽴つ kubebuilderについては「作って学 ぶ kubebuilder⼊⾨」というスライドで kubebuilderを使ったデモをやってみてるので参考にしてもらえれば
  15. Kuberneteのリポジトリ Kubernetesに関するGitHub Organizationは下記のようになっている ▶ kubernetes: 主にKubernetes本体に関するorg ▶ Kubernetes-sigs: Kubernetesコミュニティが管理しているコア以外のorg ▶

    Kubernetes-csi: CSIに関するorg ▶ kubernetes-client: 各⾔語でのKubernetesのクライアント実装があるorg ▶ kubernetes-retired: アーカイブされたリポジトリを設置するorg ▶ kubernetes-incubator ▶ kubernetes-nightly ※上記説明は著者による主観なので注意(Orgに関する説明が⾒当たらなかった)
  16. e.g. 
 Structured Logging KEP ▶ 構造化ロギングのKEP例 ▶ ⽬標とすること/しないことや実装⽅ 法、設計の詳細などが書かれている

    https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/ 1 6 0 2 -structured-logging/README.md
  17. エントリーポイントを1から読む Kubernetesではコアコンポーネントだけで下記のようなプログラム 
 が存在します ▶ Kubelet ▶ Kube-proxy ▶ Kube

    API Server ▶ Kube Scheduler ▶ Kube Controller Manager ▶ Cloud Controller Manager これらを1から読んでいくのもやり⽅の⼀つ
  18. CSI Driver Kubernetesでボリュームを使うプラグインとしてCSI Driverがあります ▶ Kubernetesと連携してドライバーを動作させるためのサイドカーが kubernetes-csi orgにあります ▶ CSI

    Driver実装の⼀覧についてはこちらから探すことができます CSI Driverについては「CSI⼊⾨」というセッションで以前発表してるので、 気になる⽅はこちらも参考にしてください
  19. CSI Driverの全体像 https://github.com/kubernetes/community/blob/d 8 3 cd 5 3 9 7

    9 d 0 8 ac 0 e 0 e 3 3 7 0 4 c 6 aec 6 b 1 c 3 cb 7 c 8 d/contributors/design-proposals/storage/container-storage-interface_diagram 1 .png
  20. コミュニティの詳細 Kubernetesコミュニティの詳細について知りたい場合は 
 kubernetes/community にアクセスすると調べることができます ▶ どんなSIGがあるのか? ▶ WGについては? ▶

    いつどんなミーティングをしているのか? ▶ SIGの主な構成メンバーについて ▶ SIGごとの開発をスケジュールについて
  21. 参考資料 ▶ https://bells 1 7 .medium.com/things-you-should-know-about-reading- kubernetes-codes- 9 3 3

    b 0 ee 6 1 8 1 d ▶ https://www.amazon.co.jp/dp/ 4 2 9 7 1 0 4 3 8 5 / ▶ https://www.amazon.co.jp/dp/ 4 2 9 7 1 1 8 3 7 8 / ▶ https://go.dev/tour/welcome/ 1 ▶ https://gopherdojo.org/studyroom/ ▶ https://www.amazon.co.jp/dp/ 4 6 2 1 3 0 0 2 5 3 / ▶ https://speakerdeck.com/bells 1 7 /kubelet-and-containers ▶ https://speakerdeck.com/ryusa/servicewotazunete 3 0 0 0 xing- kuberneteskodorideingufalselu ▶ https://speakerdeck.com/bells 1 7 /kube-api-server-k 8 sjp ▶ https://speakerdeck.com/sanposhiho/zi-zuo-sitexue-bukubernetes- schedulerru-men ▶ https://speakerdeck.com/bells 1 7 /cloud-controller-manager-deep-dive ▶ https://speakerdeck.com/masayaaoyama/infrastudy 2 -k 8 s ▶ https://github.com/kubernetes/client-go/tree/master/examples/workqueue ▶ https://github.com/kubernetes/sample-controller/blob/master/controller.go ▶ https://github.com/kubernetes-sigs/kubebuilder ▶ https://speakerdeck.com/bells 1 7 /kubebuilder-introduction ▶ https://zoetrope.github.io/kubebuilder-training/ ▶ https://github.com/cybozu-go ▶ https://www.youtube.com/watch?v=yqB_le-N 6 EE ▶ https://github.com/kubernetes/enhancements/blob/master/keps/sig- instrumentation/ 1 6 0 2 -structured-logging/README.md ▶ https://github.com/kubernetes/enhancements/issues/ 1 6 0 2 ▶ https://github.com/kubernetes/klog/issues/ 1 2 5 ▶ https://github.com/kubernetes/klog/pull/ 1 2 6 ▶ https://github.com/kubernetes-csi ▶ https://kubernetes-csi.github.io/docs/drivers.html ▶ https://speakerdeck.com/bells 1 7 /introduction-to-csi ▶ https://github.com/kubernetes/kubeadm ▶ https://speakerdeck.com/bells 1 7 /implementation-of-kubeadm-init ▶ https://github.com/kubernetes-sigs/metrics-server ▶ https://speakerdeck.com/bells 1 7 /metrics-server ▶ https://speakerdeck.com/bells 1 7 /accurate-introduction ▶ https://github.com/cybozu-go/accurate ▶ https://slack.k 8 s.io/ ▶ https://www.youtube.com/watch?v=Ayo 5 w-CSmP 0 ▶ https://github.com/kubernetes/community