8月26日、Kubernetes.ioが「Kubernetes v1.37: Garhwal」と題した記事を公開した。
Kubernetes v1.37「Garhwal(गढ़वाल)」の最大の見どころは2点だ。HPA(HorizontalPodAutoscaler)のゼロスケールがBetaに昇格してデフォルト有効になったことと、kubectl topやHPAが依存するmetrics.k8s.io APIが約9年間のBeta生活を経てついにStable(v1)に昇格したことである。今回は67件のエンハンスメントを含み、Stable昇格16件・Beta昇格23件・新規Alpha追加27件と、実運用に直結する変化が多い。
コスト削減に直結:HPA scale to zero がBetaへ(デフォルト有効)
HorizontalPodAutoscalerのゼロスケールがBetaに昇格し、デフォルト有効になった(KEP #2021、SIG Autoscaling 主導)。
v1.16で初登場した機能だが、ようやくデフォルトで使えるようになった。spec.minReplicas: 0を設定すると、アイドル時にPodを0台まで縮小し、需要が戻ると自動で復元する。キューコンシューマー、バッチジョブ、GPUワークロードなど、外部メトリクスまたはオブジェクトメトリクスを使う場合に限られる点は注意が必要だ。
CPUやメモリメトリクスによるゼロスケールは非対応。Podが0台の状態ではそれらのメトリクスが取得できないためだ。HPAがゼロ台を維持している間はステータスにScaledToZero: Trueのコンディションが記録され、手動でレプリカ数を0に設定した場合と区別できる。クラウド費用の削減を考えているチームにとって、まず試す価値がある機能だ。
9年越しのStable昇格:metrics.k8s.io API
kubectl topやHPAが依存するmetrics.k8s.io APIが、約9年間Betaに留まった末にStable(v1)へ昇格した(KEP #5207、SIG Instrumentation 主導)。
Kubernetesプロジェクトが掲げる「永続的なBeta APIを避ける」方針のもとでの昇格だ。v1beta1はAPIの廃止ポリシーに従い引き続き使用可能なため、既存の構成への即時影響はない。モニタリングやオートスケーリングの基盤として長らく使われてきたAPIが正式版になったことで、ツールチェーン側の安定的なサポートが進むことも期待される。
要注意:SELinuxMountの挙動変更(Stable)
SELinuxMount / SELinuxChangePolicyがStableに昇格し、ボリュームのSELinuxラベル付けがデフォルトでマウントオプション方式(-o context=<label>)に切り替わる。
異なるSELinuxラベルを持つPodが同一ノードでボリュームを共有している構成では、Podの起動に失敗する可能性がある。 該当する場合は.spec.seLinuxChangePolicy: Recursiveで従来の挙動に戻せる。v1.38でロックオンとなる予定のため、クラスター全体での無効化はv1.37が最後の機会となる。既存クラスターを運用しているチームは早めに影響確認を行いたい。
コントロールプレーンの安定化:Resilient watchcache initialization(Stable)
Resilient watchcache initializationが今回でStable完結となった(KEP #4568、SIG API Machinery 主導)。WatchCacheInitializationPostStartHookフィーチャーゲートはStableに昇格し、ロックオン(無効化不可)となる。
kube-apiserverの起動時・再起動時に、watchcacheの初期化完了前にlistやwatchリクエストがetcdに殺到する「起動時スパイク」が問題だった。v1.37以降はAPI Priority and Fairnessの範囲内で処理できないリクエストにHTTP 429を返す設計になり、大規模クラスターでのコントロールプレーン障害リスクが下がる。カスタムコントローラーやOperatorを実装している場合、429 Too Many Requestsに対してRetry-Afterヘッダーを尊重した指数バックオフの実装が求められるため、既存のリトライ処理は要確認だ。
そのほかの主要変更
KYAMLがStable(KEP #5295、SIG CLI 主導)。KYAMLはKubernetes向けにYAMLのあいまいな仕様(ノルウェー語問題などの型推論の罠)を排除したサブセットで、すべてのKYAMLファイルは通常のYAMLとしても有効に動作する。既存のマニフェストやパイプラインへの影響はなく、kubectl get -o kyamlがStableとなった。
Manifest-based admission control がBeta(KEP #5793、SIG API Machinery 主導)。アドミッションウェブフックやCELベースのポリシーをディスク上のマニフェストファイルから読み込む機能で、AdmissionConfigurationのstaticManifestsDirフィールドで指定する。etcdが利用不可な状態でも起動時からポリシーが適用されるため、クラスターのブートストラップ時のセキュリティ強化に有効だ。
Pod-level checkpoint and restore がAlpha(KEP #5823、SIG Node 主導)。コンテナ単位で提供されていたCRIUベースのチェックポイント・リストア機能をPod単位に拡張する。CRIにCheckpointPodとRestorePodのRPCが追加されるが、コンテナランタイム側でも実装が必要となる。
DRA(Dynamic Resource Allocation)では複数の機能がStableに昇格。ResourceClaimのステータスフィールドでネットワークデバイスのIPアドレスなどを公開できるようになり、セカンダリネットワークインターフェースへのDRA活用が実用的になった。abc.example/gpu: 3のような従来の拡張リソース記法をDRAドライバーで処理できる機能と、デバイスへのtaint/toleration機能もStableとなっており、GPUやネットワーク専用デバイスの管理をよりKubernetesネイティブな方法で行えるようになる。
詳細はKubernetes v1.37: Garhwalを参照していただきたい。