Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kubernetes で Pod ができるまで
Search
kanata
May 29, 2020
Technology
3
1.1k
Kubernetes で Pod ができるまで
2020/05 Tech Night (社内勉強会) での発表資料です
kanata
May 29, 2020
Tweet
Share
More Decks by kanata
See All by kanata
今 SLI/SLO の監視をするなら Sloth が良さそうという話
shotakitazawa
2
1.2k
ISUCON で使えるツールを作った
shotakitazawa
0
1.4k
CloudNative Days を支える CI/CD ワークフローの変遷
shotakitazawa
2
1.9k
OpenFlow について
shotakitazawa
0
82
Spinnaker で Blue-Green Deployment やってみた
shotakitazawa
1
1.4k
Other Decks in Technology
See All in Technology
ステートレスなLLMでステートフルなAI agentを作る - YAPC::Fukuoka 2025
gfx
8
1.3k
はじめての OSS コントリビューション 〜小さな PR が世界を変える〜
chiroito
4
320
今、MySQLのバックアップを作り直すとしたら何がどう良いのかを考える旅
yoku0825
1
380
仕様は“書く”より“語る” - 分断を超えたチーム開発の実践 / 20251115 Naoki Takahashi
shift_evolve
PRO
1
910
AIを前提に、業務を”再構築”せよ IVRyの9ヶ月にわたる挑戦と未来の働き方 (BTCONJP2025)
yueda256
1
730
大規模モノレポの秩序管理 失速しない多言語化フロントエンドの運用 / JSConf JP 2025
shoota
0
130
JavaScript パーサーに using 対応をする過程で与えたエコシステムへの影響
baseballyama
1
100
【M3】攻めのセキュリティの実践!プロアクティブなセキュリティ対策の実践事例
axelmizu
0
160
ソフトウェア開発現代史: 55%が変化に備えていない現実 ─ AI支援型開発時代のReboot Japan #agilejapan
takabow
7
4.2k
『HOWはWHY WHATで判断せよ』 〜『ドメイン駆動設計をはじめよう』の読了報告と、本質への探求〜
panda728
PRO
5
1.8k
生成AIではじめるテスト駆動開発
puku0x
0
110
Claude Code 10連ガチャ
uhyo
3
690
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
186
22k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
118
20k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
It's Worth the Effort
3n
187
28k
How STYLIGHT went responsive
nonsquared
100
5.9k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
RailsConf 2023
tenderlove
30
1.3k
Docker and Python
trallard
46
3.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Transcript
Kubernetes で Pod が 出来るまで
自己紹介 北澤 祥太 Twitter: かなた (@kanatakita) H31 (R1) 入社 2
年目 趣味: ラーメン・スノボ・自宅鯖構築 学生の頃: ISUCON や ICTSC に参加してました 最近: 大学の同期とライブ配信サービスを作り始めました ここ一週間 Civ6 に生活リズムをぶっ壊された
この発表のスコープ Docker / Kubernetes をなんとなく知ってる人に対して、 一体 Kubernetes の何が良いのか を知ってもらう 話すこと
• Kubernetes のアーキテクチャ • Kubernetes のリソース管理 (Reconciliation Loop) 話さないこと • Container (high-level / low-level) Runtime • Kubernetes Networking • Kubernetes 運用 Tips • etc.
Kubernetes (K8s) • コンテナオーケストレーションツール ◦ コンテナを実行する場所の決定 ◦ コンテナ間やクラスタ外部との通信 ◦ コンテナの死活監視・セルフヒーリング
◦ etc. 上記を実現する特徴 • Declarative (宣言的) なリソース管理 • Reconciliation Loop (調停ループ) いい感じにやる
オーケストレーションを (超雑に) 理解する Nodeが複数台 ▷ 冗長性 ▷ スケールアウトする ▷ ...
Nodeが1台 ▷ 物理マシンが単一障害点 ▷ スケールアウトしない ▷ ...
コンテナを生成する Kubernetes リソース マニフェストファイルにリソースの状態を宣言して Kubernetes に適用すると 様々な “実体” が生成される •
コンテナ という “実体” を生成するリソース • Pod • ReplicaSet • Deployment • (Job, CronJob) manifest.yaml
Pod Apache 2.2 Apache 2.2 の Podくれ ✔ コンテナを適当なNode上で動作 ➢
コンテナを管理する リソース 管理者
Pod の数を増やしたい (悪い例) Apache 2.2 Apache 2.2 の Podを2個くれ ➢
コンテナを管理する リソース 管理者 Apache 2.2
ReplicaSet 管理者 ➢ Podの複数管理を行うリ ソース Apache 2.2 の ReplicaSet を
Replica数2でくれ Apache 2.2 ReplicaSet Apache 2.2 Apache 2.2 ✔ スケールアウトする
ReplicaSet 管理者 ➢ Podの複数管理を行うリ ソース Apache 2.2 の ReplicaSet を
Replica数2でくれ Apache 2.2 ReplicaSet Apache 2.2 Apache 2.2 ✔ Nodeに障害があってもオートヒーリングする Apache 2.2
Pod のバージョンを上げたい (悪い例) 管理者 Apache 2.2 ReplicaSet Apache 2.4 Apache
2.4のRS作れ Apache 2.2のRS消せ ① ③ Apache 2.4 ReplicaSet ② Apache 2.2 Apache 2.2
Deployment 管理者 Apache 2.2 ReplicaSet Apache 2.4 Apache 2.4 ReplicaSet
Apache Deployment Apache Deployment を更新 ✔ ローリングアップデート 作成 Apache 2.2 Apache 2.2 削除
Declarative (宣言的) • 「あるべき状態」を宣言 ◦ マニフェストに書かれた Image の バージョンを書き換えてクラスタに適用 ◦
いい感じに Kubernetes が Pod を更新 ▪ Rolling Update ▪ Recreate 対義語: Imperative (命令的) Apache 2.2 ReplicaSet Apache 2.4 Apache 2.4 ReplicaSet Apache Deployment Apache 2.2 Apache 2.2
Declarative vs Imperative なってほしい状態を適用する だけ 逐一クラスタの状態を意識して 命令を記述 冪等性を開発者が担保
① ② ③ desired state
Declarative vs Imperative (余談) なってほしい状態を適用する だけ 逐一クラスタの状態を意識して 命令を記述 冪等性を開発者が担保
① ② ③ desired state
この時Kubernetes内部で何が起こってる?
ハイレベルアーキテクチャ etcd kube-apiserver kubelet kube-proxy CRI Kubernetes Master Kubernetes Node
kubectl manifest.yaml http/https kube-controller- manager kube-scheduler cloud-controller -manager
1. Deploymentリソースの適用 • kube-apiserver に対して POST • リクエストに対する Authn/Authz/AdmissionControl (今回は省略)
• リクエストをオブジェクトとして etcd に保存 ◦ リソース→クラス に対する オブジェクト→インスタンス etcd kube-apiserver Kubernetes Master kubectl apiVersion: apps/v1 kind: Deployment metadata: name: hoge ... マニフェスト適用〜コンテナが動作するまで Deployment/hoge
マニフェスト適用〜コンテナが動作するまで 2. Deployment オブジェクトから ReplicaSet オブジェクトの生成 ① kube-controller-manager 内の Deployment
Controller が kube-apiserver を watch ② Deployment “hoge” オブジェクトを検知した Deployment Controller は、name に random suffix を 付与して ReplicaSet リソースを適用 ③ リクエストをオブジェクトとして etcd に保存 etcd kube-apiserver kube-controller- manager Kubernetes Master Deployment/hoge ReplicaSet/hoge-fuga watch ③ new! ① Deployment Controller ②
マニフェスト適用〜コンテナが動作するまで 3. ReplicaSet リソースから Pod リソースの生成 ① kube-controller-manager 内の ReplicaSet
Controller が kube-apiserver を watch ② ReplicaSet “hoge-fuga” オブジェクトを検知した ReplicaSet Controller は、name に random suffix を 付与して Pod リソースを適用 ③ リクエストをオブジェクトとして etcd に保存 etcd kube-apiserver kube-controller- manager Kubernetes Master Deployment/hoge ReplicaSet/hoge-fuga Pod/hoge-fuga-piyo watch ③ new! ① ReplicaSet Controller ②
マニフェスト適用〜コンテナが動作するまで 4. Pod リソースの配置先 Node の決定 ① kube-scheduler が kube-apiserver
を watch ② Pod “hoge-fuga-piyo” オブジェクトを検知した kube-scheduler は Predicates (必須条件) と Priorities (優先条件) を元に適切なノードをスケジューリングし、 Binding という特殊なリソース (Pod 配置先 Node を 決定するリソース) を適用 ③ リクエストをオブジェクトとして etcd に保存 etcd kube-apiserver Kubernetes Master kube-scheduler watch Deployment/hoge ReplicaSet/hoge-fuga Pod/hoge-fuga-piyo Binding subresource ③ new! ① ②
マニフェスト適用〜コンテナが動作するまで etcd kube-apiserver kubelet CRI Kubernetes Master Kubernetes Node 5.
任意の Node でコンテナの実行 kubelet が kube-apiserver を watch metadata.nodeName に自身の Node 名が書かれている場合、 CRI 経由でコンテナを実行する CRI (Container Runtime Interface) kubelet とコンテナランタイムが通信するためのインタフェース規定、gRPC らしい Interface を満たすコンテナランタイムは何でも利用できる→ Docker, containerd, CRI-O, ... watch
Reconciliation Loop (調停ループ) • Kubernetes の各コンポーネントが マニフェストを元に自立して動作 ◦ ≠ kickされること契機で動作
• 以下の処理を繰り返すだけ ◦ current state を観測する ◦ desired state をオブジェクトから取得する ◦ current state から desired state への差分を 取得し、その状態になるよう処理を実行する 各コンポーネントが Reconciliation Loop に基づいて動作することで Declarative (あるべき状態を定義すると全てその状態になる) な管理が実現
ちなみに ① : Custom Resource • Kubernetes は標準のリソースに加えユーザ定義のリソースを作成可能 ◦ CustomResourceDefinition
リソースを用いる (リソースのユーザ定義を行うリソース) • 独自リソースを読むコントローラを実装すれば、Kubernetes API / Reconciliation Loop の仕組みに乗って様々な処理が可能 interface { Pod ReplicaSet Deployment MyResource } etcd kube-apiserver MyResource/hoge original Controller watch ① crd リソースで MyResource のスキーマ定義 ② MyResource リソースを適用 ③ MyResource オブジェクトが保存 ④ 自前 Controller で MyResource オブジェクトの 情報を元に処理を実行
Custom Resource 一例: バージョン管理 • Kubernetes は世代管理機能として標準で Rolling Update と
Recreate を Deployment リソースにて提供 • Argo Rollouts (https://github.com/argoproj/argo-rollouts ) ◦ 世代管理機能として Blue/Green Deployment や Canary Release を提供 ◦ Rollouts リソースの CRD と Argo Rollouts Controller を導入すれば動作する! ▪ インストールは以下のコマンドだけ もっといい感じ無いの・・・? kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f \ https://raw.githubusercontent.com/argoproj/argo-rollouts/v0.8.2/manifests/install.yaml CRD リソースと Controller 用の Deployment リソース (とその他諸々) をクラスタに適用
ちなみに ② : Operator Reconciliation Loop という概念は素晴らしいので Kubernetes クラスタの 外の世界にも適用させたい!
→ Operator の登場 interface { Pod ReplicaSet Deployment MyResource } etcd kube-apiserver MyResource/hoge original Controller watch ① crd リソースで MyResource のスキーマ定義 ② MyResource リソースを適用 ③ MyResource オブジェクトが保存 ④ 自前 Controller で MyResource オブジェクトの 情報を元に処理を実行 ※ 厳密な Controller と Operator の用語の区別はないっぽい ステートフルなアプリケーション用の Custom Controller = Operator という意見も? クラスタ外のリソースを Reconciliation Loop で管理
まとめ Kubernetes はいいぞ
Appendix: Kubernetes を完全に理解したい! • 自分で1からインストールしてクラスタを構築してみる ◦ https://github.com/kelseyhightower/kubernetes-the-hard-way 有名なやつ ◦ https://github.com/ShotaKitazawa/k8s-learning
チーム内勉強会用に作ったやつ • 建てた Kubernetes にアプリケーションを デプロイして運用してみる 1. SlackBot とかをコンテナ化して K8s に乗せてみる 2. CI/CD を整備する 3. 監視する 4. … • Custom Controller を実装したい ◦ オススメ本 (日本語版はこれしか無いかも?) https://www.amazon.co.jp/dp/4844378546 https://github.com/cncf/trailmap