Kubernetes 1.24: SIG Cluster Lifecycle の変更内容

[Kubernetes 1.24 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md) から SIG Cluster Lifecycle の取り組みについてにピックアップしました。

## 主要テーマ (Major Themes)

- なし。

## 重大なアップグレードに関する警告 (Urgent Upgrade Notes)

- **`kubeadm/k8s.io/v1beta2` は非推奨になり、3リリース以内(約一年)の将来のバージョンで削除されます。新しいクラスタに対しては`kubeadm.k8s.io/v1beta3`を利用してください。ディスクに保存してある古い設定ファイルは `kubeadm config migrate` コマンドで移行することができます。** ([#107013](https://github.com/kubernetes/kubernetes/pull/107013), [@pacoxu](https://github.com/pacoxu))
  - :pencil: https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/

- **kubeadm: デフォルトのcontainerd向けのソケットのパスの設定が Docker のパスでは無くなりました(Unix: `unix:///var/run/containerd/containerd.sock`, Windows: `npipe:////./pipe/containerd-containerd`)。もし、クラスタ作成中に`Init|JoinConfiguration.nodeRegistration.criSocket` の設定が空白で、複数のソケットが見つかった場合、エラーが発生し、どの値を利用するかについてユーザに尋ねるようになりました。kubeadmのバージョンが1.24以上の場合、kubeletのバージョンが1.23以下であったとしてもディスク状のkubeadmの設定ファイルにdockershimのソケットを含めないようにしてください。kubeadm preflightから`docker`サービスのための`DockerValidator`と`ServiceCheck`が削除されました。Dockerは現在ホスト検証の際の特別なケースはなく、理想的にはこのタスクは互換性の問題となり、外部のcri-dockerdプロジェクトで行われるべきものです。Dockerのためのdocker cliを使わずに、実行中のコンテナリストの取得や、イメージの取得のようなCRIソケットを介したすべての利用には`crictl`を使うようにしてください。** ([#107317](https://github.com/kubernetes/kubernetes/pull/107317), [@neolit123](https://github.com/neolit123))

- **kubeadm: labelsやtaintsから`master`という単語の利用をやめるプランの第二ステージを適用します。新しいクラスタのコントロールプレーンのノードに対して`node-role.kubernetes.io/master`のラベルは付与されず、`node-role.kubernetes.io/control-plane`のラベルのみが付与されます。`kubeadm upgrade apply`を利用して1.24にアップグレードされるクラスタに対しては、コントロールプレーンのノードから既存の`node-role.kubernetes.io/master`のラベルが削除されます。また、新しいクラスタには、古いtaintである`node-role.kubernetes.io/master:NoSchedule`と新しいtaintである`node-role.kubernetes.io/control-plane:NoSchedule`両方がコントロールプレーンのノードに付与されます。1.20リリース時(第一ステージ)のリリースノートでは、前もってこの新しいtaintに対して許容するように指示してありました。`kubeadm upgrade apply`を利用して1.24にアップグレードされるクラスタに対しては、既存のコントロールプレーンのノードに新しく`node-role.kubernetes.io/control-plane:NoSchedule`のtaintが付与されます。これらの変更に対応するようお願いします。1.25リリース時に古いtaintである`node-role.kubernetes.io/master:NoSchedule`は削除されます。** ([#107533](https://github.com/kubernetes/kubernetes/pull/107533), [@neolit123](https://github.com/neolit123))
  - :pencil: コントロールプレーンで起動するPodには`role.kubernetes.io/control-plane:NoSchedule`のtaintに対してtolerationを設定してください。
  - :pencil: コントロールプレーンで起動するPodには、`node-role.kubernetes.io/control-plane` 対してセレクタを設定してください。

## 種類別の変更 (Changes by Kind)

### 廃止予定 (Deprecation)

- **kubeadm: `UnversionedKubeletConfigMap` Feature Gate がベータになりデフォルトで有効化されました。これにより、1) 新しいクラスターでは古い`kubelet-config-x.yy`という命名フォーマットに従ったものではなく、RBACやKubeletのConfigMapの命名フォーマットとして`kube-system/kubelet-config` が利用されるようになります。2)アップグレード中にkubeadmはConfigMapやRBACにこの新しい命名フォーマットを利用します。この機能を無効化するには、新しいクラスタの場合はkubeadmの設定ファイルにて`UnversionedKubeletConfigMap: false`を指定してください。既存のクラスタをアップグレードする場合は`kube-system/kubeadm-config`中のClusterConfigurationにパッチをすることで振る舞いを上書きしてください。詳細は関連するKEPを読んでください。** ([#108027](https://github.com/kubernetes/kubernetes/pull/108027), [@neolit123](https://github.com/neolit123))
  - :pencil: https://github.com/kubernetes/enhancements/issues/2915

### APIの変更 (API Change)

- なし。

### 機能 (Feature)

- **kubeadm: `kubeadm reset`のdry-runのサポートを追加しました。新しい`kubeadm reset --dry-run`フラグは既存の`kubeadm init/join/upgrade`フラグと同じように、どんな変更が適用されるのかを確認することができるようになります。** ([#107512](https://github.com/kubernetes/kubernetes/pull/107512), [@SataQiu](https://github.com/SataQiu))

- **kubeadm: etcdメンバーのデータ一貫性を保証するために、etcd static Podのマニフェストに `--experimental-initial-corrupt-check` フラグを追加しました。** ([#109074](https://github.com/kubernetes/kubernetes/pull/109074), [@neolit123](https://github.com/neolit123))

- **kubeadm: kubeadm アップグレード時に、コントロールプレーンノード上のstatic podを再起動するための kubelet を待機する際のエラーをより適切に表示するようにしました。** ([#108315](https://github.com/kubernetes/kubernetes/pull/108315), [@Monokaix](https://github.com/Monokaix))
  - :pencil: `kubeadm upgrade`時に、コントロールプレーンノード上のstatic podを更新する際、古いstatic podのマニフェストのhashを計算するらしいのですが、その計算時にエラーが発生した場合にちゃんとそのエラーがユーザに戻らないため、なんで失敗したのかわからなくて困ってた、という話らしいです。

- **kubeadm: ユーザの YAML/JSON で書かれた設定ファイルの厳密な解析を改善しました。重複したフィールドや未知のフィールドがあった場合、警告を表示し(現場の振る舞い)、そののちに例えば `controlPlaneEndpoint` が正しく `ControlPlaneEndpoint` が不正、などのような大文字と小文字の区別が正しくないフィールドに対する警告も表示するようにしました。`init`時と`join`時に警告を表示するだけでなく、`ClusterConfiguration`, `KubeletConfiguration` または `KubeProxyConfiguration` をクラスターからダウンロードする際にも警告を表示するようにしました。この警告はユーザがそれぞれのConfigMapを間違ってパッチしていた場合に便利です。** ([#107725](https://github.com/kubernetes/kubernetes/pull/107725), [@neolit123](https://github.com/neolit123))

### バグ修正 (Bug or Regression)

- **kubeadm: kubeconfigファイルの証明書の期限をチェックする際に、`certs check-expiration` コマンドにてクラスタのCA key(ca.key file)を必要としないようになりました。** ([#106854](https://github.com/kubernetes/kubernetes/pull/106854), [@neolit123](https://github.com/neolit123))

- **kubeadm: `certs check-expiration`コマンドの実行中、etcd CAキーファイル（`etcd/ca.key`）がない場合はetcd CAを外部CAとして扱い、etcd CAによって署名された証明書に適切な検証を実行します。さらに、ディスク上の証明書と`kubeconfig`ファイル内の証明書の両方について、出力テーブルのすべてのエントリのCAが含まれていることを確認するようにしました。** ([#106891](https://github.com/kubernetes/kubernetes/pull/106891), [@neolit123](https://github.com/neolit123))

- **kubeadm: `KubeletConfiguration` の `resolvConf` フィールドの値が `/run/systemd/resolve/resolv.conf` と一致しない場合に出力される警告に関連するバグを修正しました。** ([#107785](https://github.com/kubernetes/kubernetes/pull/107785), [@chendave](https://github.com/chendave))
  - :pencil: `resolvConf` に `/run/systemd/resolve/resolv.conf` を設定していても、`/run/systemd/resolve/resolv.conf` を設定していない、という警告が出ていたようです。
  - :pencil: 修正を見ると、文字列を比較するつもりがポインタ同士を比較してミスっていたようです。

- **kubeadm: `/etc/kubernetes/pki`にあるCAファイル(`ca.key`/`ca.crt`)と共に`kubeadm init --dry-run`を使った際のバグを修正しました。** ([#108410](https://github.com/kubernetes/kubernetes/pull/108410), [@Haleygo](https://github.com/Haleygo))
  - :pencil: `ca.key`, `ca.crt` がある状態で `kubeadm init --dry-run`が動作しなかったようです。
  - :pencil: 既存の CAファイルを考慮してdry-runしていなかったようです。

- **kubeadm: preflight errorが起こり、IPv6を利用したクラスターにWindowsノードがJoinできなかった問題を修正しました。** ([#108769](https://github.com/kubernetes/kubernetes/pull/108769), [@SataQiu](https://github.com/SataQiu))

- **kubeadm: `kubeadm certs generate-csr`コマンドが重複するSANsを取り除かなかったバグを修正しました。** ([#107982](https://github.com/kubernetes/kubernetes/pull/107982), [@SataQiu](https://github.com/SataQiu))

### その他 (Other (Cleanup or Flake))

- **kubeadm: すべての警告メッセージが、標準出力ではなく、標準エラー出力に表示されるようになりました。** ([#107467](https://github.com/kubernetes/kubernetes/pull/107467), [@SataQiu](https://github.com/SataQiu))

- **kubeadm: 新しいクラスタを作成する際の dockershim 関連フラグの削除に対する処理を追加しました。kubeletのバージョンが1.23以下、かつkubeadmのバージョンが1.24以上の場合は、ユーザがkubeadmの設定ファイルである`{Init|Join}Configuration.nodeRegistration.criSocket`にUnixにおいては`unix:///var/run/dockershim.sock`、Windowsにおいては`npipe:////./pipe/dockershim`を設定した場合、ビルトインのdockershimを利用し続けることができます。もし、kubeletのバージョンが1.24以上かつ、kubeadmのバージョンが1.24以上の場合はすべてのコンテナランタイムを`--container-runtime=remote --container-runtime-endpoint=scheme://some/path` のフラグを利用して "remote"として取り扱います。kubeletのバージョン1.23以下の場合の特別な処理は、kubeadm 1.25で削除されます。** ([#106973](https://github.com/kubernetes/kubernetes/pull/106973), [@neolit123](https://github.com/neolit123))

- **kubeadm: `kubeadm init/join` がkubeletに`--container-runtime-endpoint`を渡す際に、常にURLスキーム(Linux: `unix://`, Windows: `npipe://`)を使うようにしました。このフラグの値はkubeadmの設定ファイルの`criSocket`フィールドか、CLIの`--cri-socket`フラグから得られた値です。ユーザの設定にURLスキームが欠けていた場合はメモリ内で自動的に追加されますが、ユーザにはディスクに保存された設定ファイルを更新するように警告がなされます。`kubeadm upgrade apply/node`コマンドの実行時に、必要な場合はNodeオブジェクトに対する`kubeadm.alpha.kubernetes.io/cri-socket`アノテーションとディスク上の`/var/lib/kubelet/kubeadm-flags.env`ファイルが変更されます。これらの自動的な振る舞いは一時的なもので将来のバージョンで削除されます。また、将来のkubeletでURLスキームが設定されていないCRIのエンドポイントはサポートされなくなるかもしれません。** ([#107295](https://github.com/kubernetes/kubernetes/pull/107295), [@neolit123](https://github.com/neolit123))

- **kubeadm: いくつかのkubeadmのコマンドで出力の機械可読性のために利用されている非推奨の`output/v1alpha1`APIが削除されました。kubeadm の 1.23 ではすでに `output/v1alpha2` を利用していました。** ([#106648](https://github.com/kubernetes/kubernetes/pull/106648), [@calvin0327](https://github.com/calvin0327))

- **kubeadm: `ca.crt`に一つの証明書しか含むことができないという制約を削除しました。複数の証明書が`ca.crt`に含まれていた場合、kubeadmは最初の証明書をデフォルトで利用します。** ([#107327](https://github.com/kubernetes/kubernetes/pull/107327), [@SataQiu](https://github.com/SataQiu))
  - :pencil: 外部のCAを利用する場合、その証明書には全ての証明書チェーンの証明書が含まれている場合があります。