CloudNative を学ぶにはまず Kind から始めよ #cndjp / Cloud Native Developer JP 13th

332f89cc697355902a817506b6995f2b?s=47 y_taka_23
November 28, 2019

CloudNative を学ぶにはまず Kind から始めよ #cndjp / Cloud Native Developer JP 13th

Cloud Native Developer JP 第 13 回 で使用したスライドです。

Kubernetes は学習コストが高いとよく言われます。その理由の一つとして、新しい機能や関連ツールが次々と登場するスピードと比較して、環境構築が大掛かりになりやすく、気になった機能をすぐに試すことが難しいという事情考えられます。

そこで今回は、Docker コンテナを利用してローカルにクラスタ構築するツール Kind(Kubernetes IN Docker)を紹介し、実際に Kubernetes v1.16 の新機能である Pod Topology Spread Constraints のデモを披露しました。

イベント概要:https://cnd.connpass.com/event/154414/

332f89cc697355902a817506b6995f2b?s=128

y_taka_23

November 28, 2019
Tweet

Transcript

  1. Cloud Native を学ぶには まず Kind より始めよ チェシャ猫 (@y_taka_23) Cloud Native

    Developers JP #13 (2019/11/28) #cndjp
  2. よくある思い込み 「初心者には学習コストが辛い」 #cndjp

  3. 現実 「初心者じゃなくても辛い」 #cndjp

  4. ここが辛いよ Kubernetes • そもそもシステムとして複雑 ◦ 非同期ベースの多数のコンポーネント • 周辺ツールを含め進化が速い ◦ 運用上のプラクティスも時代遅れになりがち

    • マネージドだと新機能の実験が難しい ◦ 最新バージョンがなかなか使えない ◦ Control Plane 周りの設定が触れない #cndjp
  5. 充分に Disposable かつ 充分に Configurable なクラスタ #cndjp

  6. Kind https://github.com/kubernetes-sigs/kind #cndjp

  7. クラスタ構築ツール Kind • マルチノードクラスタが構築可能 ◦ 他のツールはシングルノードのみ ◦ 複数のコンテナを立ち上げ Node と見なす

    • 内部的には kubeadm を呼び出し • k8s 本体の E2E テストでも使用 ◦ SIG Testing が開発を手動 ◦ 現在 v0.6.0、今後の継続的な開発に期待 #cndjp
  8. Physical Machine docker #cndjp

  9. Physical Machine docker kubelet containerd Container = Control Plane kubelet

    containerd etcd kube-apiserver kube-scheduler, etc Container = Worker Node #cndjp $ kind create cluster
  10. Physical Machine docker kubelet containerd pod pod pod Container =

    Control Plane kubelet containerd etcd kube-apiserver kube-scheduler, etc Container = Worker Node #cndjp $ kubectl apply
  11. コンテナによるマルチノード #cndjp

  12. コンテナ内で containerd が稼働 #cndjp

  13. 抜群のカスタマイズ性 • Control Plane の設定を変更可能 ◦ 内部で使用される kubeadm の設定が渡せる ◦

    マネージドでは手が出せないことが多い • K8s のバージョンが指定可能 ◦ 複数バージョンでのテストが簡単にできる • 手元でビルドした K8s も使用可能 ◦ Node 用イメージを作成するコマンドも用意 #cndjp
  14. Demo:Pod のトポロジ間分散 #cndjp

  15. Topology Spreading Constraint • Pod を分散させて可用性を高める ◦ Node をグループ分けして障害ドメインを表現 ◦

    グループ(= Topology)は Label で定義 ◦ 特定のドメインに Pod が偏らないように制限 ◦ 複数の Node で一度に障害が起きても大丈夫 • v1.16 で α 版機能として登場 ◦ API Server, Scheduler に FeatureGates が必要 #cndjp
  16. Topology Spreading Constraint kind: Pod apiVersion: v1 metadata: name: mypod

    labels: foo: bar spec: constiners: ... topologySpreadConstraints: - topologyKey: zone maxSkew: 1 labelSelector: matchLabels: foo: bar whenUnsatisfiable: DoNotSchedule #cndjp
  17. Topology Spreading Constraint kind: Pod apiVersion: v1 metadata: name: mypod

    labels: foo: bar spec: constiners: ... topologySpreadConstraints: - topologyKey: zone maxSkew: 1 labelSelector: matchLabels: foo: bar whenUnsatisfiable: DoNotSchedule 集計の単位 (= Topology) #cndjp
  18. Topology Spreading Constraint kind: Pod apiVersion: v1 metadata: name: mypod

    labels: foo: bar spec: constiners: ... topologySpreadConstraints: - topologyKey: zone maxSkew: 1 labelSelector: matchLabels: foo: bar whenUnsatisfiable: DoNotSchedule 許容できる Pod 数の差 #cndjp
  19. pod Node 1 (1 Pod) #cndjp Zone A (2 Pods)

    Zone B (0 Pods) Zone 間で分散していない例 pod Node 2 (1 Pod) Node 3
  20. pod Node 1 (1 Pod) #cndjp Zone A (1 Pod)

    Zone B (1 Pod) Zone 間で分散している例 Node 2 (0 Pods) pod Node 3 (1 Pod)
  21. Kind による実験にうってつけ • Pod を分散させて可用性を高める ◦ Node をグループ分けして障害ドメインを表現 ◦ グループ(=

    Topology)は Label で定義 ◦ 特定のドメインに Pod が偏らないように制限 ◦ 複数の Node で一度に障害が起きても大丈夫 • v1.16 で α 版機能として登場 ◦ API Server, Scheduler に FeatureGates が必要 #cndjp
  22. YAML による Cluster の定義 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: -

    role: control-plane - role: worker - role: worker kubeadmConfigPatchs: - | apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration apiVersion: extraArgs: feature-gates: EvenPodsSpread apiVersion: extraArgs: Feature-gates: EvenPodsSpread #cndjp
  23. YAML による Cluster の定義 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: -

    role: control-plane - role: worker - role: worker kubeadmConfigPatchs: - | apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration apiVersion: extraArgs: feature-gates: EvenPodsSpread apiVersion: extraArgs: Feature-gates: EvenPodsSpread Control Plane の設定 #cndjp
  24. Topology を定義した Kind クラスタ #cndjp

  25. Zone & Node 間で分散を指定 spec: topologySpreadConstraints: - topologyKey: zone maxSkew:

    1 labelSelector: matchLabels: foo: bar whenUnsatisfiable: DoNotSchedule - topologyKey: node maxSkew: 1 labelSelector: matchLabels: foo: bar whenUnsatisfiable: DoNotSchedule #cndjp
  26. 配置できない Pod が発生 #cndjp

  27. pod Node 1 (2 Pod) #cndjp pod Zone A (4

    Pod) Zone B (2 Pod) Zone & Node 間で分散できない例 pod Node 2 (2 Pods) pod pod pod Node 3 (2 Pod)
  28. pod Node 1 (2 Pod) #cndjp pod Zone A (3

    Pod) Zone B (3 Pod) Zone & Node 間で分散できない例 pod Node 2 (1 Pods) pod pod pod Node 3 (3 Pod)
  29. まとめ • Kubernetes の学習コスト問題 ◦ 簡単に触れる環境で経験値を稼ぎたい • Kind によるローカルクラスタ構築 ◦

    コンテナによってマルチノードを実現 ◦ 構成や設定のカスタマイズも容易 • より手軽に新機能の実験ができる ◦ マネージドでは不可能な設定項目も触れる #cndjp
  30. Kind is Your Kind of Kubernetes! Presented by チェシャ猫 (@y_taka_23)

    #cndjp