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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
79
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
110
あなたの知らないバージョン命名規則
sat
PRO
3
920
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
74
Machine Check Exception
sat
PRO
2
71
バイナリダンプの模様を読む
sat
PRO
0
110
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
110
114-ファイルのshallow_copy.pdf
sat
PRO
2
62
113-Btrfsのスナップショット.pdf
sat
PRO
0
46
Other Decks in Technology
See All in Technology
CTO Night|NotionのAIエージェントとFDE
kzkhykw1991
0
100
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
120
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
870
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
380
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1.1k
事業成長とデータ活用を止めないためのマネジメントへ挑戦
hiracky16
0
390
AI時代のPRレビューにどう向き合うか?
kairim0
1
240
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
150
SAENM ~Jupyterで残すPoCの試行錯誤、未来の自分と仲間を助ける記録!~
terapyon
0
110
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
570
コンテナ運用におけるネットワーク・コンテナコストの削減方法/How to Reduce Network and Container Costs in Container Operations
masakiokuda
1
180
AI導入は済んだ。次は統制を作り替える番だ_AI×開発組織 Summit 2026
techtekt
PRO
0
220
Featured
See All Featured
A better future with KSS
kneath
240
18k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
We Are The Robots
honzajavorek
0
400
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
The agentic SEO stack - context over prompts
schlessera
0
970
Become a Pro
speakerdeck
PRO
31
6.3k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Making the Leap to Tech Lead
cromwellryan
135
10k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
The Cult of Friendly URLs
andyhume
79
7k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
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