Cluster API: v0.3.15, v0.3.16 変更内容

## はじめに

ここでは Cluster API v0.3.15, v0.3.16 の変更内容についてまとめています。

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

Cluster API は複数の Kubernetes クラスタのプロビジョニングやアップグレード、オペレーションをするための宣言的な API とツールを提供する SIG Cluster Lifecycle のサブプロジェクトです。

## Cluster API v0.3.15 (2021/3/31)

### ⚠️  Breaking Changes（破壊的変更）

- Kubernetes 1.21 以上ではデフォルトの kubelet cgroupDriver が `systemd` に変更されました ([#4294](https://github.com/kubernetes-sigs/cluster-api/pull/4294))
    - :memo: 明示的に cgroup-driver が指定されている場合はそれが使われます
- cert-manager が v1.1.0 に更新されました ([#4225](https://github.com/kubernetes-sigs/cluster-api/pull/4225))

### ✨ New Features（新機能）

- KubeadmControlPlane: maxSurge を導入するロールアウトストラテジをサポート ([#4293](https://github.com/kubernetes-sigs/cluster-api/pull/4293))
    - :memo: これまで KubeadmControlPlane で ControlPlane ノードを更新する際には先にマシンを追加で1つ作成し、追加の ControlPlane ノードとしてジョインしたのちに古いノードを1つ削除するという動作になっていました。しかしながら、ベアメタルのような限られたマシンのなかでやりくりしているような環境の場合、マシンを追加で用意できないこともあります
    - :memo: そこで KubeadmControlPlane も MachineDeployment と同様に RollingUpdate のロールアウトストラテジがサポートされました。この変更によって、`maxSurge` が 0 という指定ができるようになり、先に ControlPlane ノードを削除したのちに作成するという戦略も取れるようになりました。デフォルトは変わらず `maxSurge` が 1 になっています。
    - :memo: なお、当然ですが `maxSurge` が 0 の設定は ControlPlane ノードが3以上のときでないと機能しません
- CABPK (Cluster API bootstrap provider kubeadm) が内部で kubeadm v1beta2 タイプをサポート ([#4292](https://github.com/kubernetes-sigs/cluster-api/pull/4292))
- MachineHealthCheck (MHC) でマシンの修復のスキップをサポートし、また停止中のマシンを尊重するようになりました ([#4206](https://github.com/kubernetes-sigs/cluster-api/pull/4206))
    - :memo: Machine オブジェクトに `cluster.x-k8s.io/skip-remediation` アノテーションが設定されている場合、MHC によるマシン修復をスキップするようになりました
    - :memo: 加えて、`clusterctl move` を使ったクラスタのマイグレーション中の Machine オブジェクトに設定される `cluster.x-k8s.io/paused` アノテーションが付与されている場合にも MHC の対象にならなくなりました。
- Cluster API のクラスタとオーナ情報で Kubernetes ノードをアノテートするようになりました ([#4388](https://github.com/kubernetes-sigs/cluster-api/pull/4388))
    - :memo: Cluster API から作成されたノードに次のアノテーションが付与されるようになり、そのノードがどの Machine オブジェクトと紐づくのかなどがわかるようになりました。非常にべんりそうです。
    - :memo: 具体的に付与されるアノテーションは次のとおりです
        - `cluster.x-k8s.io/cluster-name`: Cluster オブジェクト名
        - `cluster.x-k8s.io/cluster-namespace`: Cluster オブジェクトが含まれる Namespace 名
        - `cluster.x-k8s.io/machine`: Machine オブジェクト名
        - `cluster.x-k8s.io/owner-kind`: Machine オブジェクトのオーナリソース名（e.g. `MachineSet`
        - `cluster.x-k8s.io/owner-name`: Machine オブジェクトのオーナオブジェクト名

### 🐛 Bug Fixes（バグ修正）

- クラスタ削除時に MachinePool の確認を含むように修正されました ([#4299](https://github.com/kubernetes-sigs/cluster-api/pull/4299))
    - :memo: Cluster オブジェクトを削除した際に、そのクラスタに紐づくオブジェクトがすべて削除されるのを待ってから Cluster オブジェクトが削除されるようになっているのですが、MachinePool がその紐づくオブジェクトのリストに含まれていなかったことで、MachinePool によりも先に Cluster オブジェクトが削除されてしまい、MachinePool オブジェクトの Reconcile に失敗するようになってしまっていたようです
- コンフォーマンステストで非 Bazel ビルドに CI バケットを変更しました ([#4251](https://github.com/kubernetes-sigs/cluster-api/pull/4251))
- Kubernetes ノード名と etcd メンバ名がマシンと同じではない場合の KubeadmControlPlane の修復が修正されました ([#4242](https://github.com/kubernetes-sigs/cluster-api/pull/4242))
    - :memo: マシンと同じ名前ではなかった場合に etcd のクォーラムが損なわれると誤って判断され修復がスキップされてしまうバグがあったようです
- `cert-manager.io/v1alpha2` を使うようにマニフェストが修正されました ([#4411](https://github.com/kubernetes-sigs/cluster-api/pull/4411))

### 📖 Documentation（ドキュメンテーション）

- Update MachineHealthCheck (MHC) docs to comply with current implementation ([#4387](https://github.com/kubernetes-sigs/cluster-api/pull/4387))
    - :memo: ドキュメントでは MHC が MachineDeployment のみをサポートしているとあるが、実際には現時点で KubeadmControlPlane もサポートしているため、それに関する修正が入りました
- 現在の実装に沿うように MachineHealthCheck のドキュメントが修正されました
- KCP (KubeadmControlPlane) が管理するマシンで実行されるワークロードのポリシをドキュメントに追加しました ([#4280](https://github.com/kubernetes-sigs/cluster-api/pull/4280))
    - :memo: ControlPlane ノード上でワークロードを実行することは絶対に必要な場合を除いて避けるべきとの旨が追記されました

### 🌱 Others（そのほか）

- Clusterctl v0.3.x を次のメジャーまたはマイナーリリースでアップグレードしないようにしてください ([#4268](https://github.com/kubernetes-sigs/cluster-api/pull/4268), [#4265](https://github.com/kubernetes-sigs/cluster-api/pull/4265), [#4252](https://github.com/kubernetes-sigs/cluster-api/pull/4252))
- Book の前提条件はすべて実パスを使用する必要があります ([#4158](https://github.com/kubernetes-sigs/cluster-api/pull/4158))
- CAPD (Cluster API provider Docker) に distroless を使用します ([#4324](https://github.com/kubernetes-sigs/cluster-api/pull/4324))
- ClusterResourceSet コントローラの冗長なログが削除されました ([#4150](https://github.com/kubernetes-sigs/cluster-api/pull/4150))

## Cluster API v0.3.16 (2021/4/16)

### 🐛 Bug Fixes（バグ修正）

- KubeadmControlPlane: CoreDNS の v1.20 から v1.21 へのアップグレードを修正しました ([#4481](https://github.com/kubernetes-sigs/cluster-api/pull/4481))
- KubeadmControlPlane: maxSurge フィールドがミュータブルになりました ([#4438](https://github.com/kubernetes-sigs/cluster-api/pull/4438))
- 全ての mutating webhooks にテストヘルパを追加してデフォルティングが検証をパスすることが保証されるようになりました ([#4452](https://github.com/kubernetes-sigs/cluster-api/pull/4452))