Slide 1

Slide 1 text

Kubernetes 
 ソースコー ド リー デ ィン グ ⼊⾨ Kubernetes Novice Tokyo # 2 7 ( 2 0 2 3 / 0 9 / 1 2 ) @bells 1 7

Slide 2

Slide 2 text

▶ @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

Slide 3

Slide 3 text

今⽇話すこと ▶ Kubernetesのソースコードリーディングを始める上で知っておくべき 基礎知識をまとめて紹介します ▶ Kubernetes本体以外にも「こんなアプリケーションもあるよ」みたい なのを含めてザックリ紹介できればと思ってます ▶ 以前ブログで書いた「Kubernetesのコードリーディングをする上で 知っておくと良さそうなこと」をベースとした内容になっているので、 よければこちらもご覧ください ざっくり発表なので
 気楽に聞いてもらえれば

Slide 4

Slide 4 text

まずはKubernetesを触ってみる

Slide 5

Slide 5 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 6

Slide 6 text

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

Slide 7

Slide 7 text

これからKubernetesを学ぶ場合 まだKubernetesを触ったことがない⼈は何はともあれ触ってみましょう ▶ Deploymentを使ってPod(コンテナグループ)がクラスター内で⾃動的に 分散配置されるのを検証する ▶ Podを削除してもSelf-healing機能によりDeploymentに設定したreplica の数に⾃動的に調整されるのを確認する ▶ Con fi gmap/Secretを利⽤してコンテナに各種設定や秘密情報を環境変数/ ボリュームとして渡せることを確認する ▶ Service/Ingressを使うことでロードバランサーなどを介して外部からコ ンテナに接続できることを確認する ▶ etc …

Slide 8

Slide 8 text

⼊⾨にオススメの書籍 画像引⽤元: 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 /

Slide 9

Slide 9 text

Go⾔語を学ぶ

Slide 10

Slide 10 text

Go⾔語を学ぶ KubernetesはGo⾔語で実装されているため ▶ Go⾔語の基本的な⽂法を学ぶ ▶ Go⾔語を実⾏できる環境を整える ▶ Go⾔語で書かれたプログラムを読みやすいエディタ環境を整える あたりができているとコードリーディングに⼊りやすいです

Slide 11

Slide 11 text

Go⾔語を学ぶには Go⾔語はインターネット上で良質な学習コンテンツが公開されているので、 個⼈的には下記のコンテンツを学んでおけば⼗分かとは思います ▶ A Tour of Go ▶ Gopher道場 ⾃習室 ⾃分の場合はサンプルコードを書きながらわからないところを 
 書籍の『プログラミング⾔語Go』を読んで、という感じで覚えていきました

Slide 12

Slide 12 text

Go⾔語の実⾏環境を整える Go⾔語の実⾏環境については公式ドキュメントの「Download and install」 ページにある通りにインストールするだけで実⾏可能です 
 ⾃分の場合エディタにはVSCodeを使っているのですが、その場合はGo⾔語 ⾃体がインストールされていれば、あとはこちらのドキュメントにあるよう にGoのプラグインをインストールするだけでOKです 


Slide 13

Slide 13 text

Kubernetesのアーキテクチャを知る

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Kubernetesのコンポーネントについて

Slide 19

Slide 19 text

Kubelet ▶ Kubernetesクラスターの各ノードで動作するコンポーネント ▶ コンテナランタイムと連携しWorker Nodeで動かすコンテナとその関連 
 リソースを管理する

Slide 20

Slide 20 text

Kubeletによるコンテナ管理(ちょっと情報が古い)

Slide 21

Slide 21 text

kube-proxy ▶ Kubernetesクラスターの各ノードで動作するコンポーネント ▶ KubernetesのServiceリソースを元に⽣成されるEndpointSliceリソース を元に、ノードのネットワークプロキシを設定してPodにリクエストを 分散できるようにしてくれる ▶ ネットワークプロキシの設定はiptablesなどを利⽤して⾏われる

Slide 22

Slide 22 text

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)

Slide 23

Slide 23 text

Kube API Serverの全体像

Slide 24

Slide 24 text

Kube Scheduler ▶ Control Planeとして動作するコンポーネント ▶ 各PodをどのNodeで実⾏するのかを決定する処理を⾏うコンポーネント ▶ どういう条件‧優先度でスケジュールするかはスケジューラーの設定ファ イルで制御可能な他プラグイン形式で独⾃の条件‧優先度設定を組み込ん でスケジューリングすることも可能

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Kube Controller Manager ▶ Control Planeとして動作するコンポーネント ▶ Reconciliation loopを実⾏する、約30種類程度のコントローラーの動作 を束ねるコンポーネント ▶ 「あるべき状態」を実現するためのKubernetesの様々な仕組みの多くは このコントローラー群によって⾏われている

Slide 27

Slide 27 text

Cloud Controller Manager ▶ Control Planeとして動作するコンポーネント ▶ Kube Controller Managerで動作するコントローラーの中から実⾏環境の APIと連携して設定‧実現する機能を切り出したもの ▶ Cloud Providerと呼ばれる実⾏環境向けの実装を利⽤してL 4 ロードバラン サー(ServiceのType: LoadBalancer)の設定や各ノードの設定などを⾏う

Slide 28

Slide 28 text

Cloud Controller Managerの全体像

Slide 29

Slide 29 text

▶ Kubeletから読み解くKubernetesのコンテナ管理の裏側 ▶ Serviceをたずねて3000⾏ ▶ Kube API Server ▶ ⾃作して学ぶKubernetes Scheduler⼊⾨ ▶ Cloud Controller Manager Deep Dive 各コンポーネントについて詳しく知りたい⽅は 
 下記を参照してください

Slide 30

Slide 30 text

Reconciliation loopを体験してみよう

Slide 31

Slide 31 text

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 な開発のこれから」

Slide 32

Slide 32 text

Reconciliation loopを体験する 簡単にReconciliation loopを体験するには下記のような⽅法がある ▶ client-goのexampleである”Workqueue Example” ▶ kubernetes/sample-controller ▶ kubebuilder 特にkubebuilderについてはKubernetes Operator構築のSDKにもなっている のでKubernetes Operator⾃作にも役⽴つ kubebuilderについては「作って学 ぶ kubebuilder⼊⾨」というスライドで kubebuilderを使ったデモをやってみてるので参考にしてもらえれば

Slide 33

Slide 33 text

本格的に学ぶには? 実際にKubernetes Operatorを⾃作するなど、Reconciliation loopを本格的 に学ぶ場合は下記のような⽅法がオススメ ▶ サイボウズの池添さんが公開されているコンテンツで学ぶ ▶ 実際のKubernetes Operatorの実装を⾒て学ぶ サイボウズさんは⾃作のKubernetes OperatorをいくつもOSSで公開されて いるので実装を⾒る際にもオススメ

Slide 34

Slide 34 text

Kubernetesのリポジトリを⾒てみよう

Slide 35

Slide 35 text

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に関する説明が⾒当たらなかった)

Slide 36

Slide 36 text

Kubernetes本体は kubernetes/kubernetes にある

Slide 37

Slide 37 text

Kuberneteリポジトリの構成 Kuberneteリポジトリの構成はだいたい下記のようになっています ▶ cmd: kubeletやkubectlなど各種バイナリのエントリーポイント ▶ pkg: 各プログラムの本体 ▶ staging/src/k 8 s.io/: Kubernetes本体から切り出されたライブラリ群 
 (ライブラリはkubernetes org内にコピーとなるリポジトリがある)

Slide 38

Slide 38 text

主なライブラリについて 下記の3つのライブラリについてはソースコードを読む際にも、Kubernetes Operatorを実装する際にも⽬にすることが多くなるライブラリとなります ▶ api: 各種Kubernetesリソースの型定義など ▶ apimachinery: Kubernetesリソースのベースとなる型定義など ▶ client-go: Kubernetesのクライアントライブラリなど

Slide 39

Slide 39 text

client-goについて client-goには下記のようなコントローラー実装のための基本的な実装が⼊っ ています ▶ Kubernetes APIに触れるためのクライアントライブラリ ▶ Kubernetes ControllerでReconciliation loopを実装するための基礎実装 ▶ その他Kubernetes Controllerを作る上での共通のユーティリティ

Slide 40

Slide 40 text

Kubernetesリポジトリの解説は 
 コミュニティの「Meet out contributors」でも⾏われています https://www.youtube.com/watch?v=yqB_le-N 6 EE

Slide 41

Slide 41 text

Kubernetesで読むコードのネタ探しをしよう

Slide 42

Slide 42 text

KEPからネタを探す KuberenetesコミュニティではKubernetes Enhancement Proposals (KEP) という仕組みでKubernetesの機能追加や変更に関する提案を⾏うルールに なっています 新しく実装された機能やこれから実装されるかもしれない機能について、こ のKEPを読むことで詳しくしることができるかもしれません KEPを読んで興味を持ったら実装を探してみるのも良いかもしれません

Slide 43

Slide 43 text

e.g. 
 Structured Logging KEP ▶ 構造化ロギングのKEP例 ▶ ⽬標とすること/しないことや実装⽅ 法、設計の詳細などが書かれている https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/ 1 6 0 2 -structured-logging/README.md

Slide 44

Slide 44 text

KEPのIssue https://github.com/kubernetes/enhancements/issues/ 1 6 0 2

Slide 45

Slide 45 text

KEPのIssueに紐付けられたklogのIssue 
 (Kubernetesのログライブラリ) https://github.com/kubernetes/klog/issues/ 1 2 5

Slide 46

Slide 46 text

klogのIssueに紐付けられたPRから実装を調べられる https://github.com/kubernetes/klog/pull/ 1 2 6

Slide 47

Slide 47 text

エントリーポイントを1から読む Kubernetesではコアコンポーネントだけで下記のようなプログラム 
 が存在します ▶ Kubelet ▶ Kube-proxy ▶ Kube API Server ▶ Kube Scheduler ▶ Kube Controller Manager ▶ Cloud Controller Manager これらを1から読んでいくのもやり⽅の⼀つ

Slide 48

Slide 48 text

1からプログラムを読む 1からプログラムを読むのは結構⼤変だけど、1度読むと全体像が頭に⼊る し、ほとんどの箇所は軽くは⽬を通していることになるので中でどういった 処理を⾏っているのかがなんとなく覚えてられるようになる Kubernetesの処理で分からない箇所とか、エラーで詰まった際にあたりがつ けやすくなる

Slide 49

Slide 49 text

著者の場合読んだ内容を 
 技術同⼈誌で出したりスライドで発表してたりする

Slide 50

Slide 50 text

Kubernetes本体以外のアプリケーション達

Slide 51

Slide 51 text

CSI Driver Kubernetesでボリュームを使うプラグインとしてCSI Driverがあります ▶ Kubernetesと連携してドライバーを動作させるためのサイドカーが kubernetes-csi orgにあります ▶ CSI Driver実装の⼀覧についてはこちらから探すことができます CSI Driverについては「CSI⼊⾨」というセッションで以前発表してるので、 気になる⽅はこちらも参考にしてください

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

kubeadm Kubernetesコミュニティが提供するKubernetesクラスター構築ツール Kubernetesのアーキテクチャを学ぶという⽬的とは違うかもしれないです が、Kubernetes Hard WayをやらなくてもKubernetesクラスターの構築プロ セスを学べるかも!? kubeadmについては「kubeadmに学 ぶ クラスター構築」というセッション でクラスター構築までの流れについて発表してるので、気になる⽅はこちら も参考にしてください

Slide 54

Slide 54 text

kubeadmは下記のようにクラスター構築処理が分割されている

Slide 55

Slide 55 text

Metrics Server Metrics Serverはnode/podのメトリクスをKubernetes APIとして公開できるようになる アプリケーション KubernetesのHPA/VPAを利⽤するためのデータソースとして利⽤される他、kubectl topコマンドを通してメトリクスデータを⾒ることができるようになる 拡張API Serverという仕組みを使っており、拡張API Serverの仕組みを学ぶのに最適かも Metrics Serverについては「Metrics Server」というセッションで仕組みについて発表し てるので、気になる⽅はこちらも参考にしてください

Slide 56

Slide 56 text

Metrics Serverの全体像

Slide 57

Slide 57 text

Accuate サイボウズ社が公開しているOSSで、ソフトマルチテナンシー向けのテナン ト管理を⾏うためのKubernetes Operator アプリケーションサイズもそこまで⼤きくなく、kubebuilderを使って実装 されたKubernetes Operatorの実装例として学ぶには最適かも kubeadmについては「Accurate で 始めるKubernetesのマルチテナント管 理」というセッションで発表してるので、気になる⽅はこちらも参考にして ください

Slide 58

Slide 58 text

Kubernetesコミュニティに参加しよう

Slide 59

Slide 59 text

Kubernetesコミュニティ Kubernetesコミュニティについて知っておくと、いざというときに質問でき たりコントリビューションのネタ探しにもなることがあるので便利 参加するのはSlackに⼊るだけ: https://slack.k 8 s.io/ 下記のような⽇本語のコミュニティも存在するので、気軽に参加しよう ▶ #jp-users ▶ #jp-events ▶ #jp-dev ▶ #jp-users-novice

Slide 60

Slide 60 text

Special Interest Group(SIG) Kubernetesコミュニティは基本SIGと呼ばれる単位で分かれて活動している ▶ sig-docs: Kubernetesドキュメントやその翻訳などを管理 ▶ sig-node: Kubeletなどノードに関するものを管理 ▶ sig-cloudprovider: Kubernetesの実⾏基盤との連携機能周りを管理 ▶ sig-storage: CSIなどストレージに関するものを管理 ▶ Etc …

Slide 61

Slide 61 text

Working Group(WGs) sigで管理しきれないものについてはWorking Groupで管理 ▶ wg-lts: Kubernetesの⻑期サポートに関するグループ ▶ wg-structured-logging: 構造化ロギングに関するグループ ▶ wg-data-protection: データ保護に関するグループ ▶ etc …

Slide 62

Slide 62 text

Kubernetesコミュニティに関する説明は 
 「Intermediate Contributor Workshop」がわかりやすいかも https://www.youtube.com/watch?v=Ayo 5 w-CSmP 0

Slide 63

Slide 63 text

コミュニティの詳細 Kubernetesコミュニティの詳細について知りたい場合は 
 kubernetes/community にアクセスすると調べることができます ▶ どんなSIGがあるのか? ▶ WGについては? ▶ いつどんなミーティングをしているのか? ▶ SIGの主な構成メンバーについて ▶ SIGごとの開発をスケジュールについて

Slide 64

Slide 64 text

まとめ

Slide 65

Slide 65 text

まとめ ▶ ザックリと1からKubernetesのソースコードに⼊るまでに知っておいた⽅が良いことにつ いて紹介しました ▶ ソースコードを読むのはそこそこコストが掛かるので、やる⽬的は⼈それぞれですが、何 か疑問が出たときに「気軽にソースコードから調べる」という選択肢が増やせると良いな と思っています

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

画像引⽤元 ▶ https://github.com/kubernetes/community/tree/master/icons ▶ https://github.com/kubernetes/kubernetes/tree/master/logo ▶ https://github.com/cncf/artwork/tree/master/projects/kubernetes ▶ https://github.com/kubernetes/kubeadm/tree/main/logos

Slide 68

Slide 68 text

Thanks / Question? ▶ @bells 1 7 ▶ Slide: https://speakerdeck.com/bells 1 7 ▶ @bells 1 7 _