Kubernetes 1.25: SIG Cluster Lifecycle の変更内容

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

いつもより変更が少なく、落ち着いてきた感じがします。


## 主要テーマ (Major Themes)

- なし。

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

- なし。

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

### 廃止予定 (Deprecation)

- **kubeadm: `ConfigMap` "kubeadm-config" の `ClusterConfiguration.imageRepository` に古い"k8s.gcr.io"が含まれていた場合、"upgrade apply/diff/node" 中にそれを新しいデフォルトである "registry.k8s.io" に置き換えます。ただし、更新の反映は "upgrade apply" の場合のみに行われます。** ([#110343](https://github.com/kubernetes/kubernetes/pull/110343), [@neolit123](https://github.com/neolit123))

- **kubeadm: kubeadm 特有のフィーチャーゲートである`UnversionedKubeletConfigMap`がGAとなり、デフォルトで有効化されるようになりました。kubeletに関連した`ConfigMap`と`RBAC`ルールは古い`*kubelet-config-x.yy`(`x.yy`はコントロールプレーンのバージョンです)というネーミングルールから、シンプルな`*kubelet-config`という名前になりました。もし、以前に`UnversionedKubeletConfigMap`を`false`に設定し古いネーミングフォーマットを利用していた場合、のバージョンを`v1.25`に上げる前に手作業で `kube-system/kubelet-config-x.yy` を `kube-system/kubelet-config` にコピーしなければなりません。** ([#110327](https://github.com/kubernetes/kubernetes/pull/110327), [@neolit123](https://github.com/neolit123))

- **kubeadm: `node-role.kubernetes.io/master:NoSchedule` taintを新しいクラスタのコントロールプレーンに適用することはなくなりました。また、"kubeadm upgrade apply"中に既存のtaintをコントロールプレーンから削除します。** ([#110095](https://github.com/kubernetes/kubernetes/pull/110095), [@neolit123](https://github.com/neolit123))

  - :pencil: `node-role.kubernetes.io/master` のリネームは段階的に4つのステップで行われているのですが、これは三つ目の段階となり、次のリリースでひと段落となります。
      1. First Stage (1.20)
          - Label: `node-role.kubernetes.io/control-plane` の導入。
          - Toleration: `node-role.kubernetes.io/control-plane:NoSchedule` の導入。
      2. Second Stage (1.24)
          - Label: `node-role.kubernetes.io/master` の削除。
          - Taint: `node-role.kubernetes.io/control-plane:NoSchedule` の導入。
      3. Third Stage (1.25)
          - Taint: `node-role.kubernetes.io/master:NoSchedule` の削除。
      4. Fourth Stage (1.26)
          - Toleration: `node-role.kubernetes.io/master:NoSchedule` の削除。

### APIの変更 (API Change)

- なし。

### 機能 (Feature)

- **kubeadm: `kubeadm join`時の`discovery/kubeconfig`を使った追加の認証戦略 "client-go 認証プラグイン `exec`, `tokenFile`, `authProvider`" がサポートされました。** ([#110553](https://github.com/kubernetes/kubernetes/pull/110553), [@tallaxes](https://github.com/tallaxes))
    - :pencil: `kubeadm join` 時に、`kubeadm init` の際に提示された token を使うことが多いと思いますが、それとは別に `kubeconfig` ファイルをjoin時のクラスタへの接続とその認証に払い出されたトークンの代わりに利用することができるようです。
      確かに、トークンを毎回払い出さずに、事前に`join`に必要な権限を渡してあるアカウントを作成しておけば運用が楽になりそうです。

- **kubeadm: CoreDNSのバージョンをv1.9.3にアップデートしました。** ([#110489](https://github.com/kubernetes/kubernetes/pull/110489), [@pacoxu](https://github.com/pacoxu))

- **kubeadm: `kubeadm init phase addon` における `kube-proxy`, `coredns` のアドオンフェーズ位において `--print-manifest` フラグがサポートされました。このフラグを指定すると、`kubeadm` は指定されたアドオンを適用せず、代わりに適用される API オブジェクトをターミナルに表示します。** ([#109995](https://github.com/kubernetes/kubernetes/pull/109995), [@wangyysde](https://github.com/wangyysde))

- **kubeadm: `v1beta1.KubeletConfiguration` に含まれる kubelet の設定ファイルをパッチできるようになりました。この新しいパッチターゲットは`kubeletconfiguration`と呼ばれています(e.g. パッチファイルは `kubeletconfiguration+json.json`)。メインの`--config`の一部として`init`に渡される`KubeletConfiguration`はクラスターの`KubeletConfiguration`としてグローバルに保持されますが、このパッチにより`init`および`join`と`upgrade`時にノード特有の`KubeletConfiguration`を適用することが可能になります。** ([#110405](https://github.com/kubernetes/kubernetes/pull/110405), [@neolit123](https://github.com/neolit123))

- **kubeadm: etcd static podの `liveness probe` が `/health?serializable=true&exclude=NOSPACE` を利用しているのに対して startup probe は `/health?serializable=false` を利用するようになりました。NOSPACE除外は、管理者がetcdの1メンバーずつスペースの問題に対処することを可能にします。** ([#110744](https://github.com/kubernetes/kubernetes/pull/110744), [@neolit123](https://github.com/neolit123))

- **kubeadm: etcd static podの`liveness`および`readiness`probeにおいて、新しいetcd v3.5.3+以降のヘルスチェック用エンドポイントである`/health?serializable=true`を使うように変更しました。これにより、個々のetcdメンバーの状態をトラックすることができるようになり、もしetcdクラスターの一部のメンバーが正常でなかった場合でも全てのetcdのメンバーが失敗するようなことがなくなりました。** ([#110072](https://github.com/kubernetes/kubernetes/pull/110072), [@neolit123](https://github.com/neolit123))

- **kubeadm: `kubeadm upgrade plan` 時に、`--output`フラグを使うことで実験的に`JSON/YAML`を出力することができるようになりました。** ([#108447](https://github.com/kubernetes/kubernetes/pull/108447), [@pacoxu](https://github.com/pacoxu))

- **kubeadm: CoreDNS に preferred anti-affinity がデフォルトで有効化されるようになりました。** ([#110593](https://github.com/kubernetes/kubernetes/pull/110593), [@SataQiu](https://github.com/SataQiu))

```yaml
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: k8s-app
            operator: In
            values:
            - kube-dns
        topologyKey: kubernetes.io/hostname
      weight: 100
```

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

- **kubeadm: ノードのアノテーション中の重複した `unix://` プレフィックスを削除しました。** ([#110656](https://github.com/kubernetes/kubernetes/pull/110656), [@pacoxu](https://github.com/pacoxu))

- **kubeadm: 設定可能な`KubernetesVersion`が`kubeadm join`時に適用されていなかった問題を修正しました。** ([#110791](https://github.com/kubernetes/kubernetes/pull/110791), [@SataQiu](https://github.com/SataQiu))

- **kubeadm: etcdの`--experimental-watch-progress-notify-interval`フラグが有効化され、5秒に設定されました。このフラグはetcdがwatch dataをkube=apiserverに送る際のインターバルを指定します。** ([#111383](https://github.com/kubernetes/kubernetes/pull/111383), [@p0lyn0mial](https://github.com/p0lyn0mial))

- **kubeadm: image pullの間、`crictl`を実行する際にOSの環境変数を設定するようにしました。これにより`crictl`のインターネット接続に対して`*PROXY`環境変数が影響を与えることができなかった問題を修正しました。** ([#110134](https://github.com/kubernetes/kubernetes/pull/110134), [@mk46](https://github.com/mk46))

- **kubeadm: レガシーな "master"taintが存在する場合にのみ、コントロールプレーンノードをtaintするようにしました。これにより、`kubeadm upgrade` を行うと、ユーザーが明示的にノードのtaintを解除した場合でも、新しい "control plane" taintでコントロールプレーンノードが再テイントされるという問題を回避することができます。** ([#109840](https://github.com/kubernetes/kubernetes/pull/109840), [@neolit123](https://github.com/neolit123))
    - :pencil: リソースの少ない自宅クラスタだとコントロールプレーンノードも有効活用するためにtaintを外すということはよくあります。

- **kubeadm: Kubernetes の CI バージョンを使う際、ユーザの指定したイメージレポジトリを配慮するようになりました。** ([#111017](https://github.com/kubernetes/kubernetes/pull/111017), [@SataQiu](https://github.com/SataQiu))

- **kubeadm: resetフェーズにおけるコンテナの削除時にリトライを行うようになりました。** ([#110837](https://github.com/kubernetes/kubernetes/pull/110837), [@SataQiu](https://github.com/SataQiu))
    - :pencil: resetでコンテナが削除されないことがあり、それがたまたまapiserverなどのようにkubernetesに必須のポートを使うコンテナだった場合、再度行った `kubeadm init`でkubeadmが失敗することがあったようです。

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

- **kubeadm: 追加のdockershimのクリーンアップを実行するようにしました。dockershimが1.24で削除され、kubeadm 1.25がkubeletのversion 1.24と1.25をサポートすることを考慮し、全てのcontainer runtimeが`--container-runtime=remote`を指定することでremoteとして扱われるようにしました。`--network-plugin`フラグは新しいクラスターでは利用されることはありません。`kubeadm reset` 時における`/var/lib/dockershim`, `/var/run/kubernetes`, `/var/lib/cni`といったdockershimに関連するディレクトリのクリンナップは行われなくなります。** ([#110022](https://github.com/kubernetes/kubernetes/pull/110022), [@neolit123](https://github.com/neolit123))

    - :pencil: 確かにクリンナップされなくなっていました。

```bash
root@node-cp01:/etc/kubernetes/manifests# kubeadm reset
[reset] Reading configuration from the cluster...
[reset] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0921 04:21:43.809172   21624 reset.go:103] [reset] Unable to fetch the kubeadm-config ConfigMap from cluster: failed to get config map: Get "https://10.244.5.135:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s": dial tcp 10.244.5.135:6443: connect: connection refuse
d
W0921 04:21:43.810777   21624 preflight.go:55] [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
W0921 04:21:46.176911   21624 removeetcdmember.go:85] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/etcd /var/lib/kubelet]
```