Slide 1

Slide 1 text

Kubernetes で Pod が 出来るまで

Slide 2

Slide 2 text

自己紹介 北澤 祥太 Twitter: かなた (@kanatakita) H31 (R1) 入社 2 年目 趣味: ラーメン・スノボ・自宅鯖構築 学生の頃: ISUCON や ICTSC に参加してました 最近: 大学の同期とライブ配信サービスを作り始めました ここ一週間 Civ6 に生活リズムをぶっ壊された

Slide 3

Slide 3 text

この発表のスコープ Docker / Kubernetes をなんとなく知ってる人に対して、 一体 Kubernetes の何が良いのか を知ってもらう 話すこと ● Kubernetes のアーキテクチャ ● Kubernetes のリソース管理 (Reconciliation Loop) 話さないこと ● Container (high-level / low-level) Runtime ● Kubernetes Networking ● Kubernetes 運用 Tips ● etc.

Slide 4

Slide 4 text

Kubernetes (K8s) ● コンテナオーケストレーションツール ○ コンテナを実行する場所の決定 ○ コンテナ間やクラスタ外部との通信 ○ コンテナの死活監視・セルフヒーリング ○ etc. 上記を実現する特徴 ● Declarative (宣言的) なリソース管理 ● Reconciliation Loop (調停ループ) いい感じにやる

Slide 5

Slide 5 text

オーケストレーションを (超雑に) 理解する Nodeが複数台 ▷ 冗長性 ▷ スケールアウトする ▷ ... Nodeが1台 ▷ 物理マシンが単一障害点 ▷ スケールアウトしない ▷ ...

Slide 6

Slide 6 text

コンテナを生成する Kubernetes リソース マニフェストファイルにリソースの状態を宣言して Kubernetes に適用すると 様々な “実体” が生成される ● コンテナ という “実体” を生成するリソース ● Pod ● ReplicaSet ● Deployment ● (Job, CronJob) manifest.yaml

Slide 7

Slide 7 text

Pod Apache 2.2 Apache 2.2 の Podくれ ✔ コンテナを適当なNode上で動作 ➢ コンテナを管理する リソース 管理者

Slide 8

Slide 8 text

Pod の数を増やしたい (悪い例) Apache 2.2 Apache 2.2 の Podを2個くれ ➢ コンテナを管理する リソース 管理者 Apache 2.2

Slide 9

Slide 9 text

ReplicaSet 管理者 ➢ Podの複数管理を行うリ ソース Apache 2.2 の ReplicaSet を Replica数2でくれ Apache 2.2 ReplicaSet Apache 2.2 Apache 2.2 ✔ スケールアウトする

Slide 10

Slide 10 text

ReplicaSet 管理者 ➢ Podの複数管理を行うリ ソース Apache 2.2 の ReplicaSet を Replica数2でくれ Apache 2.2 ReplicaSet Apache 2.2 Apache 2.2 ✔ Nodeに障害があってもオートヒーリングする Apache 2.2

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Deployment 管理者 Apache 2.2 ReplicaSet Apache 2.4 Apache 2.4 ReplicaSet Apache Deployment Apache Deployment を更新 ✔ ローリングアップデート 作成 Apache 2.2 Apache 2.2 削除

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Declarative vs Imperative なってほしい状態を適用する  だけ 逐一クラスタの状態を意識して   命令を記述 冪等性を開発者が担保   ① ② ③ desired state

Slide 15

Slide 15 text

Declarative vs Imperative (余談) なってほしい状態を適用する  だけ 逐一クラスタの状態を意識して   命令を記述 冪等性を開発者が担保   ① ② ③ desired state

Slide 16

Slide 16 text

この時Kubernetes内部で何が起こってる?

Slide 17

Slide 17 text

ハイレベルアーキテクチャ etcd kube-apiserver kubelet kube-proxy CRI Kubernetes Master Kubernetes Node kubectl manifest.yaml http/https kube-controller- manager kube-scheduler cloud-controller -manager

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

マニフェスト適用〜コンテナが動作するまで 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 ②

Slide 20

Slide 20 text

マニフェスト適用〜コンテナが動作するまで 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 ②

Slide 21

Slide 21 text

マニフェスト適用〜コンテナが動作するまで 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! ① ②

Slide 22

Slide 22 text

マニフェスト適用〜コンテナが動作するまで 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

Slide 23

Slide 23 text

Reconciliation Loop (調停ループ) ● Kubernetes の各コンポーネントが マニフェストを元に自立して動作 ○ ≠ kickされること契機で動作 ● 以下の処理を繰り返すだけ ○ current state を観測する ○ desired state をオブジェクトから取得する ○ current state から desired state への差分を 取得し、その状態になるよう処理を実行する 各コンポーネントが Reconciliation Loop に基づいて動作することで Declarative (あるべき状態を定義すると全てその状態になる) な管理が実現

Slide 24

Slide 24 text

ちなみに ① : 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 オブジェクトの 情報を元に処理を実行

Slide 25

Slide 25 text

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 リソース (とその他諸々) をクラスタに適用

Slide 26

Slide 26 text

ちなみに ② : 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 で管理

Slide 27

Slide 27 text

まとめ Kubernetes はいいぞ

Slide 28

Slide 28 text

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