Cluster API: v0.3.9 変更内容

## はじめに

ここでは 2020/9/1 にリリースされた Cluster API v0.3.9 の変更内容についてまとめます。Cluster API は、Kubernetes クラスタのプロビジョニング、アップグレード、運用を行う宣言型 API とツールを提供する Kubernetes のサブプロジェクトです。

- https://github.com/kubernetes-sigs/cluster-api/releases/tag/v0.3.9

## ⚠️  互換性のない変更

- 🚨 KubeadmControlPlane は v1.19.0 へのアップグレードをサポートしていません ([#3562](https://github.com/kubernetes-sigs/cluster-api/pull/3562))

既存の Kubernetes v1.18.x のクラスタから v1.19.0 へのアップグレードに課題があり、Kubernetes v1.19.1 で解消されるように kubeadm のメンテナと解決に向けて議論しています。課題があるのはアップグレードだけで、新規で v1.19.0 でクラスタを作成する場合には問題ありません。

原因の詳細は [#3564](https://github.com/kubernetes-sigs/cluster-api/issues/3564) にありますが、ざっと紹介すると Kubernetes 1.19.0 で Certificates API、特に今回課題になっているのがノードのブートストラップに使用する CertificateSigningRequests で v1 が導入され、kube-controller-manager は v1 を使用するように変更されました。しかし、既存のクラスタが複数の ControlPlane マシンで構成されている場合に、アップグレードでマシンが削除されたときに v1.18.x の kube-controller-manager がリーダになってしまうと v1 の新しい CertificateSigningRequests を処理できないため新しいノードのブートストラップに失敗してしまうアップグレードに失敗してしまっていました。

なお、kubeadm v1.19.1 でこの問題は修正されています。

- v1alpha3 から古いランタイムメトリクスを削除 ([#3464](https://github.com/kubernetes-sigs/cluster-api/pull/3464))

これらのメトリクスは正しい値を報告していないばかりか、場合によってはメモリの大幅な使用を引き起こしていました。

具体的には次のメトリクスが削除されました。

> - The cluster and machine controllers expose the following prometheus metrics.
>   - `capi_cluster_control_plane_ready`: Cluster control plane is ready if set to 1 and not if 0.
>   - `capi_cluster_infrastructure_ready`: Cluster infrastructure is ready if set to 1 and not if 0.
>   - `capi_cluster_kubeconfig_ready`: Cluster kubeconfig is ready if set to 1 and not if 0.
>   - `capi_cluster_failure_set`: Cluster FailureMesssage or FailureReason is set if metric is 1.
>   - `capi_machine_bootstrap_ready`: Machine Boostrap is ready if set to 1 and not if 0.
>   - `capi_machine_infrastructure_ready`: Machine InfrastructureRef is ready if set to 1 and not if 0.
>   - `capi_machine_node_ready`: Machine NodeRef is ready if set to 1 and not if 0.

## ✨ 新しい機能

- clusterctl がカスタムオブジェクトの移動をサポート ([#3337](https://github.com/kubernetes-sigs/cluster-api/pull/3337))
    - :memo: `clusterctl move` コマンドで移動されるオブジェクトは `clusterctl init` コマンドにより作成されたもの、Secret と ConfigMap オブジェクト、それらを OwnerReference に持つものです。この変更は、それらに加えて `clusterctl.cluster.x-k8s.io/move` ラベルを持つものが移動されるオブジェクトに追加されるようになりました。
- clusterctl がコマンド実行時に新しいバージョンが利用可能かどうかを確認する ([#3484](https://github.com/kubernetes-sigs/cluster-api/pull/3484))
- Machine controller が deletion lifecycle hooks をサポート ([#3273](https://github.com/kubernetes-sigs/cluster-api/pull/3273)) - 外部コントローラが annotation を使用してマシンの終了前に必要であれば任意のクリーンアップタスクを実行できる
    - :memo: フックのポイントはドレイン実行前と終了実行前の2つで、それぞれの次の annotation で対応します
        - ドレイン前: `pre-drain.delete.hook.machine.cluster.x-k8s.io/<hook-name>: <owner>`
        - 終了前: `pre-terminate.delete.hook.machine.cluster.x-k8s.io/<hook-name>: <owner>`
    - :memo: Machine controller は、これらの annnotations がオブジェクトに存在する場合に Reconsile を中止するという挙動を取るため、外部のコントローラは処理が完了したら対象の annotations を削除することで Machine の削除が再開されるという仕組みです。これはべんりに使えそうな機能です。
    - :memo: 詳細は[プロポーザル](https://github.com/kubernetes-sigs/cluster-api/blob/master/docs/proposals/20200602-machine-deletion-phase-hooks.md)を参照してください。
- `clusterctl` に `get kubeconfig` サブコマンドを追加 ([#3460]())
    - :memo: ワークロードクラスタの kubeconfig を簡単に取得できるようになりました。べんり。

## 🌱 そのほか

面白そうなものだけをピックアップします。

- リポジトリに Cluster API アイコンを追加 ([#3489](https://github.com/kubernetes-sigs/cluster-api/pull/3489))
    - :memo: Machine や Machine Deployment といった Cluster API のオブジェクトのアイコンが提供されるようになりました。Kubernetes が提供しているアイコンと似たデザインで使い所がありそうです。
    - https://github.com/kubernetes-sigs/cluster-api/tree/master/logos/icons