Kubernetes 1.31: SIG Cluster Lifecycle の変更内容

[Kubernetes 1.31 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md) から SIG Cluster Lifecycle の取り組みについてまとめました。

## :tada: ピックアップ :tada:

### `kubeadm.k8s.io/v1beta4`

`kubeadm` の設定ファイルのバージョン `kubeadm.k8s.io/v1beta4` がリリースされました。設定ファイルは以下のコマンドで移行することができます。

```bash
kubeadm config migrate
```

`v1beta3` は少なくとも 1.34 のリリースまでサポートされますが、以降削除される予定です。`kube-system/kubeadm-config` の設定ファイルは、`v1beta4` で保存されるようになります。

詳しくは以下を参照してください。

- https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta4/
- https://kubernetes.io/blog/2024/08/23/kubernetes-1-31-kubeadm-v1beta4/

#### :eyes: 変更点を簡単に

- `kubeadm reset/upgrade` のための新しい設定フォーマット `ResetConfiguration`, `UpgradeConfiguration` が追加されました。
- `InitConfiguration` と `JoinConfiguration` にて `dryRun` と `nodeRegistration.imagePullSerial` がサポートされました。
- 全てのコントロールプレーンの設定において、`extraEnvs` がサポートされました。
- `extraArgs` の構造が変更されました。
- `init`, `join`, `reset`, `upgrade`において、`timeouts` がサポートされました。

#### :scream: Breaking Change

- `extraArgs` が、重複するフラグ名をサポートするために `map[string][string]` から、`name/value` ペアのリストに変更されました。

今までの指定
```yaml
extraArgs:
  authorization-mode: "Node,RBAC"
```
これからの指定方法、
```yaml
extraArgs:
- name: "authorization-mode"
  value: "Node,RBAC"
```

- `JoinConfiguration.discovery.timeout` が、`JoinConfiguration.timeouts.discovery` に変更されました。
- `ClusterConfiguration.timeoutForControlPlane` が、`{Init|Join}Configuration.timeouts.controlPlaneComponentHealthCheck` に変更されました。

## :warning: アップグレード時の注意事項

- `kubeadm` に関連する注意事項は特になし

## :dizzy: 項目ごとの変更

### :do_not_litter: 非推奨

- `kubeadm`: `init kubelet-finalize` のサブフェーズである `experimental-cert-rotation` が非推奨となり、直接使用された場合は警告を表示するようになりました。このサブフェーズは将来のリリース(1.32)で削除される予定です。代替として、新しいサブフェーズ `enable-client-cert-rotation` が追加されました。 ([#124419](https://github.com/kubernetes/kubernetes/pull/124419), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]

- `kubeadm`: `RootlessControlPlane` フィーチャーゲート（以前はアルファ版）が非推奨となりました。これは、Kubernetes 本体の `UserNamespacesSupport` フィーチャーゲートが1.30でベータ版に昇格したことによるものです。
  Kubernetes 本体の `UserNamespacesSupport` が一般提供となり、`kubeadm` がユーザー名前空間のPodでコントロールプレーンを実行するサポートを開始した後、`kubeadm` の `RootlessControlPlane` フィーチャーゲートは完全に削除される予定です。
  `kubeadm` がユーザー名前空間機能を標準でサポートするまでの間、ユーザーは非推奨となった `RootlessControlPlane` フィーチャーゲートの使用を継続するか、静的ポッドマニフェストに対して `kubeadm` パッチを使用して `UserNamespacesSupport` をオプトインすることができます。 ([#124997](https://github.com/kubernetes/kubernetes/pull/124997), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]

:::note info
`kubeadm` パッチとは、`kubeadm init/join` 時に利用できる `--patch` フラグのことだと思われる。`--patch` を利用することで `kubeadm` が生成するコントロールプレーン用の Staic Pod のマニフェストにパッチを当てることができます。
:::

### :construction_site: APIの変更

- 特になし

### :unicorn: 機能

- `kubeadm`: `patch` が強化され、CoreDNS デプロイメントにパッチを適用できるようになりました。新しいパッチターゲットは `corednsdeployment` です（例：パッチファイル `corednsdeployment+json.json`）。これにより、`init` および `upgrade` 操作中に CoreDNS デプロイメントのカスタムパッチを適用することが可能になりました。 ([#124820](https://github.com/kubernetes/kubernetes/pull/124820), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle]

:::note info
`--patch` で指定するファイルは以下のフォーマットに従っている必要があります。
- `target[suffix][+patchtype].extension`

なので、上記例の `corednsdeployment+json.json` は `corednsdeployment` ターゲットのパッチタイプ `json` の `json` で書かれたパッチ、です。
:::

- `kubeadm`: `--experimental-output` フラグを非推奨としました（将来のリリースで削除される予定）。また、それに伴い同目的の新しいフラグ `--output` が追加されました。影響を受けるコマンドは `kubeadm config images list`、`kubeadm token list`、`kubeadm upgrade plan`、`kubeadm certs check-expiration` です。([#124393](https://github.com/kubernetes/kubernetes/pull/124393), [@carlory](https://github.com/carlory)) [SIG Cluster Lifecycle]

:::note info
実験的扱いであった以前のバージョンの `kubeadm` でもショートハンドのフラグは `-o` だったので、`-o` を使っていた場合には気づかない変更。
ってか、非推奨セクションの変更内容ではなかろうか。
:::

- 依存コンポーネント: `registry.k8s.io/pause:3.10` の利用を開始しました。 ([#125112](https://github.com/kubernetes/kubernetes/pull/125112), [@neolit123](https://github.com/neolit123)) [SIG CLI, Cloud Provider, Cluster Lifecycle, Node, Release, Testing and Windows]

:::note info
ChangeLogによると、`pause:3.9` -> `pause:3.10` の差分は Windows バイナリにおける `-v` フラグのサポートのみらしいです。
- See: https://github.com/kubernetes/kubernetes/pull/125067/files#diff-eab0794bb496828a58af2916c5aadac3a85847ba32689801bb94ab707ca479a1
:::

- `kubeadm`: `upgrade` 中、`etcd` のポッドがアップグレードを必要としない場合でも、`kube-apiserver.yaml` マニフェストがアップグレードされる予定で、かつ証明書の更新が無効化されていない場合は、etcd 証明書のローテーションと etcd 静的ポッドの再起動を考慮するようにしました。([#124688](https://github.com/kubernetes/kubernetes/pull/124688), [@neolit123](https://github.com/neolit123)) 

:::note info
生成されるetcdのStatic Podのマニフェストにdiffがなかった場合、アップグレードコマンド後に証明書が更新されていなかったようです。
:::

- `kubeadm` は CRI エンドポイントの操作に`crictl` のバイナリを直接利用していましたが、CRI クライアントライブラリを使用するように変更しました。`kubeadm` の `deb/rpm` パッケージは `cri-tools` パッケージを今後次リリース後でもインストールを行いますが、もしあなたのスクリプトが `cri-tools` を必要としているのならば、[`cri-tools`のレポジトリ](https://github.com/kubernetes-sigs/cri-tools/releases) か、もしくはその他の場所から自分でインストールする必要があります。
  `kubeadm` のパッケージは Kubernetes 1.32 で `cri-tools` パッケージに依存しなくなります。これは、`kubeadm` をインストールしても自動的に `crictl` のインストールが保証されなくなることを意味します。 ([#124685](https://github.com/kubernetes/kubernetes/pull/124685), [@saschagrunert](https://github.com/saschagrunert))

:::note info
`kubeadm` パッケージが結局いつから`cri-tools`に依存しなくなるのかよくわからなかった
> - The kubeadm deb/rpm packages will continue to install the `cri-tools` package for one more release,
> - The `kubeadm` package will stop depending on the `cri-tools` package in Kubernetes 1.32,

ので、PRを確認したところ、`1.32` のリリースパッケージから、`cri-tools` パッケージの依存が取り除かれるようです。

- https://github.com/kubernetes/release/pull/3626/files
:::

- `kubeadm`: `etcd 3.5.11` で導入された新しいエンドポイント `/livez`（livenessプローブ用）と `/readyz`（readiness とstartupプローブ用）を使用するように切り替えました。この変更により、`kubeadm 1.31` では `etcd 3.5.11` より古いカスタム `etcd` バージョンをデプロイすることはできなくなりました。もしそのような状況がある場合は、etcd をサポートされているバージョンにアップグレードしてください。([#124465](https://github.com/kubernetes/kubernetes/pull/124465), [@neolit123](https://github.com/neolit123))

- `kubeadm`: `kubeadm config images list` と `kubeadm token list` コマンドにおいて構造化出力を表示するために `output/v1alpha3` を使うようになりました。([#124464](https://github.com/kubernetes/kubernetes/pull/124464), [@carlory](https://github.com/carlory))

:::note info
`output/v1alpha2` を削除するために `output/v1alpha3` へアップデートしただけで、表示する内容は (バージョン番号以外) 変わらないようです。
:::

- `kubeadm`: `ControlPlaneKubeletLocalMode` フィーチャーゲートが追加されました。これは、`kubeadm init` でクラスタを作成する際や `kubeadm join` でコントロールプレーンノードを参加させる際に、`kubelet` がローカルの `kube-apiserver` エンドポイントを使用するよう指定するために利用できます。それに伴い `kubeadm join` ワークフローに、`control-plane-join-etcd` と `kubelet-wait-bootstrap` という2つの新しい実験的フェーズが追加されました。これらのフェーズはこのフィーチャーゲートが有効な場合に使用されます。`ControlPlaneKubeletLocalMode` が GA（一般提供）になると、これらのフェーズは実験的というフラグが解除されます。
  またアップグレードにおいて、`kubeadm upgrade` コマンド実行時にこのフィーチャーゲートが有効な場合、`/etc/kubernetes/kubelet.conf` を変更してローカル `kube-apiserver` エンドポイントを使用するようになります。このアップグレードメカニズムは、このフィーチャーゲートが一般提供された際にハードコードで `true` に設定された時点で削除されます。([#125582](https://github.com/kubernetes/kubernetes/pull/125582), [@chrischdi](https://github.com/chrischdi))

### :bug: バグ、もしくはリグレッション

- `kubeadm`: `ResolverConfig` をグローバルな `KubeletConfiguration` に保存することを停止し、代わりに各ノードに対して動的に設定するようになりました。([#124038](https://github.com/kubernetes/kubernetes/pull/124038), [@SataQiu](https://github.com/SataQiu))
- `kubeadm`: `kubeadm upgrade` コマンド実行時に、`kube-system/kubelet-config ConfigMap` から `KubeletConfiguration` が適切にダウンロードされない問題を修正しました。この問題により、ローカルの `/var/lib/kubelet/config.yaml` ファイルがデフォルト設定として書き込まれていました。([#124480](https://github.com/kubernetes/kubernetes/pull/124480), [@neolit123](https://github.com/neolit123))
- `kubeadm`: `--yes` フラグを許可されたフラグのリストに追加しました。これにより、`kubeadm upgrade apply --config` と組み合わせて使用できるようになりました。 ([#125566](https://github.com/kubernetes/kubernetes/pull/125566), [@xmudrii](https://github.com/xmudrii))

:::note info
`kubeadm upgrade apply` 時に、`--config` と `--yes` を組み合わせて利用することができてなかったようです。
:::

- `kubeadm`: `kubeadm upgrade` の事前チェック `CreateJob` 中に、ポッドをスケジュールできるノードが存在しないかどうかを確認するようにしました。ノードが存在しない場合、警告を表示してこの事前チェックをスキップできます。この警告は、ノードが一つのクラスタで、そのノードがドレインされた場合に発生する可能性があります。([#124503](https://github.com/kubernetes/kubernetes/pull/124503), [@neolit123](https://github.com/neolit123))
- `kubeadm`: `PublicKeysECDSA` フィーチャーゲートが `kubeconfig` ファイルを生成する際に無視されていた問題を修正しました。([#125388](https://github.com/kubernetes/kubernetes/pull/125388), [@neolit123](https://github.com/neolit123))
- `kubeadm`: `JoinConfiguration.discovery.timeout` が無視され、値が常に "5m"（5分）にハードコードされていた回帰を修正しました。 ([#125480](https://github.com/kubernetes/kubernetes/pull/125480), [@neolit123](https://github.com/neolit123))
- `kubeadm`: `kube-apiserver` と `kube-controller-manager` のPodにおいて、追加の Linux システムの認証局ディレクトリとして `/etc/pki` をマウントするサポートを削除しました。代わりに、`/etc/pki/ca-trust` と `/etc/pki/tls/certs` のマウントをサポートするように変更しました。`/etc/ca-certificates`、`/usr/share/ca-certificates`、`/usr/local/share/ca-certificates` および `/etc/ssl/certs` の各ロケーションは引き続きサポートされています。([#124361](https://github.com/kubernetes/kubernetes/pull/124361), [@neolit123](https://github.com/neolit123))
- `kubeadm`: `kubelet` のヘルスチェック時に、ハードコードされた`localhost:10248` 利用する代わりに、`KubeletConfiguration` で設定された `healthz` の `address:port` が使用されるようになりました。([#125265](https://github.com/kubernetes/kubernetes/pull/125265), [@neolit123](https://github.com/neolit123))
- `kubeadm`: ディスク上の既存の `kubeconfig` ファイルの検証中に、`ca.crt` が証明書バンドルであり、中間証明書を含む場合に対応するようになりました。`ca.crt` を単一の CA を含むファイルとして扱うのではなく、`ca.crt` バンドルとディスク上の既存の `kubeconfig` 内の `CA` との間で共通の信頼アンカーを見つけるようになりました。([#123102](https://github.com/kubernetes/kubernetes/pull/123102), [@astundzia](https://github.com/astundzia))
- `kubeadm`: `kubeadm join` コマンドにおいて、`kubeletconfiguration` ターゲットを持つパッチを使用した場合に、ローカルの `kubelet healthz` チェックを実行する際にそのパッチが反映されていなかったバグを修正しました。([#126224](https://github.com/kubernetes/kubernetes/pull/126224), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
- `kubeadm`: `kubeadm upgrade diff` コマンドで設定ファイルを指定した際にマニフェストのパスを指定できないバグを修正しました。また、`kubeadm upgrade diff` コマンドの `--api-server-manifest`、`--controller-manager-manifest`、`--scheduler-manifest` フラグは非推奨とマークされ、将来のリリースで削除される予定です。([#125779](https://github.com/kubernetes/kubernetes/pull/125779), [@SataQiu](https://github.com/SataQiu))
- `kubeadm`: `kubeadm upgrade apply/plan` コマンドにおいて、`--feature-gates` フラグは非推奨となり、効果がなくなりました。このフラグは将来のリリースで削除される予定です。アップグレードのワークフローはクラスターの再設定を行うようには設計されていません。代わりに、`kube-system/kubeadm-config ConfigMap`で定義されている`ClusterConfiguration`の`featureGates`フィールドを編集してください。([#125797](https://github.com/kubernetes/kubernetes/pull/125797), [@SataQiu](https://github.com/SataQiu))
- `kubeadm`: `kubeadm init phase certs sa` コマンドが `--config` フラグを受け付けられるようになりました。 ([#125396](https://github.com/kubernetes/kubernetes/pull/125396), [@Kavinraja-G](https://github.com/Kavinraja-G))
- `kubeadm`: 特定のWindows環境で失敗しないように、`IsPrivilegedUser` プレフライトチェックを改善しました。([#124665](https://github.com/kubernetes/kubernetes/pull/124665), [@neolit123](https://github.com/neolit123))

### :thought_balloon: その他（クリーンアップまたはフレーク）

- `kubeadm`: 非推奨となっていた `UpgradeAddonsBeforeControlPlane` フィーチャーゲートを削除しました。また、`CoreDNS`と`kube-proxy`アドオンのアップグレードが、すべてのコントロールプレーンインスタンスがアップグレードされるまでトリガーされないようにしました。([#124715](https://github.com/kubernetes/kubernetes/pull/124715), [@SataQiu](https://github.com/SataQiu))
- `kubeadm`: サポートされている `klog` フラグのみを厳密に有効にし、以前は利用可能だが推奨されていなかったオプションを無効にしました。これにより、`klog` に関する隠しフラグ（`--alsologtostderr`、`--log-backtrace-at`、`--log-dir`、`--logtostderr`、`--log-file`、`--log-file-max-size`、`--one-output`、`--skip-log-headers`、`--stderrthreshold`、`--vmodule` を含む）が使用できなくなりました。([#125179](https://github.com/kubernetes/kubernetes/pull/125179), [@SataQiu](https://github.com/SataQiu))
- `kubeadm`: グローバルな `--rootfs` フラグが非実験的とみなされるようになりました。([#124375](https://github.com/kubernetes/kubernetes/pull/124375), [@neolit123](https://github.com/neolit123))
- `kubeadm`: `validateSupportedVersion` の警告/エラーメッセージを改善し、チェックされたリソースの種類名を含めるようにしました。([#125758](https://github.com/kubernetes/kubernetes/pull/125758), [@SataQiu](https://github.com/SataQiu))
- `kubeadm`: `kubeadm join control-plane-prepare download-certs` フェーズから `EXPERIMENTAL`（実験的）タグを削除しました。([#124374](https://github.com/kubernetes/kubernetes/pull/124374), [@neolit123](https://github.com/neolit123))
- `kubeadm`: 構造化出力のための非推奨の `output.kubeadm.k8s.io/v1alpha2` APIを削除しました。代わりに`v1alpha3`を使用してください。([#124496](https://github.com/kubernetes/kubernetes/pull/124496), [@carlory](https://github.com/carlory))
- `kubeadm`: 非推奨で効果のない（NO-OP）`kubeadm join control-plane-join update-status` フェーズを削除しました。([#124373](https://github.com/kubernetes/kubernetes/pull/124373), [@neolit123](https://github.com/neolit123))
- `kubeadm`: `kubeadm` がプリフライトチェック中に実行する `NodeSwap` チェックに、スワップが正しく設定されているかを確認する新しい警告が追加されました。([#125157](https://github.com/kubernetes/kubernetes/pull/125157), [@carlory](https://github.com/carlory))