Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Kubernetesのコントローラのプログラミングモデル
Search
Satoru Takeuchi
PRO
August 30, 2022
Technology
210
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kubernetesのコントローラのプログラミングモデル
以下動画のテキストです。
https://youtu.be/0okzTgJ7-vs
Satoru Takeuchi
PRO
August 30, 2022
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
119-多機能ファイルシステムBtrfs_のコピー.pdf
sat
PRO
1
70
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
95
あなたの知らないバージョン命名規則
sat
PRO
3
900
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
64
Machine Check Exception
sat
PRO
2
66
バイナリダンプの模様を読む
sat
PRO
0
89
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
89
114-ファイルのshallow_copy.pdf
sat
PRO
2
58
113-Btrfsのスナップショット.pdf
sat
PRO
0
40
Other Decks in Technology
See All in Technology
AIによるクリエイティブ生成を行う上での試行錯誤
plaidtech
PRO
0
160
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
3
560
2026_devsumi_ozono.pdf
o3
3
520
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
nenonaninu
1
480
データ_AIの事業の勝敗をわけるもの
nek0128
1
460
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
190
AIエージェントの一手は 誰も見ていない - Falco拡張OSS「Prempti」とeBPFで サーバーレス実行基盤を二層防御する
keitah
0
240
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
0
130
SREは、MCPとAutopilotをこう使え!
kazumax55
3
910
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
1
2.4k
The Knowledge Spine: A Machine-Executable Ontology for Governed Marketing Activation
vananth22
0
110
C#コードの結合を可視化する Roslyn解析による設計改善と リファクタリング判断
dora56
0
170
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
4
510
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
WCS-LA-2024
lcolladotor
0
830
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Building Applications with DynamoDB
mza
96
7.2k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Transcript
kubernetesのコントローラの プログラミングモデル Satoru Takeuchi twitter: satoru_takeuchi 1
Kubernetesとは • 分散コンテナアプリ実行基盤 • 管理者はマニフェストと呼ばれるYAMLを書いて以下コマンド実行 ◦ kubectl apply app.yaml ◦
マニフェストは分散KVS etcdの中に「リソース」として永続化される • K8sはetcd内のリソースたちが定義する状態になるようにアプリを維持 2 node node アプリ アプリ アプリ アプリ Kubernetes etcd(分散kvs) リソース リソース 監視 あるべき状態にする Kubernetesクラスタ
アプリに対応するリソース • Podリソース: アプリに対応するPodを管理 ◦ アプリを構成する1個以上のコンテナを記述する • ReplicaSetリソース: アプリの冗長度を管理 ◦
アプリの冗長度を表現する replicasフィールドがある ◦ “replicas: 3”なら3冗長を保つ • Deploymentリソース ◦ アプリのバージョン管理 ◦ 状態変化を記憶している ◦ たとえば過去のバージョンにロールバックできる 3
コントローラ • リソース監視&クラスタの状態変化をするプログラムをコントローラと呼ぶ • 1つのリソースごとにコントローラが存在する • 一つのバイナリ内に複数のコントローラを含むことも ◦ Deployment, ReplicaSetなどのコントローラは
controller-managerという一つのプログラムにまと まっている • カスタムリソースはカスタムコントローラが担当 4 node node アプリ アプリ アプリ アプリ Kubernetes etcd(分散kvs) リソース リソース 監視 あるべき状態にする Kubernetesクラスタ コントローラ コントローラ コントローラ
アプリのDeploymentのマニフェストをapplyすると… • Deploymentリソースができる 5 node node Kubernetes etcd Deployment リソース
replicas: 2 つくる Kubernetesクラスタ
Deploymentリソースができると… • ReplicaSetリソースができる 6 node node Kubernetes etcd ReplicaSet リソース
replicas: 2 見る Kubernetesクラスタ Deployment コントローラ Deployment リソース replicas: 2 つくる
ReplicaSetリソースができると… replicasフィールドの数だけのPodリソースができる 7 node node Kubernetes etcd ReplicaSet リソース replicas:
2 Kubernetesクラスタ Pod リソース Pod リソース つくる ReplicaSet コントローラ 見る Deployment リソース replicas: 2
Podリソースができると… • node上にPodができる! ◦ Podリソースの監視とnode割り当てはkube-schedulerという別のプログラムが担当 8 node node Kubernetes etcd
ReplicaSet リソース replicas: 2 見る つくる Kubernetesクラスタ Pod リソース Pod リソース Pod Pod Deployment リソース replicas: 2
コントローラのプログラミングモデル • やること ◦ 自分の担当するリソースを監視 ◦ 担当リソースに変更があれば動き出す ◦ あるべき姿にするための処理をする •
例: Markdown viewコントローラ ◦ ユーザが定義したMarkdownをレンダリングしたものをブラウザで見られる ◦ レンダリングにはmdBookを使う ▪ https://github.com/rust-lang/mdBook ◦ 資料: つくって学ぶKubebuilder ▪ https://zoetrope.github.io/kubebuilder-training/ 9
前提知識 • これまで紹介していなかったリソース ◦ ConfigMap: Podにデータを読み込ませるのに使う ◦ Service: Kubernetesアプリをユーザから使わせるのに使う ▪
たとえばendpointが入っている • ユーザ独自リソースも作れる ◦ カスタムリソース: 独自に作ったリソース ◦ カスタムコントローラ : カスタムリソースを担当するコントローラ 10
Markdown viewアプリのあるべき姿 ここに書かれたendpointに ブラウザからアクセスすると レンダリング済markdownが 見られる Markdownのデータが入る 11
Markdown viewコントローラのアーキテクチャ • https://zoetrope.github.io/kubebuilder-training/introduction/sample.html 1 2 3 4 apiVersion: view.zoetrope.github.io/v1
kind: MarkdownView metadata: name: markdownview-sample spec: markdowns: SUMMARY.md: | # Summary - [Page1](page1.md) page1.md: | # Page 1 一ページ目のコンテンツです。 replicas: 2 viewerImage: "peaceiris/mdbook:latest" 12
Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {
CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } 13
Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {
CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } ConfigMapがないというevent発生 14
Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {
CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } Deploymentがないというevent発生 15
Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {
CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } Serviceがないというevent発生 16
Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {
CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } こうではない 17
コントローラのプログラミングモデル • 一回起動してからreconcilerという処理が頭から終わりまで走りきる ◦ 「起動したらイベントの種類に応じて処理をする」ではない • 一連の処理をreconciliation loopと呼ぶ ◦ 鍵は「冪等性」
18
本物のreconciliation loopの簡略版 func (r *MarkdownViewReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result,
error) { … var mdView viewv1.MarkdownView r.Get(ctx, req.NamespacedName, &mdView) … r.reconcileConfigMap(ctx, mdView) … r.reconcileDeployment(ctx, mdView) … r.reconcileService(ctx, mdView) … } https://github.com/zoetrope/kubebuilder-training/blob/main/codes/40_reconcile/controllers/markdownview_controller.go#L63-L104 19
ConfigMapのreconciliation loop(の省略版) func (r *MarkdownViewReconciler) reconcileConfigMap(ctx context.Context, mdView viewv1.MarkdownView) error
{ … ctrl.CreateOrUpdate(ctx, r.Client, cm, func() error { if cm.Data == nil { cm.Data = make(map[string]string) } for name, content := range mdView.Spec.Markdowns { cm.Data[name] = content } return nil }) … } https://github.com/zoetrope/kubebuilder-training/blob/24bb3d86c5459dbc086f241069003a39a0d8c1af/codes/40_reconcile/controllers/markdownview_controller.go#L109-L134 20
まとめ • Kubernetesはシステムをユーザが決めた「あるべき姿」に保つ • あるべき姿を記述するためにリソースという概念がある • クラスタの現状とあるべき姿のギャップを埋める処理をするプログラムを「コントロー ラと呼ぶ」 • コントローラはあるべき姿を保つために冪等性を保持するよう動く
21