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
68
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
93
あなたの知らないバージョン命名規則
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
88
114-ファイルのshallow_copy.pdf
sat
PRO
2
57
113-Btrfsのスナップショット.pdf
sat
PRO
0
40
Other Decks in Technology
See All in Technology
LLMに渡さなかった仕事
nanaism
0
560
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
1
400
Genieを崇めよ
kameitomohiro
0
160
新機種発売前に見直そう!端末移行で再ログインが要るアプリ・要らないアプリは何が違うのか 〜シームレスに再開できる設計と実装〜
zozotech
PRO
0
200
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
140
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
130
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
安心して変更できるWebフロントエンドの作り方
pirosikick
5
2.7k
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.3k
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
4
230
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
4 Signs Your Business is Dying
shpigford
187
23k
Prompt Engineering for Job Search
mfonobong
0
450
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Amusing Abliteration
ianozsvald
1
300
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
Marketing to machines
jonoalderson
1
5.8k
Producing Creativity
orderedlist
PRO
348
41k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Are puppies a ranking factor?
jonoalderson
2
3.9k
For a Future-Friendly Web
brad_frost
183
10k
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