Kubernetes 1.20: SIG Cluster Lifecycle の変更内容

## はじめに

[Kubernetes 1.20 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#changelog-since-v1190) から SIG Cluster Lifecycle の取り組みについてにピックアップしました。前から使用が微妙と思われていた "node-role.kubernetes.io/master" ラベルおよび "node-role.kubernetes.io/master:NoSchedule" taints の削除に動き出したようです。

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

### kubeadm の非推奨になったフラグが削除されました

`kubeadmは`、このリリースで多くの非推奨と非推奨機能の削除を行います。 詳細については、「重大なアップグレードに関する警告」および「種々の変更/廃止予定」セクションを参照してください。

## 既知の問題 (Known Issues)

- なし。

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

- **kubeadm: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/kubeadm/2067-rename-master-label-taint/README.md** ([#95382](https://github.com/kubernetes/kubernetes/pull/95382), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]
    - コントロールプレーンのノードに適用されるラベルであった "node-role.kubernetes.io/master" が非推奨になり、GAの非推奨期間後、将来のリリースで削除されます。
    - "node-role.kubernetes.io/control-plane" ラベルが追加されました。"node-role.kubernetes.io/master" ラベルが削除されるまで、それぞれのラベルは併存して付与されます。
    - `kubeadm upgrade apply` でアップグレード時に、"node-role.kubernetes.io/master"ラベルのみをもった既に存在するノードに"node-role.kubernetes.io/control-plane" ラベルが追加されるようになりました。
    - `kubeadm` の上に構築しているツールで "node-role.kubernetes.io/control-plane" を採用するようにしてください。
    - コントロールプレーンのノードに適用される taint であった "node-role.kubernetes.io/master:NoSchedule" が非推奨になり、GAの非推奨期間後、将来のリリースで削除されます。
    - 将来追加される taint である "node-role.kubernetes.io/control-plane:NoSchedule" に対する toleration を kubeadm が管理する CoreDNS/kube-dns のマニフェストを追加しました。ちなみに、この taint はまだコントロールプレーンに適用されていません。
    - "node-role.kubernetes.io/control-plane:NoSchedule" taint を許容するように事前に備えておいてください。
    - :pencil: 3行で言うと、
        - "node-role.kubernetes.io/control-plane" ラベルが追加されたので、コントロールプレーンノードにPodを配置したい場合はこのラベルを使うようにしてください。
            - "node-role.kubernetes.io/master"　が将来削除されます。
        - "node-role.kubernetes.io/control-plane:NoSchedule" taint が導入されるので、コントロールプレーンノードにPodを配置したい場合はこのtaintを許容するように変更してください。
            - "node-role.kubernetes.io/master:NoSchedule" が将来削除されます。
- **kubeadm: serviceSubnet と podSubnetのバリデーションが改善されました。ServiceSubnetは、実装の都合上、サイズを制限する必要があり、マスクは20ビットを超えて割り当てることはできません。PodSubnetはkube-controller-managerの対応する`--node-cidr-mask-size`との互換性を検証します。また、kubeadmは、IPv6を利用する際にノードマスクを自動的に設定しなくなりました。IPv6サービスのサブネットマスクがデフォルトのノードマスク/64と互換性があることを確認するか、適切に設定する必要があります。以前は、IPv6の場合、podSubnetのマスクが/112未満の場合、kubeadmはノードマスクを8の倍数として計算し、使用可能なビットを分割してノードに使用される数を最大化していました。** ([#95723](https://github.com/kubernetes/kubernetes/pull/95723), [@aojea](https://github.com/@aojea)) [SIG Cluster Lifecycle]
- **非推奨であった`--experimental-kustomize`フラグが`kubeadm`コマンドから削除されました。代わりに1.19から導入された`--experimental-patches`を利用してください。移行方法の情報は`--experimental-patches`のヘルプから見ることができます。** ([#94871](https://github.com/kubernetes/kubernetes/pull/94871), [@neolit123](https://github.com/@neolit123))
    - :pencil: [KEP 1739](https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/kubeadm/1739-customization-with-patches)参照のこと。
    - :pencil: 以下3タイプのパッチがサポートされている。
        1. Strategic Merge Patches (strategic)
            - `Kubectl apply` で利用しているmerge方法。
        2. [RFC6902](https://tools.ietf.org/html/rfc6902) JSON patches (json)
            - kustomizeでcommandsやargsの末尾にパラメータを追加するときによく使う。
        3. [RFC7396](https://tools.ietf.org/html/rfc7396#appendix-A) JSON merge patches (merge)
            - strategic merge patchのオリジナル版？
    - :pencil: `--experimental-patches` で指定したディレクトリに、以下のファイル名のフォーマットでパッチを書くことで、`kubeadm`で生成されるstatic podにパッチを当てることができる。
        - `componentname[suffix][+patchtype].{yaml|json}`
- **kubeadm: `kubeadm alpha kubeconfig user`コマンドに`--config`フラグが追加され、以下のフラグが削除されました。** ([#94879](https://github.com/kubernetes/kubernetes/pull/94879), [@knight42](https://github.com/@knight42)) [SIG Cluster Lifecycle]
    - `apiserver-advertise-address` / `apiserver-bind-port`: `InitConfiguration`の `localAPIEndpoint`または`ClusterConfiguration`の`controlPlaneEndpoint`を利用してください。
    - `cluster-name`: `ClusterConfiguration`の`clusterName`を利用してください。
    - `cert-dir`: `ClusterConfiguration`の`certificatesDir`を利用してください。

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

### 廃止予定 (Deprecation)

- **kubeadm: self-hostingのサポートが非推奨になりました。実験的コマンドである`kubeadm alpha self-hosting`は非推奨になり、将来のバージョンで削除します。** ([#95125](https://github.com/kubernetes/kubernetes/pull/95125), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]
    - :pencil: bootkubeのcheckpointer相当のことを公式にサポートしないとself-hostingは実現できないのですが、kubeletのcheckpointingはセキュリティとの兼ね合いがあって公式にサポートするのは難しかったんでしょうね。
- **kubeadm: `kubeadm alpha certs`コマンドが`kubeadm certs`コマンドとして昇格しました。`kubeadm alpha certs`コマンドは非推奨になり、将来のバージョンで削除されます。移行してください。** ([#94938](https://github.com/kubernetes/kubernetes/pull/94938), [@yagonobre](https://github.com/@yagonobre)) [SIG Cluster Lifecycle]
- **kubeadm: 非推奨の`kubeadm alpha kubelet config enable-dynamic`コマンドが削除されました。この機能を引き続き利用したい場合はk8s.ioの"[Dynamic Kubelet Configuration](https://kubernetes.io/search/?q=Dynamic%20Kubelet%20Configuration)"というガイドを参考にしてください。この変更はその上位のコマンドである`kubeadm alpha kubelet`コマンドの削除も含んでいます。このコマンドは`enable-dynamic`サブコマンドの削除によりその他のいかなるサブコマンドも持っていません。** ([#94668](https://github.com/kubernetes/kubernetes/pull/94668), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]
- **kubeadm: `kubeadm upgrade node`コマンドにおける、非推奨の`--kubelet-config`フラグが削除されました。** ([#94869](https://github.com/kubernetes/kubernetes/pull/94869), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]

### API の変更 (API Change)

- なし。

### 機能 (Feature)

- **現在のシステム時刻が、読み込まれた証明書の `NotBefore`および`NotAfter` の範囲外である場合、`kubeadm` はエラーを投げる代わりに警告を出力するようになりました。** ([#94504](https://github.com/kubernetes/kubernetes/pull/94504), [@neolit123](https://github.com/@neolit123))
- **kubeadm: コントロールプレーンノードに少なくとも1700MBのRAMがあることを事前にチェック(preflight check)するようになりました。** ([#93275](https://github.com/kubernetes/kubernetes/pull/93275), [@xlgao-zju](https://github.com/@xlgao-zju)) [SIG Cluster Lifecycle]
- **kubeadm: `kubeadm alpha kubeconfig user`コマンドで生成されたkubeconfigファイルのクラスタ名を設定可能にする`--cluster-name`フラグを追加しました。** ([#93992](https://github.com/kubernetes/kubernetes/pull/93992), [@prabhu43](https://github.com/@prabhu43)) [SIG Cluster Lifecycle]
    - :pencil: このコマンドで生成されたkubeconfigのクラスター名が変更できるようになりました。
- **kubeadm: `kubeadm init phase upload-certs`コマンドでkubeconfigファイルのパスを設定可能にする`--kubeconfig`フラグを追加しました。** ([#94765](https://github.com/kubernetes/kubernetes/pull/94765), [@zhanw15](https://github.com/@zhanw15)) [SIG Cluster Lifecycle]
- **kubeadm: etcd pod の resource.requests をデフォルトで 100m CPU, 100Mi memory, 100Mi ephemeral_storage に設定しました。** ([#94479](https://github.com/kubernetes/kubernetes/pull/94479), [@knight42](https://github.com/@knight42)) [SIG Cluster Lifecycle]
- **kubeadm: `kubeadm alpha kubeconfig user`コマンドに`--config`フラグが追加され、以下のフラグが削除されました。** ([#94879](https://github.com/kubernetes/kubernetes/pull/94879), [@knight42](https://github.com/@knight42)) [SIG Cluster Lifecycle]
    - `apiserver-advertise-address` / `apiserver-bind-port`: `InitConfiguration`の `localAPIEndpoint`または`ClusterConfiguration`の`controlPlaneEndpoint`を利用してください。
    - `cluster-name`: `ClusterConfiguration`の`clusterName`を利用してください。
    - `cert-dir`: `ClusterConfiguration`の`certificatesDir`を利用してください。

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

- なし。

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

- **オプションのバージョンコマンドライン引数が`kubeadm upgrade plan`コマンドに指定されたときに、kubeadmが致命的なエラーで終了するリグレッションが修正されました** ([#94421](https://github.com/kubernetes/kubernetes/pull/94421), [@rosti](https://github.com/@rosti)) [SIG Cluster Lifecycle]
- **`/var/lib/kubelet`ディレクトリがユーザによってマウントされていた場合、`kubeadm reset`は`/var/lib/kubelet`ディレクトリをアンマウントしないようになりました。** ([#93702](https://github.com/kubernetes/kubernetes/pull/93702), [@thtanaka](https://github.com/@thtanaka)) [SIG Cluster Lifecycle]
- **etcdのバージョンが変更されていなかったとしても、アップグレード時にetcdのマニフェストが再生成されるようになりました。** ([#94395](https://github.com/kubernetes/kubernetes/pull/94395), [@rosti](https://github.com/@rosti)) [SIG Cluster Lifecycle]
- **`kubeadm join --control-plane`の間、ユーザが全ての証明書、キーおよびkubeconfigファイルを自分で設定した場合のために、それらを署名するためのCA鍵(root CA, front-proxy CA, etcd CA)が無かった場合にエラーではなく警告を出すようにしました。** ([#94988](https://github.com/kubernetes/kubernetes/pull/94988), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]
- **kubeadm: `kubeadm init phase control-plane`に欠けていた`--experimental-patches`フラグを追加しました。** ([#95786](https://github.com/kubernetes/kubernetes/pull/95786), [@Sh4d1](https://github.com/@Sh4d1)) [SIG Cluster Lifecycle]
- **kubeadm: アップグレード中に起動中のCoreDNSのバージョンがサポートされているものかどうかを調べる際に、panicしないようになりました。** ([#94299](https://github.com/kubernetes/kubernetes/pull/94299), [@zouyee](https://github.com/@zouyee)) [SIG Cluster Lifecycle]
- **kubeadm: コントロールプレーンが初期化(init)もしくは追加(join)される際に作られるetcdのデータディレクトリが`0700`のパーミッションで作られるようになりました。** ([#94102](https://github.com/kubernetes/kubernetes/pull/94102), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]
- **kubeadm: `kubeadm upgrade`中に新しいデフォルトがあった場合、CoreDNSのマイグレーションが走るように修正されました。** ([#96907](https://github.com/kubernetes/kubernetes/pull/96907), [@pacoxu](https://github.com/@pacoxu)) [SIG Cluster Lifecycle]
- **kubeadm: CRI socketが別のcontainer runtimeのものであったとしても、`docker info`を呼び出そうと試みていたバグを修正しました。** ([#94555](https://github.com/kubernetes/kubernetes/pull/94555), [@SataQiu](https://github.com/@SataQiu)) [SIG Cluster Lifecycle]
- **kubeadm: container runtimeとしてDockerが利用されていた場合、`kubeadm reset`はコンテナを削除する前にコンテナを停止するようになりました。** ([#94586](https://github.com/kubernetes/kubernetes/pull/94586), [@BedivereZero](https://github.com/@BedivereZero)) [SIG Cluster Lifecycle]
- **kubeadm: 既存のkubeconfigファイルを検証中に、ユーザにkubeconfig中のサーバURLを定義することができるように、kubeconfig中のサーバURLの検証を緩くしました。(例えば外部CAモードを利用する際など)** ([#94816](https://github.com/kubernetes/kubernetes/pull/94816), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]

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

- **kubeadm: ログメッセージ中において引数の keyとvalueを分けました。** ([#94016](https://github.com/kubernetes/kubernetes/pull/94016), [@mrueg](https://github.com/@mrueg)) [SIG Cluster Lifecycle]
    - :pencil: 何のこっちゃと思いきや、ログ中に `-oyaml` と出ているところを `-o yaml` と書き直してました。`cleanup` らしいです。
- **kubeadm: addonをapplyする際に、既知のimage digestsであるCoreDNSに対するチェックを削除しました。** ([#94506](https://github.com/kubernetes/kubernetes/pull/94506), [@neolit123](https://github.com/@neolit123)) [SIG Cluster Lifecycle]