Slide 1

Slide 1 text

Cloud Native を学ぶには まず Kind より始めよ チェシャ猫 (@y_taka_23) Cloud Native Developers JP #13 (2019/11/28) #cndjp

Slide 2

Slide 2 text

よくある思い込み 「初心者には学習コストが辛い」 #cndjp

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

ここが辛いよ Kubernetes ● そもそもシステムとして複雑 ○ 非同期ベースの多数のコンポーネント ● 周辺ツールを含め進化が速い ○ 運用上のプラクティスも時代遅れになりがち ● マネージドだと新機能の実験が難しい ○ 最新バージョンがなかなか使えない ○ Control Plane 周りの設定が触れない #cndjp

Slide 5

Slide 5 text

充分に Disposable かつ 充分に Configurable なクラスタ #cndjp

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

クラスタ構築ツール Kind ● マルチノードクラスタが構築可能 ○ 他のツールはシングルノードのみ ○ 複数のコンテナを立ち上げ Node と見なす ● 内部的には kubeadm を呼び出し ● k8s 本体の E2E テストでも使用 ○ SIG Testing が開発を手動 ○ 現在 v0.6.0、今後の継続的な開発に期待 #cndjp

Slide 8

Slide 8 text

Physical Machine docker #cndjp

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

コンテナによるマルチノード #cndjp

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

抜群のカスタマイズ性 ● Control Plane の設定を変更可能 ○ 内部で使用される kubeadm の設定が渡せる ○ マネージドでは手が出せないことが多い ● K8s のバージョンが指定可能 ○ 複数バージョンでのテストが簡単にできる ● 手元でビルドした K8s も使用可能 ○ Node 用イメージを作成するコマンドも用意 #cndjp

Slide 14

Slide 14 text

Demo:Pod のトポロジ間分散 #cndjp

Slide 15

Slide 15 text

Topology Spreading Constraint ● Pod を分散させて可用性を高める ○ Node をグループ分けして障害ドメインを表現 ○ グループ(= Topology)は Label で定義 ○ 特定のドメインに Pod が偏らないように制限 ○ 複数の Node で一度に障害が起きても大丈夫 ● v1.16 で α 版機能として登場 ○ API Server, Scheduler に FeatureGates が必要 #cndjp

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Kind による実験にうってつけ ● Pod を分散させて可用性を高める ○ Node をグループ分けして障害ドメインを表現 ○ グループ(= Topology)は Label で定義 ○ 特定のドメインに Pod が偏らないように制限 ○ 複数の Node で一度に障害が起きても大丈夫 ● v1.16 で α 版機能として登場 ○ API Server, Scheduler に FeatureGates が必要 #cndjp

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Topology を定義した Kind クラスタ #cndjp

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

配置できない Pod が発生 #cndjp

Slide 27

Slide 27 text

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)

Slide 28

Slide 28 text

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)

Slide 29

Slide 29 text

まとめ ● Kubernetes の学習コスト問題 ○ 簡単に触れる環境で経験値を稼ぎたい ● Kind によるローカルクラスタ構築 ○ コンテナによってマルチノードを実現 ○ 構成や設定のカスタマイズも容易 ● より手軽に新機能の実験ができる ○ マネージドでは不可能な設定項目も触れる #cndjp

Slide 30

Slide 30 text

Kind is Your Kind of Kubernetes! Presented by チェシャ猫 (@y_taka_23) #cndjp