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
930
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
970
ISUCON で使えるツールを作った
shotakitazawa
0
1.2k
CloudNative Days を支える CI/CD ワークフローの変遷
shotakitazawa
2
1.7k
OpenFlow について
shotakitazawa
0
67
Spinnaker で Blue-Green Deployment やってみた
shotakitazawa
1
1.3k
Other Decks in Technology
See All in Technology
SSMRunbook作成の勘所_20241120
koichiotomo
2
130
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
250
VideoMamba: State Space Model for Efficient Video Understanding
chou500
0
190
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
410
第1回 国土交通省 データコンペ参加者向け勉強会③- Snowflake x estie編 -
estie
0
130
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
fujiwara3
8
870
Adopting Jetpack Compose in Your Existing Project - GDG DevFest Bangkok 2024
akexorcist
0
110
B2B SaaSから見た最近のC#/.NETの進化
sansantech
PRO
0
750
EventHub Startup CTO of the year 2024 ピッチ資料
eventhub
0
110
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
530
BLADE: An Attempt to Automate Penetration Testing Using Autonomous AI Agents
bbrbbq
0
300
Platform Engineering for Software Developers and Architects
syntasso
1
520
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
89
GitHub's CSS Performance
jonrohan
1030
460k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
The Cost Of JavaScript in 2023
addyosmani
45
6.7k
Code Review Best Practice
trishagee
64
17k
For a Future-Friendly Web
brad_frost
175
9.4k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Agile that works and the tools we love
rasmusluckow
327
21k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
A designer walks into a library…
pauljervisheath
203
24k
Writing Fast Ruby
sferik
627
61k
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