Slide 1

Slide 1 text

Controllerを作ってみよう 
 ~ Kubernetes Controllerハン ズ オン ~ Kubernetes Wakaran Tokyo # 2 ( 2 0 2 3 / 0 1 / 3 0 ) @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のSDK ”client-go” を使⽤して簡単なKubernetes Controllerを⾃作します ▶ kubebuilderなどを使⽤せず、client-goを直接使⽤することでコントローラーについての イメージを掴むことを主な⽬的としてハンズオンをやっていきたいと思います 
 (コントローラーを書くだけならkubebuilderを使った⽅が楽だけど⾊々とラップされてる のでコントローラーの動作イメージを掴むことを主⽬的にする場合 client-go を直接使った ⽅が良いかなということで今回は client-go を使⽤するパターンを採⽤してます) ▶ kindを使⽤して構築したKubernetesクラスター上に⾃作したコントローラーをデプロイ 
 して動作を確認できるようにしましょう ▶ client-go はGo⾔語で実装されているため、Go⾔語の実⾏環境も必要です

Slide 4

Slide 4 text

作成するコントローラー ▶ Deploymentに`sample-controller: “True”`アノテーションを設定するだけのシンプルな コントローラーです ▶ Kubernetesのコントローラー実装を読むために必要な内容を最低限掴むことが⽬的なので ハンズオンではシンプルなコントローラーを実装してみましょう ▶ 参考実装はこちら: https://github.com/bells 1 7 /k 8 s-controller-example + ↑のリポジトリを使⽤する場合vscode+devcontainerがセットアップされていればすぐ に動かして試すことができます + こちらを参考にしてもOKです https://github.com/kubernetes/sample-controller

Slide 5

Slide 5 text

⾃作する前にコントローラーの基礎知識について

Slide 6

Slide 6 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 まずはKubernetesのアーキテクチャ全体像から

Slide 7

Slide 7 text

コントローラーのイメージはこんなん

Slide 8

Slide 8 text

コントローラーとOperator ▶ コントローラー: Kubernetesのリソースなどを元に宣⾔された状態を実現する仕組み ▶ Operator: コントローラーとCRDなどを組み合わせて独⾃の機能を宣⾔的APIで実現する 
 ⽅法 みたいな感じかなと個⼈的に解釈してます (明確な定義が書いてあるの知ってる⼈いたら教えて)

Slide 9

Slide 9 text

https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg client-go を使ったコントローラーのアーキテクチャ

Slide 10

Slide 10 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 kube-api-server以外のConponentは Controllerを中⼼として機能を実現している

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

API Serverがリソースの作成などのエンドポイントを提供 今回作成したDeploymentやServiceの場合は図の”API Server”によって処理が⾏われる

Slide 13

Slide 13 text

controller-managerが⼤量のコントローラーを実⾏制御

Slide 14

Slide 14 text

スケジューラーもコントローラーのように 各Podのスケジューリングを実⾏ https://kubernetes.io/images/docs/scheduling-framework-extensions.png

Slide 15

Slide 15 text

Kubeletも内部でコントローラー(的なものを)を駆使してPodを実⾏

Slide 16

Slide 16 text

https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg client-go を使ったコントローラーのアーキテクチャ

Slide 17

Slide 17 text

client-goの主要ライブラリ ▶ Re fl ector: 指定リソースをList & Watchでデータ取得&取得後の変更監視 
 ~ Delta FIFO Queue にデータを渡す ▶ Informer: Delta FIFO Queue から取り出したデータを Indexer にキャッシュ 
 & 登録されたイベントハンドラーを呼び出し ▶ Indexer: キャッシュされたデータの管理(ローカルキャッシュ) ▶ Workqueue: イベントハンドラーからデータをキューイングするためのキュー 
 コントローラーの調整ループを管理するために使⽤

Slide 18

Slide 18 text

基本的な知識は以上

Slide 19

Slide 19 text

ということでコントローラーを作っていきましょう

Slide 20

Slide 20 text

作成するコントローラー ▶ Deploymentに`sample-controller: “True”`アノテーションを設定するだけのシンプルな コントローラーです ▶ コントローラーのイメージを掴むために必要な内容を⾃分で書いてみることが⽬的なので ハンズオンではシンプルなコントローラーを実装してみましょう ▶ 参考実装はこちら: https://github.com/bells 1 7 /k 8 s-controller-example ▶ こちらを参考にしてもOKです: https://github.com/kubernetes/sample-controller ▶ 「⾃分で実装するのが難しそう」という⽅は↑を眺めてみるのでもOK

Slide 21

Slide 21 text

終わって時間が余った⽅は ▶ Deploymentに加えて、ReplicaSetとPodにも`sample-controller: “True”`アノテーション を設定できるようにしてみてください ▶ Kubernetes本体で実装されているコントローラー実装を読んでみてください + clusterrole-aggregation-controller ▶ コントローラー実装にあたって使⽤していた client-go のライブラリ実装を 
 読んでみてください + Re fl ector + Informer + Indexer + Delta FIFO Queue + Workqueue

Slide 22

Slide 22 text

ハンズオン ~ 20:25まで

Slide 23

Slide 23 text

どうだったでしょうか?

Slide 24

Slide 24 text

Kubernetesのコントローラーが書ける & 読めると ▶ Operatorを⾃作したりとKubernetesをプラットフォーム基盤として拡張する ▶ Kubernetesのコードを読むのにも役⽴つ ▶ 宣⾔的APIの実態をコードレベルで理解することで考え⽅として普段の開発でも活きる などなどそれなりに⾊々と良いことがあるかもしれません

Slide 25

Slide 25 text

NEXT ACTIONS ▶ kubebuilderでOperator作成を試してみる ▶ Kubernetesのコントローラーの実装を読んでみる ▶ client-goやkubebuilderで実装されたOperatorのOSSにコントリビューションしてみる ▶ Kubernetesにコントリビューションをしてみる このあたりにチャレンジしてみても良いかも!

Slide 26

Slide 26 text

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