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
980
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.7k
OpenFlow について
shotakitazawa
0
68
Spinnaker で Blue-Green Deployment やってみた
shotakitazawa
1
1.3k
Other Decks in Technology
See All in Technology
Nekko Cloud、 これまでとこれから ~学生サークルが作る、 小さなクラウド
logica0419
2
730
プロセス改善による品質向上事例
tomasagi
1
1.6k
データの品質が低いと何が困るのか
kzykmyzw
6
1k
日経電子版 x AIエージェントの可能性とAgentic RAGによって提案書生成を行う技術
masahiro_nishimi
1
290
Ask! NIKKEI RAG検索技術の深層
hotchpotch
13
2.8k
データ基盤の成長を加速させる:アイスタイルにおける挑戦と教訓
tsuda7
3
650
飲食店予約台帳を支えるインタラクティブ UI 設計と実装
siropaca
6
1.4k
2.5Dモデルのすべて
yu4u
2
610
Platform Engineeringは自由のめまい
nwiizo
4
1.9k
アジャイル開発とスクラム
araihara
0
160
室長と気ままに学ぶマイクロソフトのビジネスアプリケーションとビジネスプロセス
ryoheig0405
0
320
データ資産をシームレスに伝達するためのイベント駆動型アーキテクチャ
kakehashi
PRO
2
230
Featured
See All Featured
For a Future-Friendly Web
brad_frost
176
9.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Rails Girls Zürich Keynote
gr2m
94
13k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
We Have a Design System, Now What?
morganepeng
51
7.4k
How to train your dragon (web standard)
notwaldorf
90
5.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
A better future with KSS
kneath
238
17k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Become a Pro
speakerdeck
PRO
26
5.1k
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