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

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

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/

y_taka_23

November 28, 2019
Tweet

More Decks by y_taka_23

Other Decks in Technology

Transcript

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

    • マネージドだと新機能の実験が難しい ◦ 最新バージョンがなかなか使えない ◦ Control Plane 周りの設定が触れない #cndjp
  2. クラスタ構築ツール Kind • マルチノードクラスタが構築可能 ◦ 他のツールはシングルノードのみ ◦ 複数のコンテナを立ち上げ Node と見なす

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

    containerd etcd kube-apiserver kube-scheduler, etc Container = Worker Node #cndjp $ kind create cluster
  4. 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
  5. 抜群のカスタマイズ性 • Control Plane の設定を変更可能 ◦ 内部で使用される kubeadm の設定が渡せる ◦

    マネージドでは手が出せないことが多い • K8s のバージョンが指定可能 ◦ 複数バージョンでのテストが簡単にできる • 手元でビルドした K8s も使用可能 ◦ Node 用イメージを作成するコマンドも用意 #cndjp
  6. Topology Spreading Constraint • Pod を分散させて可用性を高める ◦ Node をグループ分けして障害ドメインを表現 ◦

    グループ(= Topology)は Label で定義 ◦ 特定のドメインに Pod が偏らないように制限 ◦ 複数の Node で一度に障害が起きても大丈夫 • v1.16 で α 版機能として登場 ◦ API Server, Scheduler に FeatureGates が必要 #cndjp
  7. 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
  8. 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
  9. 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
  10. pod Node 1 (1 Pod) #cndjp Zone A (2 Pods)

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

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

    Topology)は Label で定義 ◦ 特定のドメインに Pod が偏らないように制限 ◦ 複数の Node で一度に障害が起きても大丈夫 • v1.16 で α 版機能として登場 ◦ API Server, Scheduler に FeatureGates が必要 #cndjp
  13. 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
  14. 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
  15. 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
  16. 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)
  17. 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)
  18. まとめ • Kubernetes の学習コスト問題 ◦ 簡単に触れる環境で経験値を稼ぎたい • Kind によるローカルクラスタ構築 ◦

    コンテナによってマルチノードを実現 ◦ 構成や設定のカスタマイズも容易 • より手軽に新機能の実験ができる ◦ マネージドでは不可能な設定項目も触れる #cndjp