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
990
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
1k
ISUCON で使えるツールを作った
shotakitazawa
0
1.3k
CloudNative Days を支える CI/CD ワークフローの変遷
shotakitazawa
2
1.8k
OpenFlow について
shotakitazawa
0
68
Spinnaker で Blue-Green Deployment やってみた
shotakitazawa
1
1.3k
Other Decks in Technology
See All in Technology
DevinでAI AWSエンジニア製造計画 序章 〜CDKを添えて〜/devin-load-to-aws-engineer
tomoki10
0
140
入門 PEAK Threat Hunting @SECCON
odorusatoshi
0
160
JAWS FESTA 2024「バスロケ」GPS×サーバーレスの開発と運用の舞台裏/jawsfesta2024-bus-gps-serverless
ma2shita
3
220
データベースの負荷を紐解く/untangle-the-database-load
emiki
2
520
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
hatena
0
260
EMConf JP 2025 懇親会LT / EMConf JP 2025 social gathering
sugamasao
2
200
Potential EM 制度を始めた理由、そして2年後にやめた理由 - EMConf JP 2025
hoyo
2
2.7k
日経のデータベース事業とElasticsearch
hinatades
PRO
0
240
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
2
390
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.6k
30→150人のエンジニア組織拡大に伴うアジャイル文化を醸成する役割と取り組みの変化
nagata03
0
180
Two Blades, One Journey: Engineering While Managing
ohbarye
4
2k
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
990
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Adopting Sorbet at Scale
ufuk
74
9.2k
Building an army of robots
kneath
303
45k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Docker and Python
trallard
44
3.3k
Being A Developer After 40
akosma
89
590k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
260
The Language of Interfaces
destraynor
156
24k
A designer walks into a library…
pauljervisheath
205
24k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
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