Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes で Pod ができるまで

Kubernetes で Pod ができるまで

2020/05 Tech Night (社内勉強会) での発表資料です

Cb17938137021ead2656d0fe58b7c7b1?s=128

kanata

May 29, 2020
Tweet

More Decks by kanata

Other Decks in Technology

Transcript

  1. Kubernetes で Pod が 出来るまで

  2. 自己紹介 北澤 祥太 Twitter: かなた (@kanatakita) H31 (R1) 入社 2

    年目 趣味: ラーメン・スノボ・自宅鯖構築 学生の頃: ISUCON や ICTSC に参加してました 最近: 大学の同期とライブ配信サービスを作り始めました ここ一週間 Civ6 に生活リズムをぶっ壊された
  3. この発表のスコープ Docker / Kubernetes をなんとなく知ってる人に対して、 一体 Kubernetes の何が良いのか を知ってもらう 話すこと

    • Kubernetes のアーキテクチャ • Kubernetes のリソース管理 (Reconciliation Loop) 話さないこと • Container (high-level / low-level) Runtime • Kubernetes Networking • Kubernetes 運用 Tips • etc.
  4. Kubernetes (K8s) • コンテナオーケストレーションツール ◦ コンテナを実行する場所の決定 ◦ コンテナ間やクラスタ外部との通信 ◦ コンテナの死活監視・セルフヒーリング

    ◦ etc. 上記を実現する特徴 • Declarative (宣言的) なリソース管理 • Reconciliation Loop (調停ループ) いい感じにやる
  5. オーケストレーションを (超雑に) 理解する Nodeが複数台 ▷ 冗長性 ▷ スケールアウトする ▷ ...

    Nodeが1台 ▷ 物理マシンが単一障害点 ▷ スケールアウトしない ▷ ...
  6. コンテナを生成する Kubernetes リソース マニフェストファイルにリソースの状態を宣言して Kubernetes に適用すると 様々な “実体” が生成される •

    コンテナ という “実体” を生成するリソース • Pod • ReplicaSet • Deployment • (Job, CronJob) manifest.yaml
  7. Pod Apache 2.2 Apache 2.2 の Podくれ ✔ コンテナを適当なNode上で動作 ➢

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

    コンテナを管理する リソース 管理者 Apache 2.2
  9. ReplicaSet 管理者 ➢ Podの複数管理を行うリ ソース Apache 2.2 の ReplicaSet を

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

    Replica数2でくれ Apache 2.2 ReplicaSet Apache 2.2 Apache 2.2 ✔ Nodeに障害があってもオートヒーリングする Apache 2.2
  11. 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
  12. Deployment 管理者 Apache 2.2 ReplicaSet Apache 2.4 Apache 2.4 ReplicaSet

    Apache Deployment Apache Deployment を更新 ✔ ローリングアップデート 作成 Apache 2.2 Apache 2.2 削除
  13. 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
  14. Declarative vs Imperative なってほしい状態を適用する  だけ 逐一クラスタの状態を意識して   命令を記述 冪等性を開発者が担保  

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

      ① ② ③ desired state
  16. この時Kubernetes内部で何が起こってる?

  17. ハイレベルアーキテクチャ etcd kube-apiserver kubelet kube-proxy CRI Kubernetes Master Kubernetes Node

    kubectl manifest.yaml http/https kube-controller- manager kube-scheduler cloud-controller -manager
  18. 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
  19. マニフェスト適用〜コンテナが動作するまで 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 ②
  20. マニフェスト適用〜コンテナが動作するまで 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 ②
  21. マニフェスト適用〜コンテナが動作するまで 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! ① ②
  22. マニフェスト適用〜コンテナが動作するまで 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
  23. Reconciliation Loop (調停ループ) • Kubernetes の各コンポーネントが マニフェストを元に自立して動作 ◦ ≠ kickされること契機で動作

    • 以下の処理を繰り返すだけ ◦ current state を観測する ◦ desired state をオブジェクトから取得する ◦ current state から desired state への差分を 取得し、その状態になるよう処理を実行する 各コンポーネントが Reconciliation Loop に基づいて動作することで Declarative (あるべき状態を定義すると全てその状態になる) な管理が実現
  24. ちなみに ① : 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 オブジェクトの 情報を元に処理を実行
  25. 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 リソース (とその他諸々) をクラスタに適用
  26. ちなみに ② : 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 で管理
  27. まとめ Kubernetes はいいぞ

  28. 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