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

KEP から眺める Kubernetes

KEP から眺める Kubernetes

Tsubasa Nagasawa

July 19, 2023
Tweet

More Decks by Tsubasa Nagasawa

Other Decks in Technology

Transcript

  1. Copyrights©3-shake Inc. All Rights Reserved. 2 Tsubasa Nagasawa (@toversus26) 株式会社スリーシェイク

    Sreake 事業部 スマホ向けゲームの Kubernetes エンジニアを経て、 2023 年 3 月から SRE 見習いをやっています。 Kubernetes やエコシステム周りを観察するのが好きです。 SIG Network をメインで見ています。 whoami
  2. Copyrights©3-shake Inc. All Rights Reserved. 3 Table of Contents •

    KEP-3673: Kubelet limit of Parallel Image Pulls (~ 2min) • KEP-3063: Dynamic Resource Allocation (~ 5min) • KEP-3960: Sleep Action for PreStop Hook (~ 2min) • KEP-753: Sidecar Containers (~ 8min) • Official support for restoring Kubernetes cluster • Migrate Karpenter Core to SIG Autoscaling Subproject (~ 2min) • Revive WG-LTS (~ 5min) • KEP-2433: Topology Aware Routing (~ 8min)
  3. Copyrights©3-shake Inc. All Rights Reserved. 4 今日話す内容に関わる KEP • KEP-3673:

    Kubelet limit of Parallel Image Pulls • KEP-3573: Device Plugins • KEP-3063: Dynamic Resource Allocation • KEP-3960: Sleep Action for PreStop Hook • KEP-753: Sidecar Containers • KEP-2872: Keystone containers • KEP-3582: Terminate pod on container completion • KEP-3935: Support Oldest Node And Newest Control Plane • KEP-3008: QoS Class Resource • KEP-3744: Stay on supported go versions • KEP-2433: Topology Aware Routing • KEP-895: Pod Topology Spread • KEP-1669: Proxy Terminating Endpoints • KEP-1672: Tracking Terminating Endpoints • KEP-2086: Service Internal Traffic Policy • KEP-536: Topology-aware Service Routing • KEP-3685: Move EndpointSlice Reconciler into Staging ※名前しか触れないものもあります
  4. Copyrights©3-shake Inc. All Rights Reserved. 5 KEP-3673: Kubelet limit of

    Parallel Image Pulls • Kubelet はデフォルトでコンテナイメージを直列にプル ◦ 並列でコンテナイメージをプルするオプションもあったが ... ◦ 並列ダウンロード数を制限する機能がないのでディスク I/O に負荷が掛かる ▪ コンテナランタイムの API 呼び出しの QPS を制限する機能しかなかった • Kubelet のコンテナイメージの並列プル数を制限する機能 ◦ Pod が一斉に起動する場合に起動時間の短縮が期待できる ◦ alpha 機能だが、GKE は 1.27 から有効化 ▪ 最大並列プル数を 2 に制限して試験運用をしているみたい ※ デフォルト無効 alpha: 1.27 beta: 1.28 (https://issue.k8s.io/112044) / # cat /home/kubernetes/kubelet-config.yaml maxParallelImagePulls: 2 serializeImagePulls: false https://kep.k8s.io/3673
  5. Copyrights©3-shake Inc. All Rights Reserved. 6 KEP-3063: Dynamic Resource Allocation

    • 任意のリソースを要求するための仕組み ◦ KEP-3573: Device Plugins の進化系 (https://kep.k8s.io/3573) ▪ NVIDIA / Intel GPU, FPGA などのアクセラレータを Pod で使う仕組み ◦ StorageClass / PV / PVC を一般化したイメージ • デバイスの動的な初期化、Pod 停止後のお掃除、リソース共有が特徴 ◦ NVIDIA Multi-Instance GPUs (MIGs) や Intel GPU Virtual Function など • Container Device Interface (CDI) によるコンテナランタイムとの協調 ◦ OCI Runtime Specification に追加設定をマージする仕組み ▪ デバイス、環境変数、マウントポイント、 Hook alpha: 1.26 beta: 1.29 https://kep.k8s.io/3063
  6. Copyrights©3-shake Inc. All Rights Reserved. 7 KEP-3063: Dynamic Resource Allocation

    • 自作したドライバで動作イメージを見ていく ◦ ダミーなデバイスを払い出して Pod に割り当ててくれる • ResourceClass ◦ クラスタ管理者が作成 ▪ IngressClass / StorageClass と同じ ◦ ドライバの選択 ▪ NVIDIA / Intel GPU, … ◦ ドライバが使うグローバルなパラメータを紐付け可能 ▪ e.g.) ConfigMap, カスタムリソース ◦ スケジュール対象のノードの制限 ▪ ラベルセレクタでデバイスのある特定のノードに制限 apiVersion: resource.k8s.io/v1alpha2 driverName: fake.resource.3-shake.com kind: ResourceClass metadata: # 各ベンダーが実装した Resource Driver の名前を指定 # クラスタ内に複数の ResourceClass を作成して、 # ユーザー側で Resource Driver を選択することも可能 name: fake.3-shake.com
  7. Copyrights©3-shake Inc. All Rights Reserved. 8 KEP-3063: Dynamic Resource Allocation

    • FakeClaimParameters ◦ 独自実装したカスタムリソース ▪ ドライバ側で自由に実装可能 ◦ ドライバが使う任意のパラメータを渡せる • ResourceClaimTemplate ◦ 任意のリソースの設計図 ◦ ドライバが使うパラメータの紐付けも可能 ▪ e.g.) ConfigMap, カスタムリソース ◦ PVC の一般化 apiVersion: fake.resource.3-shake.com/v1alpha1 kind: FakeClaimParameters metadata: namespace: test5 name: multiple-fakes spec: count: 4 # count で作成されたデバイスを親デバイスとして split で # 指定した数だけダミーなデバイスを作成する # 今回だと合計 8 個のダミーなデバイスが動的に生成される split: 2 --- apiVersion: resource.k8s.io/v1alpha2 kind: ResourceClaimTemplate metadata: namespace: test5 name: multiple-fakes spec: spec: resourceClassName: fake.3-shake.com parametersRef: apiGroup: fake.resource.3-shake.com kind: FakeClaimParameters name: multiple-fakes
  8. Copyrights©3-shake Inc. All Rights Reserved. 9 KEP-3063: Dynamic Resource Allocation

    • Pod の .spec.resourceClaims ◦ ResourceClaimTemplate を複数紐付け ◦ VolumeClaimTemplate と同じ ◦ インラインで埋め込みはできない • Pod の .spec.containers[].resources.claims ◦ resourceClaims からリソースを参照 ◦ 複数のコンテナが同じリソースを参照可能 ◦ 1 つのコンテナが複数のリソースを参照可能 apiVersion: v1 kind: Pod metadata: namespace: test5 name: pod0 labels: app: pod spec: terminationGracePeriodSeconds: 3 containers: - name: ctr0 image: cgr.dev/chainguard/wolfi-base:latest command: ["ash", "-c"] args: ["export; sleep infinity"] resources: # 新たに resources.claims フィールドが追加され、 # resourceClaims からコンテナ毎に割り当てるリソースを参照 # resources.limits や resources.requests と併用も可能 claims: # resourceClaims の名前と一致させること - name: fakes resourceClaims: - name: fakes source: # ResourceClaimTemplate を参照するパターン # 参照された Pod 単位で異なるテンプレートから # ResourceClaim が自動生成されて紐付く resourceClaimTemplateName: multiple-fakes
  9. Copyrights©3-shake Inc. All Rights Reserved. 10 KEP-3063: Dynamic Resource Allocation

    • 動的にダミーのデバイスを生成して、ノード上で利用可能に • 今回は 4 個の親デバイスをそれぞれ 2 個の子デバイスに分割 ◦ 合計 8 個のデバイスが Pod にマウントされる ◦ ダミーの Driver なので環境変数を CDI で差し込むだけの実装 • 詳しくは [Kubernetes 1.27] Dynamic Resource Allocation のいま を参照 ❯ stern -n test5 . pod0 ctr0 export DRA_RESOURCE_DRIVER_NAME='fake.resource.3-shake.com' pod0 ctr0 export FAKE_DEVICE_0='FAKE-22a36a85-d3f7-d9cd-3fa4-e96f63591bb1' pod0 ctr0 export FAKE_DEVICE_1='FAKE-48f03bf4-8ada-e156-d3de-4a543eecd3cb' pod0 ctr0 export FAKE_DEVICE_2='FAKE-6000b709-3418-4a8c-42a4-fabfa269bcca' pod0 ctr0 export FAKE_DEVICE_3='FAKE-90207d0e-cfb9-08b6-67a3-48f412318baa' pod0 ctr0 export FAKE_DEVICE_4='FAKE-45d09bc0-a6e6-5e1f-0b1d-91628b513a2c' pod0 ctr0 export FAKE_DEVICE_5='FAKE-e473e7e3-53b8-cfdc-cf48-34c1c85f8312' pod0 ctr0 export FAKE_DEVICE_6='FAKE-c02b74da-85de-6b1c-df13-e1cfe32c1eec' pod0 ctr0 export FAKE_DEVICE_7='FAKE-e49d9dc8-2368-6403-d080-b0d3672f5a1c' pod0 ctr0 export FAKE_NODE_NAME='kind-worker'
  10. Copyrights©3-shake Inc. All Rights Reserved. 11 KEP-3063: Dynamic Resource Allocation

    • 1.28 に向けた主な変更点 ◦ Pod のスケジュールに 5 秒程度掛かっていたのを短縮 (https://pr.k8s.io/119078) ◦ Scheduler が関わらない時にも DRA が利用可能に (https://pr.k8s.io/118209) ▪ ノード名を明示的に指定する場合 ◦ リソース要求をまとめて処理で高速化 (https://pr.k8s.io/118862) ◦ デバイスの初期化/お掃除をまとめて処理で高速化 (https://pr.k8s.io/119012) ◦ Pod が使わなくなったリソースをすぐにお掃除 (https://pr.k8s.io/118936) ▪ WaitForFirstConsumer (遅延割り当て) の場合のみ ◦ Pod が停止もしくはスケジュールの途中で削除された場合にお掃除 (https://pr.k8s.io/118817) ◦ テンプレートから生成する ResourceClaim にランダム文字列追加 (https://pr.k8s.io/117351) ▪ オブジェクト名が衝突するのを避ける
  11. Copyrights©3-shake Inc. All Rights Reserved. 12 KEP-3960: Sleep Action for

    PreStop Hook • PreStop Hook の Exec Action での sleep ◦ ネットワークプログラミングレイテンシ ▪ コントローラの同期が遅れる (e.g. iptables, LB, …) ◦ すぐに Graceful Shutdown に入るとリクエストを取りこぼす ◦ 悪い意味で暗黙のデファクトスタンダード化 • PreStop Hook に sleep アクションを指定できるようになる ◦ コンテナイメージに sleep バイナリを含めなくて良い ◦ 無駄なバイナリを含まないベースイメージ (e.g. distroless) • terminationGracePeriodSeconds との関係 ◦ 作成時は sleep <= terminationGracePeriodSeconds を検証 ◦ kubectl delete pods –grace-period=Xs での上書きは許容 alpha: 1.28 beta: 1.29 apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: (…) template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.25.1 lifecycle: preStop: sleep: seconds: 10 https://kep.k8s.io/3960 1.29
  12. Copyrights©3-shake Inc. All Rights Reserved. 13 KEP-753: Sidecar Containers •

    サイドカーコンテナを Init コンテナとして起動する機能 ◦ Init コンテナで restartPolicy に Always を指定 ▪ Pod レベルの restartPolicy とは別に Init コンテナレベルで指定可能に ▪ restartPolicy を指定しない場合は通常の Init コンテナの挙動 ◦ スケジューラの判断材料のリソース要求の計算が複雑化 • ユースケース ◦ サービスメッシュのプロキシや証明書管理 ◦ ログやメトリクス収集のエージェント ◦ サイドカーコンテナを含んだ Job の停止 ◦ Init コンテナがサイドカーコンテナを必要とするパターン alpha: 1.28 beta: 1.29 https://kep.k8s.io/753
  13. Copyrights©3-shake Inc. All Rights Reserved. 14 KEP-753: Sidecar Containers •

    Kind でローカル環境にクラスタを作成 ◦ Kind で Kubernetes をセルフビルド ◦ 以下の変更を含むブランチでビルド ▪ メインの実装 (https://pr.k8s.io/116429) ▪ Probe / Lifecycle Hook 対応 (https://pr.k8s.io/119168) ◦ control plane + worker node の構成 ◦ SidecarContainers の FeatureGate を有効化 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 featureGates: SidecarContainers: true nodes: - role: control-plane - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: v: "4"
  14. Copyrights©3-shake Inc. All Rights Reserved. 15 KEP-753: Sidecar Containers •

    サイドカーで使える設定 ◦ restartPolicy ◦ Probe ◦ Lifecycle Hook • Init コンテナを間に挟める apiVersion: v1 kind: Pod metadata: name: pod-with-sidecar spec: initContainers: - name: init-1 image: cgr.dev/chainguard/wolfi-base:latest command: ["ash", "-c", "echo Started; echo Sleep 5s; sleep 5; echo Terminated"] - name: sidecar-1 image: cgr.dev/chainguard/wolfi-base:latest restartPolicy: Always command: ["ash", "-c", "trap 'echo Terminated; exit' TERM; echo Started; while true; do sleep 1; done"] lifecycle: preStop: exec: command: ["ash", "-c", "echo PreStop Executed > /proc/1/fd/1; sleep 5; echo PreStop Done > /proc/1/fd/1"] - name: init-2 image: cgr.dev/chainguard/wolfi-base:latest command: ["ash", "-c", "echo Started; echo Sleep 5s; sleep 5; echo Terminated"] - name: sidecar-2 image: cgr.dev/chainguard/wolfi-base:latest restartPolicy: Always command: ["ash", "-c", "trap 'echo Terminated; exit' TERM; echo Started; while true; do sleep 1; done"] containers: - name: regular-1 image: cgr.dev/chainguard/wolfi-base:latest command: ["ash", "-c", "trap 'echo Terminated; exit' TERM; echo Started; while true; do sleep 1; done"] lifecycle: postStart: exec: command: ["ash", "-c", "echo PostStart Executed > /proc/1/fd/1"] ※ 2023/7/19 時点の実装
  15. Copyrights©3-shake Inc. All Rights Reserved. 16 KEP-753: Sidecar Containers •

    Init コンテナが停止してから次の処理へ • アルファ時点でコンテナの停止順は今まで通りランダム ◦ killContainersWithSyncResult に渡す runningPod.Containers にまだ変更はなし pod-with-sidecar init-1 2023-07-19T10:35:26.225559175+09:00 Started pod-with-sidecar init-1 2023-07-19T10:35:26.225606632+09:00 Sleep 5s pod-with-sidecar init-1 2023-07-19T10:35:31.225685707+09:00 Terminated pod-with-sidecar sidecar-1 2023-07-19T10:35:33.310518497+09:00 Started pod-with-sidecar init-2 2023-07-19T10:35:35.283603016+09:00 Started pod-with-sidecar init-2 2023-07-19T10:35:35.283613891+09:00 Sleep 5s pod-with-sidecar init-2 2023-07-19T10:35:40.285017813+09:00 Terminated pod-with-sidecar sidecar-2 2023-07-19T10:35:42.298094645+09:00 Started pod-with-sidecar regular-1 2023-07-19T10:35:44.242024465+09:00 Started pod-with-sidecar regular-1 2023-07-19T10:35:44.251138321+09:00 PostStart Executed … pod-with-sidecar sidecar-2 2023-07-19T10:35:53.405213960+09:00 Terminated pod-with-sidecar regular-1 2023-07-19T10:35:53.407761283+09:00 Terminated pod-with-sidecar sidecar-1 2023-07-19T10:35:53.418470149+09:00 PreStop Executed pod-with-sidecar sidecar-1 2023-07-19T10:35:58.419571745+09:00 PreStop Done pod-with-sidecar sidecar-1 2023-07-19T10:35:58.433210468+09:00 Terminated
  16. Copyrights©3-shake Inc. All Rights Reserved. 17 KEP-753: Sidecar Containers •

    サイドカーに Probe 設定 ◦ Startup ◦ Readiness apiVersion: v1 kind: Pod metadata: name: pod-with-sidecar spec: initContainers: - name: sidecar-1 image: cgr.dev/chainguard/wolfi-base:latest restartPolicy: Always command: ["ash", "-c", "trap 'echo Terminated; exit' TERM; echo Started; while true; do sleep 1; done"] startupProbe: exec: command: ["ash", "-c", "echo StartupProbe Started > /proc/1/fd/1; sleep 5; echo Ready > /proc/1/fd/1"] initialDelaySeconds: 5 timeoutSeconds: 8 periodSeconds: 10 - name: sidecar-2 image: cgr.dev/chainguard/wolfi-base:latest restartPolicy: Always command: ["ash", "-c", "trap 'echo Terminated; exit' TERM; echo Started; while true; do sleep 1; done"] readinessProbe: exec: command: ["ash", "-c", "echo ReadinessProbe Started > /proc/1/fd/1; sleep 5; echo Ready > /proc/1/fd/1"] initialDelaySeconds: 5 timeoutSeconds: 8 periodSeconds: 10 containers: - name: regular-1 image: cgr.dev/chainguard/wolfi-base:latest command: ["ash", "-c", "trap 'echo Terminated; exit' TERM; echo Started; while true; do sleep 1; done"] ※ 2023/7/19 時点の実装
  17. Copyrights©3-shake Inc. All Rights Reserved. 18 KEP-753: Sidecar Containers •

    サイドカーの Startup Probe が成功してから次のサイドカーを起動 ◦ Init コンテナがサイドカーコンテナに依存している場合は使える • サイドカーの Readiness Probe の成功を待たずにメインを起動 ◦ Liveness Probe も同様に成功を待たない pod-with-sidecar sidecar-1 2023-07-19T10:41:41.149427271+09:00 Started pod-with-sidecar sidecar-1 2023-07-19T10:41:49.999416000+09:00 StartupProbe Started pod-with-sidecar sidecar-1 2023-07-19T10:41:55.000988954+09:00 Ready pod-with-sidecar sidecar-2 2023-07-19T10:41:56.037333917+09:00 Started pod-with-sidecar regular-1 2023-07-19T10:41:57.682351314+09:00 Started pod-with-sidecar sidecar-2 2023-07-19T10:42:09.999915870+09:00 ReadinessProbe Started pod-with-sidecar sidecar-2 2023-07-19T10:42:15.000654193+09:00 Ready … pod-with-sidecar regular-1 2023-07-19T10:42:20.167238932+09:00 Terminated pod-with-sidecar sidecar-1 2023-07-19T10:42:20.167235599+09:00 Terminated pod-with-sidecar sidecar-2 2023-07-19T10:42:20.168897834+09:00 Terminated
  18. Copyrights©3-shake Inc. All Rights Reserved. 19 KEP-753: Sidecar Containers •

    Job にサイドカーを挟む ◦ Job のメインのコンテナが終了してもサイドカーが停止しない問題は? apiVersion: batch/v1 kind: Job metadata: name: pod-with-sidecar spec: template: spec: initContainers: - name: init-1 image: cgr.dev/chainguard/wolfi-base:latest command: ["ash", "-c", "echo Started; echo Sleep 5s; sleep 5; echo Terminated"] - name: sidecar-1 image: cgr.dev/chainguard/wolfi-base:latest restartPolicy: Always command: ["ash", "-c", "trap 'echo Terminated; exit' TERM; echo Started; while true; do sleep 1; done"] containers: - name: regular-1 image: cgr.dev/chainguard/wolfi-base:latest command: ["ash", "-c", "echo Started; echo Sleep 5s; sleep 5; echo Terminated"] restartPolicy: Never backoffLimit: 4 ※ 2023/7/19 時点の実装
  19. Copyrights©3-shake Inc. All Rights Reserved. 20 KEP-753: Sidecar Containers •

    メインのコンテナが停止するとサイドカーに SIGTERM が飛ぶ ◦ 現在 Job を止めるためにやっているハックが不要になる! ▪ 終了時ファイル検出 ▪ PID namespace 共有 + シグナル通知 pod-with-sidecar-nn4zh init-1 2023-07-19T10:47:03.613131134+09:00 Started pod-with-sidecar-nn4zh init-1 2023-07-19T10:47:03.613188550+09:00 Sleep 5s pod-with-sidecar-nn4zh init-1 2023-07-19T10:47:08.614265132+09:00 Terminated pod-with-sidecar-nn4zh sidecar-1 2023-07-19T10:47:09.753494135+09:00 Started pod-with-sidecar-nn4zh regular-1 2023-07-19T10:47:11.878372366+09:00 Started pod-with-sidecar-nn4zh regular-1 2023-07-19T10:47:11.878387241+09:00 Sleep 5s pod-with-sidecar-nn4zh regular-1 2023-07-19T10:47:16.882976981+09:00 Terminated pod-with-sidecar-nn4zh sidecar-1 2023-07-19T10:47:17.809750902+09:00 Terminated
  20. Copyrights©3-shake Inc. All Rights Reserved. 21 KEP-753: Sidecar Containers •

    実装は全く違うが、1.18 (2019 年) に一度入りかけた機能 ◦ lifecycle.type に Sidecar を指定 ◦ コンテナのライフサイクル周りの変更の懸念から断念 • 影響範囲を限定した KEP-2872: Keystone containers (https://kep.k8s.io/2872) ◦ Job のサイドカー問題の解決のみに絞った KEP ◦ lifecycle.type に keystone を指定したコンテナが停止したら他も停止 ▪ restartPolicy が Never or OnFailure の場合のみ (Job) ◦ 解決できる問題が限定的かつ今後の拡張性も低く停滞 ... ▪ 起動停止順を解決するフェーズ、 DAG など拡張性の高い案もあった ◦ 2022 年 10 月に Runlevel に変更して Sidecar や App を指定する案も
  21. Copyrights©3-shake Inc. All Rights Reserved. 22 KEP-753: Sidecar Containers •

    KEP-3582: Terminate pod on container completion (https://kep.k8s.io/3582) ◦ Pod レベルの restartPolicy をコンテナ単位で上書きする機能 ▪ (Pod, Container) = (Never, OnFailure or Always) or (OnFailure, Always) ◦ 今回の Sidecar Containers の機能のベースとなった KEP ◦ KEP-3582 の動きは止まっていて、 Sidecar Containers 以外のユースケースを収集中 • 2022/11 に SIG Node に WG Sidecar が発足 ◦ Init コンテナに restartPolicy を追加するだけで API の変更は最小限に • 2023/2 に KEP-753 の内容が更新される • Kubernetes 1.27 のリリースサイクルではマージされず
  22. Copyrights©3-shake Inc. All Rights Reserved. 23 KEP-753: Sidecar Containers •

    Alpha に向けた実装予定 ◦ PodStatus に RequestedResources を追加 (https://pr.k8s.io/115643) ▪ init / regular コンテナと Pod Overhead を含むリソース要求の合計 • Pod がスケジュールできていない原因をユーザーが確認しやすいように • Cluster Autoscaler や Karpenter がノードを追加する際の計算で使えるように • Beta に向けた実装や変更の予定 ◦ コンテナの停止順 ▪ アルファ以降でフィードバックを受ける予定 (regular-1 -> sidecar-2 -> sidecar-1 ?) ◦ restartPolicy のデフォルト値 (OnFailure?) の設定 ▪ initContainer が再実行されない問題の解決にも繋がるかも? ◦ Init コンテナからの分離 (e.g. infrastructureContainers) ▪ initContainers にサイドカーを指定することで混乱が生じた場合のみ
  23. Copyrights©3-shake Inc. All Rights Reserved. 24 Official support for restoring

    Kubernetes cluster • Kubernetes 公式でクラスタのリストアをサポートする動き ◦ 各ベンダーや管理者の多くが間違った方法で etcd をリストアしている ◦ etcd に変更を加えつつ、公式ガイダンスを出したい ▪ etcd への変更が大部分なので KEP は今のところなし • 時を戻すことによる Controller / Operator のキャッシュ (Informer) への影響 ◦ etcd 内のオブジェクトの Revision が過去に戻る => キャッシュ無効化が必要 • 対応予定 ◦ リストア後に etcd 内のオブジェクトの Revision を任意の数だけ増やす ◦ リストア後に etcd 内のオブジェクトの過去の Revision を Compaction https://issue.k8s.io/118501
  24. Copyrights©3-shake Inc. All Rights Reserved. 25 • AWS が Karpenter

    のコア部分を SIG Autoscaling に寄贈しようとしている ◦ 2019 年と 2020 年に AWS が Cluster Autoscaler (CA) の課題や改善案を共有 ◦ CA の互換性を保ちつつ組み込むのは難しいので別プロジェクト化 ◦ 2021 年に本番利用可能になってからも順調に開発が進んでいる ◦ コミュニティ主導で AWS 以外の対応も進めていきたい ▪ Azure は乗り気、既にコア部分にパッチを送っているらしい ▪ Google Cloud は公式ですぐに取り組む予定はなく、コミュニティ次第 https://github.com/kubernetes/org/issues/4258 Migrate Karpenter Core to SIG Autoscaling Subproject
  25. Copyrights©3-shake Inc. All Rights Reserved. 26 Migrate Karpenter Core to

    SIG Autoscaling Subproject • CA vs Karpenter ◦ CA はノードプール単位でスケール ▪ 事前にノードプールを定義する必要がある ▪ GKE の Node Auto-Provisioning だとノードプールを自動作成 ◦ Karpenter はノード単位で作成・追加する ◦ Karpenter はノードのカスタマイズやライフサイクル管理もやる • 今後の動きは? ◦ CA と Karpenter の持つ共通の機能を標準化していきたい ◦ まずは WG を作って議論を進めていく ▪ Karpenter の CRD の v1beta1 のレビューを一緒にやるらしい
  26. Copyrights©3-shake Inc. All Rights Reserved. 27 Revive WG-LTS • 2023/4/18

    AKS (Azure) の LTS サポートの発表 • 2023/4/18 KubeCon Europe 2023 Contributor Summit での議論 • Azure / AWS / Google Cloud を中心に WG-LTS が復活しました ◦ 政府関係・通信業界など 12 ヶ月サイクルの更新が厳しいユーザーがいる ◦ エンドユーザーの現状と求める LTS を情報収集するところから ◦ 情報を元に Kubernetes に反映できる変更を考えていく ▪ マイナーバージョンのサポート期間の延長? ▪ LTS ブランチに脆弱性修正や致命的なバグ修正を反映していく? ▪ バージョンスキューポリシーの変更? ▪ … https://github.com/kubernetes/community/issues/7259
  27. Copyrights©3-shake Inc. All Rights Reserved. 28 • LTS から LTS

    へのアップグレードのパスをどうする? ◦ 一気に更新できるようにはしたいらしいが、まだ決まっていない ◦ まだ決まっていない • LTS のバージョンをどう決める? ◦ 1.15 や 1.21 など API バージョンの廃止前のバージョンに居座りがちな雰囲気 ◦ まだ決まっていない • LTS ではベータ機能は無効化する? ◦ Beta API は Kubernetes 1.24 からデフォルトで有効化されない ◦ これは Beta API じゃなくてベータ機能の話 ◦ ベータ機能に破壊的変更が入る可能性があるため Revive WG-LTS
  28. Copyrights©3-shake Inc. All Rights Reserved. 30 • KEP-3935: Support Oldest

    Node And Newest Control Plane (https://kep.k8s.io/3935) ◦ WG-LTS とは別に進んでいるバージョンスキューポリシーの拡張 ◦ コントロールプレーンとノードのバージョンスキューを n-2 から n-3 に ▪ 1.43 のコントロールプレーンと 1.40 のノードでの動作を保証 ◦ Kubernetes のサポートバージョンへの追従 ▪ 毎年 3 バージョン更新する必要がある (1.40 -> 1.43) ▪ 現在の in-place 更新のパス • コントロールプレーンを 1.40 -> 1.41 -> 1.42 に更新 • ノードを 1.40 -> 1.42 に更新 • コントロールプレーンを 1.42 -> 1.43 に更新 • ノードを 1.42 -> 1.43 に更新 WG-LTS に関連する動き stable: 1.28
  29. Copyrights©3-shake Inc. All Rights Reserved. 31 • KEP-3935: Support Oldest

    Node And Newest Control Plane ◦ Kubernetes のサポートバージョンへの追従 ▪ 今後の in-place 更新のパス • コントロールプレーンを 1.40 -> 1.41 -> 1.42 -> 1.43 に更新 • ノードを 1.40 -> 1.43 に更新 ▪ ノードの更新回数を減らすことでサービス影響や運用コストを抑えられる ◦ バージョンスキューのテストに (1.27, 1.24) と (1.28, 1.25) を追加 ▪ 絶賛実装中の機能でバージョンスキューの拡張による影響を見る • どのバージョンからスキューポリシーの拡張を始めるか決めるため • (1.27, 1.24) と (1.28-alpha, 1.25) は問題なかったらしい WG-LTS に関連する動き
  30. Copyrights©3-shake Inc. All Rights Reserved. 32 WG-LTS に関連する動き • KEP-3744:

    Stay on supported go versions (https://kep.k8s.io/3744) ◦ Kubernetes 1.x ブランチは特定の Go マイナーバージョンでビルドされてきた ◦ Go の後方互換性の改善 ▪ Kubernetes から Go 開発チームに提言 ▪ GODEBUG (or //go:debug) による Go の破壊的変更の On/Off 実装の強制 ◦ Kubernetes 1.x ブランチを最新の Go マイナーバージョンでビルドできるように ▪ 開発ブランチでの事前検証、 Kubernetes 1.x ブランチへの取り込みの条件の定義など • CRI API のバージョンスキューポリシーの策定 (https://pr.k8s.io/107190) ◦ CRI に影響する KEP も当然ある ▪ KEP-3008: QoS Class Resource, KEP-3063: DRA, … ◦ 同じ CRI API のバージョン (v1) で実装された Kubelet とコンテナランタイムの互換性 ▪ 3 バージョンまでは互換性を持たせる (e.g. [email protected] <-> Kubelet v0.26.0) stable: 1.27
  31. Copyrights©3-shake Inc. All Rights Reserved. 33 KEP-2433: Topology Aware Hints

    Routing • Pod を Zone に分散して配置することで可用性を担保 ◦ トラフィックは iptables / IPVS のルールでランダムに振り分け ▪ Zone を跨いだ通信によるコストの増加 ▪ Zone を跨いだ通信によるレイテンシの悪化 • Topology (Zone) を考慮してトラフィックを振り分けたい ◦ 同一 Zone 内の Pod に出来るだけトラフィックを流したい ◦ 特定の Zone に負荷が偏るのを避けたい • Zone 内の CPU 数でトラフィックを振り分ける機能 ◦ Headless Service はクラスタ DNS が Pod IP を解決するので対応外 ◦ 拡張性よりも利便性を優先 (設定のシンプルさ) ◦ 1.27 で Topology Aware Hints から Topology Aware Routing に改名 alpha: 1.21 beta: 1.23 stable: ??? https://kep.k8s.io/2433
  32. Copyrights©3-shake Inc. All Rights Reserved. 34 KEP-2433: Topology Aware Routing

    • Kind でローカル環境にクラスタを作成 ◦ Kubernetes 1.27.3 ◦ control plane + 3 worker node 構成 ◦ worker node に Topology ラベルを付与 ◦ worker node の割り当て可能な CPU は同じ ▪ status.allocatable.cpu: 8 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "topology.kubernetes.io/zone=zone-a" - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "topology.kubernetes.io/zone=zone-b" - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "topology.kubernetes.io/zone=zone-c" ❯ kubectl get nodes -l topology.kubernetes.io/zone NAME STATUS ROLES AGE VERSION kind-worker Ready <none> 3m v1.27.3 kind-worker2 Ready <none> 3m v1.27.3 kind-worker3 Ready <none> 3m v1.27.3
  33. Copyrights©3-shake Inc. All Rights Reserved. 35 KEP-2433: Topology Aware Routing

    • テスト用の Pod を 10 台起動 ◦ /hostname でホスト名 (Pod 名) を返す ◦ Topology Spread Constraints で Zone 分散 • Topology Aware Routing の annotation 指定 apiVersion: apps/v1 kind: Deployment metadata: name: backends spec: selector: matchLabels: app: backends replicas: 10 template: metadata: labels: app: backends spec: containers: - name: agnhost image: k8s.gcr.io/e2e-test-images/agnhost:2.39 args: - netexec - --http-port=80 - --delay-shutdown=30 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: app: backends apiVersion: v1 kind: Service metadata: name: backends annotations: service.kubernetes.io/topology-mode: "auto" spec: type: ClusterIP selector: app: backends ports: - protocol: TCP port: 80 targetPort: 80
  34. Copyrights©3-shake Inc. All Rights Reserved. 36 KEP-2433: Topology Aware Routing

    • クライアントの Pod を起動して curl でリクエストを投げる ◦ クライアントの Pod と同じ Zone の Pod にしかリクエストが流れていない ❯ kubectl get pods -l app=backends \ -ojsonpath='{range .items[?(@.spec.nodeName=="kind-worker")]}{@.metadata.name}{"\n"}{end}' backends-5dd7cf99fd-gxdg2 backends-5dd7cf99fd-kz7td backends-5dd7cf99fd-zvbrz ❯ kubectl run -it --rm curl --image registry.k8s.io/e2e-test-images/agnhost:2.39 --command -- ash If you don't see a command prompt, try pressing enter. / # while sleep 1; do curl -sSL -w "\n" http://backends/hostname; done backends-5dd7cf99fd-zvbrz backends-5dd7cf99fd-gxdg2 backends-5dd7cf99fd-gxdg2 backends-5dd7cf99fd-kz7td backends-5dd7cf99fd-zvbrz backends-5dd7cf99fd-gxdg2
  35. Copyrights©3-shake Inc. All Rights Reserved. 37 KEP-2433: Topology Aware Routing

    • EndpointSlice コントローラが EndpointSlice にヒントを埋め込む ◦ .hints.forZones に Topology キーの値を埋める ❯ kubectl get endpointslice -l kubernetes.io/service-name=backends \ -ojsonpath='{.items[0].endpoints[4]}' | jq { (...) "hints": { "forZones": [ { "name": "zone-a" } ] }, "nodeName": "kind-worker", "targetRef": { "kind": "Pod", "name": "backends-5dd7cf99fd-kz7td", "namespace": "default", "uid": "5a867de0-23cc-4ec5-bce8-ab8ca9eae8a9" }, "zone": "zone-a" }
  36. Copyrights©3-shake Inc. All Rights Reserved. 38 KEP-2433: Topology Aware Routing

    • EndpointSlice の利用者がヒントを考慮して経路を作成 ◦ kube-proxy の iptables のルールが追加される ▪ Service Endpoint 用のルールが 3 つある ▪ zone-a のノード上の Pod も 3 つで Pod IP も一致 (省略) /# KUBE_SVC_RULE_NAME=$(iptables -t nat -L KUBE-SERVICES -n | grep default/backends | awk '{print $1}') /# iptables -t nat -L ${KUBE_SVC_RULE_NAME} -n Chain KUBE-SVC-OHSSMBHE4NED4LG4 (1 references) target prot opt source destination KUBE-MARK-MASQ tcp -- !10.244.0.0/16 10.96.103.227 tcp dpt:80 KUBE-SEP-3SNEMA3ONBVUUURN all -- 0.0.0.0/0 0.0.0.0/0 statistic mode random probability 0.33333333349 KUBE-SEP-56SQBRZDKAUDDJOW all -- 0.0.0.0/0 0.0.0.0/0 statistic mode random probability 0.50000000000 KUBE-SEP-FZOGABAOPIZI2Z7W all -- 0.0.0.0/0 0.0.0.0/0
  37. Copyrights©3-shake Inc. All Rights Reserved. 39 KEP-2433: Topology Aware Routing

    • Topology Aware Routing が発動する条件 ◦ 全ての Zone が満たさない場合は発動しない ◦ Pod の数が多い場合は発動しやすい Zone a b c vCPU 8 8 8 Endpoint 数 3 3 4 CPU 比率 8 / 24 = 33.33% 8 / 24 = 33.33% 8 / 24 = 33.33% 過負荷の閾値 0.2 必要な Endpoint 数 (小数点切り上げ) (10 * 0.3333) / 1.2 ~ 3 (10 * 0.3333) / 1.2 ~ 3 (10 * 0.3333) / 1.2 ~ 3 発動するか? (EP >= 必要な EP) ⭕ ⭕ ⭕ 参考: https://aws.amazon.com/jp/blogs/containers/exploring-the-effect-of-topology-aware-hints-on-network-traffic-in-amazon-elastic-kubernetes-service/ https://go.dev/play/p/GZmgcTb50x7
  38. Copyrights©3-shake Inc. All Rights Reserved. 40 Topology Aware Routing の課題

    • Topology Aware Routing の発動を予測し辛い ◦ 時間の関係で割愛 • Service の既存のトポロジー制御との兼ね合い • KEP-536: Topology-aware Service Routing の亡霊
  39. Copyrights©3-shake Inc. All Rights Reserved. 41 Topology Aware Routing の発動を予測し辛い

    • Kind でローカル環境にクラスタを作成 ◦ Kubernetes 1.27.3 ◦ control plane + 3 worker node 構成 ◦ worker node に Topology ラベルを付与 ◦ worker node の割り当て可能な CPU を調整 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "topology.kubernetes.io/zone=zone-a" # ノードの割り当て可能な CPU 数を減らすためのハック system-reserved: "cpu=6" - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "topology.kubernetes.io/zone=zone-b" system-reserved: "cpu=6" - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "topology.kubernetes.io/zone=zone-c" system-reserved: "cpu=4" kubectl get nodes -l topology.kubernetes.io/zone \ -ojsonpath='{range .items[*]}{.metadata.name}: cpu={.status.allocatable.cpu}{"\n"}{end}' kind-worker: cpu=2 kind-worker2: cpu=2 kind-worker3: cpu=4
  40. Copyrights©3-shake Inc. All Rights Reserved. 42 Topology Aware Routing の発動を予測し辛い

    • テスト用の Pod を 4 台起動 ◦ /hostname でホスト名 (Pod 名) を返す ◦ Topology Spread Constraints で Zone 分散 • Topology Aware Routing の annotation 指定 apiVersion: apps/v1 kind: Deployment metadata: name: backends spec: selector: matchLabels: app: backends replicas: 4 template: metadata: labels: app: backends spec: containers: - name: agnhost image: k8s.gcr.io/e2e-test-images/agnhost:2.39 args: - netexec - --http-port=80 - --delay-shutdown=30 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: app: backends apiVersion: v1 kind: Service metadata: name: backends annotations: service.kubernetes.io/topology-mode: "auto" spec: type: ClusterIP selector: app: backends ports: - protocol: TCP port: 80 targetPort: 80
  41. Copyrights©3-shake Inc. All Rights Reserved. 43 Topology Aware Routing の発動を予測し辛い

    • Topology Aware Routing が発動する条件 ◦ NodeResourceFit: LeastAllocated (デフォルト) の場合は発動する ◦ クラスタ内に他のワークロードが動いている場合は発動しない可能性もある 参考: https://aws.amazon.com/jp/blogs/containers/exploring-the-effect-of-topology-aware-hints-on-network-traffic-in-amazon-elastic-kubernetes-service/ Zone a b c vCPU 2 2 4 Endpoint 数 1 1 2 CPU 比率 2 / 8 = 25% 2 / 8 = 25% 4 / 8 = 50% 過負荷の閾値 0.2 必要な Endpoint 数 (小数点切り上げ) (4 * 0.25) / 1.2 ~ 1 (4 * 0.25) / 1.2 ~ 1 (4 * 0.5) / 1.2 ~ 2 発動するか? (EP >= 必要な EP) ⭕ ⭕ ⭕
  42. Copyrights©3-shake Inc. All Rights Reserved. 44 Topology Aware Routing の発動を予測し辛い

    • テスト用の Pod を 5 台起動 ◦ /hostname でホスト名 (Pod 名) を返す ◦ Topology Spread Constraints で Zone 分散 • Topology Aware Routing の annotation 指定 apiVersion: apps/v1 kind: Deployment metadata: name: backends spec: selector: matchLabels: app: backends replicas: 5 template: metadata: labels: app: backends spec: containers: - name: agnhost image: k8s.gcr.io/e2e-test-images/agnhost:2.39 args: - netexec - --http-port=80 - --delay-shutdown=30 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: app: backends apiVersion: v1 kind: Service metadata: name: backends annotations: service.kubernetes.io/topology-mode: "auto" spec: type: ClusterIP selector: app: backends ports: - protocol: TCP port: 80 targetPort: 80
  43. Copyrights©3-shake Inc. All Rights Reserved. 45 Topology Aware Routing の発動を予測し辛い

    • Topology Aware Routing が発動する条件 ◦ 5 台だとどう足掻いても発動しない ... ◦ HPA でスケールする場合や vCPU の異なるノードが複数あると予測し辛い 参考: https://aws.amazon.com/jp/blogs/containers/exploring-the-effect-of-topology-aware-hints-on-network-traffic-in-amazon-elastic-kubernetes-service/ Zone a b c vCPU 2 2 4 Endpoint 数 1 2 2 CPU 比率 2 / 8 = 25% 2 / 8 = 25% 4 / 8 = 50% 過負荷の閾値 0.2 必要な Endpoint 数 (小数点切り上げ) (5 * 0.25) / 1.2 ~ 2 (5 * 0.25) / 1.2 ~ 2 (5 * 0.5) / 1.2 ~ 3 発動するか? (EP >= 必要な EP) ❌ ⭕ ❌
  44. Copyrights©3-shake Inc. All Rights Reserved. 46 Topology Aware Routing の発動を予測し辛い

    • テスト用の Pod を 4 台起動 ◦ /hostname でホスト名 (Pod 名) を返す ◦ NodeAffinity で zone-a と zone-b に 2 台ずつ • Topology Aware Routing の annotation 指定 apiVersion: v1 kind: Service metadata: name: backends annotations: service.kubernetes.io/topology-mode: "auto" spec: type: ClusterIP selector: app: backends ports: - protocol: TCP port: 80 targetPort: 80 apiVersion: apps/v1 kind: Deployment metadata: name: backends spec: selector: matchLabels: app: backends replicas: 4 template: metadata: labels: app: backends spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: ["zone-a", "zone-b"] containers: - name: agnhost image: k8s.gcr.io/e2e-test-images/agnhost:2.39 args: - netexec - --http-port=80 - --delay-shutdown=30
  45. Copyrights©3-shake Inc. All Rights Reserved. 47 Topology Aware Routing の発動を予測し辛い

    • Topology Aware Routing が発動する条件 ◦ zone-a と zone-b は条件を満たしているが zone-c が満たしていない? ◦ TAR は賢いので、zone-a と zone-b から Endpoint を 1 つずつ zone-c に回す Zone a b c vCPU 2 2 4 Endpoint 数 2 2 0 CPU 比率 2 / 8 = 25% 2 / 8 = 25% 4 / 8 = 50% 過負荷の閾値 0.2 必要な Endpoint 数 (小数点切り上げ) (4 * 0.25) / 1.2 ~ 1 (4 * 0.25) / 1.2 ~ 1 (4 * 0.5) / 1.2 ~ 2 ヒント 1 1 2 発動するか? (EP >= 必要な EP) ⭕ ⭕ ⭕ ❯ kubectl get endpointslices -l kubernetes.io/service-name=backends \ -ojsonpath='{range .items[*].endpoints[*]}{.targetRef.name}: {.hints.forZones[*].name}{"\n"}{end}' backends-zone-a-8644bdf9c9-4rxwr: zone-c backends-zone-a-8644bdf9c9-9xcwq: zone-a backends-zone-b-cdc5ff985-pmpmf: zone-c backends-zone-b-cdc5ff985-jm9dk: zone-b
  46. Copyrights©3-shake Inc. All Rights Reserved. 48 Service の既存のトポロジー制御との兼ね合い • Service

    のトポロジー制御のおさらい ◦ externalTrafficPolicy (eTP) eTP=Cluster eTP=Local https://kep.k8s.io/1669 https://kep.k8s.io/1672 ノード上に Terminating 状態の Pod しかいない場合でも、サー ビスアウトしていない Pod に フォールバック (KEP-1669 + KEP-1672)
  47. Copyrights©3-shake Inc. All Rights Reserved. 49 Service の既存のトポロジー制御との兼ね合い • Service

    のトポロジー制御のおさらい ◦ internalTrafficPolicy (iTP) iTP=Cluster iTP=Local ノード上に正常な Pod がいない 場合はパケットがドロップされる ので注意 (KEP-2086) https://kep.k8s.io/2086
  48. Copyrights©3-shake Inc. All Rights Reserved. 50 Service の既存のトポロジー制御との兼ね合い • xTP=Local

    の場合、xTP=Local を優先 ◦ Topology Aware Routing にフォールバックしない • iTP には以前 PreferLocal モードの提案もあったが消えた ◦ Topology Aware Routing で実現した方が良いという話になった https://github.com/kubernetes/kubernetes/blob/v1.27.3/pkg/proxy/topology.go#L40-L53 func CategorizeEndpoints(...) (...) { var useTopology, useServingTerminatingEndpoints bool if svcInfo.UsesClusterEndpoints() { useTopology = canUseTopology(endpoints, svcInfo, nodeLabels) clusterEndpoints = filterEndpoints(endpoints, func(ep Endpoint) bool { if !ep.IsReady() { return false } if useTopology && !availableForTopology(ep, nodeLabels) { return false } return true }) …
  49. Copyrights©3-shake Inc. All Rights Reserved. 51 KEP-536: Topology-aware Service Routing

    の亡霊 • KEP-536 で出来ていた挙動を実現できない • ユーザーが Service に topologyKeys を指定 ◦ 上から順番に評価してフォールバックする ◦ 同一ノード -> ゾーン -> リージョン -> 通常 • 柔軟性はあるが冗長 ◦ アルファの段階で非推奨に ◦ KEP-2433 Topology Aware Hints に置き換わった ▪ ゾーンのみかつ CPU 数で計算される ▪ KEP-536 の挙動を再現できない ▪ 非推奨化を取り下げる要望も (https://pr.k8s.io/116300) apiVersion: v1 kind: Service metadata: name: backends spec: selector: app: backends ports: - protocol: TCP port: 80 targetPort: 80 topologyKeys: - "kubernetes.io/hostname" - "topology.kubernetes.io/zone" - "topology.kubernetes.io/region" - "*"
  50. Copyrights©3-shake Inc. All Rights Reserved. 52 Topology Aware Routing のモードの追加

    • ヒントを設定するコンポーネントと消費するコンポーネント ◦ e.g.) EndpointSlice Controller と kube-proxy • ヒントを設定する独自 EndpointSlice Controller の開発 ◦ KEP-3685: Move EndpointSlice Reconciler into Staging ▪ EndpointSlice を触るライブラリを他のプロジェクトでも使えるように • kube-proxy の機能を自前実装しているケースも出てきている ◦ e.g.) Cilium の Kubernetes without kube-proxy ◦ kube-proxy にだけ機能を入れれば良いという訳でもない ◦ サードパーティのツールにもモードの追加を強制するか?
  51. Copyrights©3-shake Inc. All Rights Reserved. 53 KEP-2433: Topology Aware Routing

    • 1.29 に向けた主な改善予定 ◦ 新しいモードである PreferZone の追加 ▪ 純粋にゾーン内の Pod にトラフィックを流す • ゾーン内に Pod がいない場合は通常の挙動 ▪ Topology Spread Constraints + Desceduler などで Pod が均等に分散されている前提 • 今後の予定 ◦ KEP-2433 Topology Aware Routing の GA は PreferZone の実装を待つ予定 ▪ KEP-2433 は永遠のベータ化しかけているので GA 化を目指す ◦ 同一ノード -> ゾーン -> リージョン -> クラスタ全体のフォールバックや重み付けは? ▪ 誰かが独自実装の EndpointSlice コントローラーで検証後にコア機能化を検討? • KEP-3685 EndpointSlice Reconciler into Staging