Kubernetes 1.22: SIG Cluster Lifecycle の変更内容

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

## 主な変更点 (What's New)

### kubeadmを使ったさらに安全なコントロールプレーンの構築

新しいアルファ機能によって、kubeadmのコントロールプレーンがnon-rootなユーザで実行することができるようになりました。これは長らくkubeadmに求められていたセキュリティ対策となります。試す場合にはkubeadm特有の `RootlessControlPlane` フィーチャーゲートを有効化してください。このアルファ機能を使ってクラスターをデプロイすることで、コントロールプレーンは少ない権限で実行されます。

新しい`v1beta3`の設定APIは`v1beta2`をベースに長らく求められていた機能を追加し、いくつかの機能を非推奨としました。そのため、`v1beta3`は現在推奨されているAPIのバージョンとなりますが、`v1beta2`APIも引き続き利用可能であり、非推奨APIではありません。

## 既知の問題 (Known Issues)

- なし。

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

- **kubeadm: Docker向けのcgroupドライバーの自動判定を削除しました。新しいクラスタを構築する際にcgroupドライバーを明示的に設定していない場合、`kubelet`のドライバーの不一致で失敗することがあります (kubeadmのクラスタは`systemd`ドライバーを使うべきです)。また、同じようにDockerのcgroupドライバーが`systemd`に設定されていることを確認する`IsDockerSystemdCheck`の事前チェック(警告)も削除されました。理想的には、このような検出と調整はCRIの実装と`kubelet`との間で行われるべきです([#99808](https://github.com/kubernetes/kubernetes/issues/99808))。kubeadmでどのようにcgroupドライバーを手動で設定するかについては[該当のページ](https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/)をご覧ください。** ([#99647](https://github.com/kubernetes/kubernetes/pull/99647), [@neolit123](https://github.com/@neolit123))
    - :pencil: kubeadmはinitとして`systemd`を前提としているため、cgroupドライバーとしてそれ以外が設定されている環境がよくわからないです。

- **kubeadm: `--cri-socket`フラグと`--config`フラグを同時に指定することができなくなりました。ノードのCRIソケットを設定したい場合はkubeadmの設定ファイルの`{Init|Join}Configuration.nodeRegistration.criSocket`を指定してください。** ([#101600](https://github.com/kubernetes/kubernetes/pull/101600), [@KofClubs](https://github.com/@KofClubs))

- **kubeadm: `--experimental-patches`フラグは非推奨になりました、将来のリリースで削除されます、新しい`--patches`フラグに移行してください。また、設定ファイルに新しいフィールド、`--experimental-patches`が追加され、同じ目的に利用することができます。initおよびjoin時には`{Init|Join}Configuration.patches.directory`を利用してパッチを設定する方法に移行することをお勧めします。今のところ、これらのフラグは `--config` と混在させることができますが、将来的には変更されるかもしれません。コマンドラインでは、最後の `--patches` フラグがそれまでのフラグや config の値よりも優先されます。 `kubeadm upgrade --patches` は今後も唯一の選択肢となります。** ([#103063](https://github.com/kubernetes/kubernetes/pull/103063), [@neolit123](https://github.com/@neolit123))

## 種々の変更 (Changes by Kind)

### 廃止予定 (Deprecation)

- **kubeadm: `v1beta3`からClusterStatus APIを削除し、その管理を`kube-system/kubeadm-config` ConfigMapで行うようにしました。クラスタに存在するAPIエンドポイントを追跡するこの方法は、（前のリリースで）kubeadmが「stacked etcd」クラスタで作成するetcd Podのアノテーションに記録する方法に置き換えられました。`kubeadm join` における "control-plane-join/update-status" サブフェーズおよび `kubeadm reset` における "update-cluster-status "サブフェーズは非推奨となり、何も行いません。ユーザはこれらのフェーズを明示的に使用していない限り、影響を受けることはありません。** ([#101915](https://github.com/kubernetes/kubernetes/pull/101915), [@neolit123](https://github.com/@neolit123))

- **kubeadm: `kubeadm init phase certs`サブコマンドにおける非推奨の`--csr-only`と`--csr-dir`フラグを削除しました。また、同様に`kubeadm certs renew`における同じフラグを削除しました。両方のコマンドにおいて代わりに`kubeadm certs generate-csr`コマンドを利用してください。** ([#102108](https://github.com/kubernetes/kubernetes/pull/102108), [@neolit123](https://github.com/@neolit123))

- **kubeadm: 非推奨の`kubeadm alpha kubeconfig`サブコマンドが削除されました。`kubeadm kubeconfig`サブコマンドを利用してください。** ([#101938](https://github.com/kubernetes/kubernetes/pull/101938), [@knight42](https://github.com/@knight42))

- **kubeadm: `v1beta3`APIにおいて非推奨出会ったhyperkubeイメージのサポートを終了しました。これにより`ClusterConfiguration.UseHyperKubeImage`フィールドが削除されました。** ([#101537](https://github.com/kubernetes/kubernetes/pull/101537), [@neolit123](https://github.com/@neolit123))

- **kubeadm: CoreDNSがサポートされる唯一のDNSタイプであるため、v1beta3 API の `ClusterConfiguration.DNS.Type` が削除されました。** ([#101547](https://github.com/kubernetes/kubernetes/pull/101547), [@neolit123](https://github.com/@neolit123))

- **kubeadm: 非推奨の `kubeadm config view` サブコマンドが削除されました。このコマンドの代わりに `kubectl get cm -n kube-system kubeadm-config -o=jsonpath="{.data.ClusterConfiguration}"` を利用することができます。** ([#102071](https://github.com/kubernetes/kubernetes/pull/102071), [@neolit123](https://github.com/@neolit123))

- **kubeadm: `kubeadm upgrade apply`における非推奨の`--image-pull-timeout`フラグが削除されました。** ([#102093](https://github.com/kubernetes/kubernetes/pull/102093), [@SataQiu](https://github.com/@SataQiu))

- **kubeadm: kubeadmが管理するkube-apiserverのマニフェストから、非推奨の`--insecure-port`フラグが削除されました。このフラグは Kubernetes version 1.20からコンポーネントのinsecure servingが無効化されたため何の影響もありませんでした。** ([#102121](https://github.com/kubernetes/kubernetes/pull/102121), [@pacoxu](https://github.com/@pacoxu))

- **kubeadm: 非推奨の`v1beta1` APIが削除され、新しい `v1beta3` が追加されました。`v1beta2`との差分については[APIドキュメント](https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3)を参照してください。`v1beta2`APIはまだ非推奨ではありませんが、将来のバージョンで削除されます。** ([#101129](https://github.com/kubernetes/kubernetes/pull/101129), [@neolit123](https://github.com/@neolit123))

### API の変更 (API Change)

- なし。

### 機能 (Feature)

- **kubeadm: `kubeadm kubeconfig user`サブコマンドに`--validity-period`フラグが追加されました。** ([#100907](https://github.com/kubernetes/kubernetes/pull/100907), [@SataQiu](https://github.com/@SataQiu))
  - :pencil: `kubeadm kubeconfig user`で生成されるkubeconfigで利用されるクライアント証明書の期限を設定できるようになったようです。

- **kubeadm: kubeadm特有の`RootlessControlPlane`フィーチャーゲートが追加されました(1.22ではアルファ機能であり、デフォルトで無効化されています)。コントロールプレーンの`kube-apiserver`, `kube-controller-manager`, `kube-scheduler`と`etcd`のstatic Podコンテナを非rootユーザで実行する実験的機能を有効化します。** ([#102158](https://github.com/kubernetes/kubernetes/pull/102158), [@vinayakankugoyal](https://github.com/@vinayakankugoyal))

- **kubeadm: Static Podとして実行しているコントロールプレーンのコンポーネントにおける`PodSecurityContext`中の`seccompProfile`を`runtime/default`に設定しました。** ([#100234](https://github.com/kubernetes/kubernetes/pull/100234), [@vinayakankugoyal](https://github.com/@vinayakankugoyal))

- **kubeadm: `InitConfiguration`と`JoinConfiguration`の`v1beta3`に`skipPhases`フィールドが追加されました。このフィールドには`kubeadm init`および`kubeadm join`時にスキップするフェーズのリストを設定することができます。`--skip-phases`フラグはこのフィールドより優先されます。** ([#101923](https://github.com/kubernetes/kubernetes/pull/101923), [@neolit123](https://github.com/@neolit123))
    - :pencil: kube-proxyを必要としないCNIを利用する際など、コンポーネントのインストールをスキップしたい場合に利用します。Cluster APIなどからAPI越しに利用することを想定しているようです。

- **kubeadm: `kubeadm init`の`control-plane`フェーズに`--dry-run`フラグを追加しました。** ([#102722](https://github.com/kubernetes/kubernetes/pull/102722), [@vinayakankugoyal](https://github.com/@vinayakankugoyal))

- **kubeadm: `v1beta3`にて、`InitConfiguration.`と`JoinConfiguration`の`nodeRegistration`に`imagePullPolicy`フィールドが追加されました。これにより`kubeadm init`と`kubeadm join`時にイメージプルポリシーが設定できるようになりました。`Always`か`IfNotPresent`または`Never`を指定することができ、`IfNotPresent`がデフォルト値です。**　([#102901](https://github.com/kubernetes/kubernetes/pull/102901), [@wangyysde](https://github.com/@wangyysde))

- **kubeadm: `kubeadm init/join/upgrade`時において、ユーザーが特に指定しない限り`KubeletConfiguration`中の`cgroupDriver`の値は常に`systemd`がデフォルト値となります。詳細は[Configuring a cgroup driver](https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/)を確認ください。** ([#102133](https://github.com/kubernetes/kubernetes/pull/102133), [@pacoxu](https://github.com/@pacoxu))

- **kubeadm: CoreDNSのバージョンを1.8.4に変更しました。また、dual-stackサポートを収容できるよう、`EndpointSlice`オブジェクトの`list`と`watch`への許可を与えました。** ([#102466](https://github.com/kubernetes/kubernetes/pull/102466), [@pacoxu](https://github.com/@pacoxu))

### ドキュメント (Documentation)

- なし。

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

- **kuebadm: イメージタグがバージョンメタデータの形式である場合、ビルドメタデータを含んだetcdイメージのカスタムイメージタグをサポートしました。例) etcdのバージョンが`v3.4.13+patch.0`であった場合、サポートされるイメージタグは`v3.4.13_patch.0`になります。** ([#100350](https://github.com/kubernetes/kubernetes/pull/100350), [@jr0d](https://github.com/@jr0d))

- **kubeadm: `--config`フラグを指定時に、`--log-file`フラグが指定できるようになりました。ログをファイルに保存したい場合は同時に`--logtostderr=false` フラグか `--alsologtostderr=true`フラグを指定してください。ちなみにこれらのフラグは `kubeadm ... | tee ...`で代替可能です。** ([#101449](https://github.com/kubernetes/kubernetes/pull/101449), [@CaoDonghui123](https://github.com/@CaoDonghui123))

- **kubeadm: `kubeadm join phase control-plane-join all`コマンドにおいて`kubeadm join phase control-plane-join all`フラグが利用できるようになりました。** ([#101110](https://github.com/kubernetes/kubernetes/pull/101110), [@SataQiu](https://github.com/@SataQiu))

- **kubeadm: コントロールプレーンノードの`kubeadm join`がクラスタから証明書と鍵をダウンロードしますが、モード`0644`で一般に読めように証明書と公開鍵を書き込まず、代わりにモード`0600`で書き込むというバグを修正しました。** ([#103313](https://github.com/kubernetes/kubernetes/pull/103313), [@neolit123](https://github.com/@neolit123))

- **kubeadm: ルートCA検証時に`caCertHashes`の最初のハッシュしか利用しなかった問題を修正しました。** ([#101977](https://github.com/kubernetes/kubernetes/pull/101977), [@SataQiu](https://github.com/@SataQiu))

- **kubeadm: kubeadm が Stacked etcd のコントロールプレーンノードにデプロイする etcd の static pod から`ephemeral_storage`のリソースリクエストを削除します。このリソースリクエストはcadvisorと`LocalStorageCapacityIsolation`フィーチャーゲートを利用するkubeletに問題があるため、一部のセットアップで散発的な問題を引き起こしていました。詳細は[#99305](https://github.com/kubernetes/kubernetes/issues/99305)を参照してください。** ([#102673](https://github.com/kubernetes/kubernetes/pull/102673), [@jackfrancis](https://github.com/@jackfrancis))

- **kubeadm: CoreDNSのカスタムイメージレポジトリを指定していた際にイメージ名として`coredns/coredns`ではなく`coredns`を追加するようになりました。この挙動はv1.21リリース以前の挙動と同じです。CoreDNSのイメージがネストされたフォルダに依存していた場合は、ネストされたパス名を`clusterConfiguration.dns.imageRepository`に設定してください。(例: `registry.company.xyz/coredns` を設定した場合は`registry.company.xyz/coredns/coredns`がイメージ名として利用されます。) デフォルトのレジストリを利用している人は何の影響もありません。** ([#102502](https://github.com/kubernetes/kubernetes/pull/102502), [@ykakarap](https://github.com/@ykakarap))

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

- **kubeadm: BootstrapToken APIと関連するユーティリティのバージョンが、v1beta3から別のAPI group/versionである"bootstraptoken/v1"に移動しました。** ([#102964](https://github.com/kubernetes/kubernetes/pull/102964), [@neolit123](https://github.com/@neolit123))

- **kubeadm: `CriticalAddonsOnly` tolerationが`kube-proxy` DaemonSetから削除されました。** ([#101966](https://github.com/kubernetes/kubernetes/pull/101966), [@SataQiu](https://github.com/@SataQiu))