Kubernetes 1.15: SIG Cluster Lifecycle の変更内容

## はじめに

[Kubernetes 1.15 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.15.md) から SIG Cluster Lifecycle の取り組みについてまとめます。

SIG Cluster Lifecycle は[複数のサブプロジェクト](https://github.com/kubernetes/community/tree/master/sig-cluster-lifecycle#subprojects)を持つ比較的大きめの SIG ですが、リリースノートに載った変更は主に kubeadm に関するもので、Cluster API やその他のサブプロジェクトに関するリリースノートはほとんどありませんでした。

その他の変更点については[Kubernetes 1.15: 変更点まとめ](https://qiita.com/uesyn/items/3def2beb32387e58af01)から参照できます。

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

### Cluster Lifecycle Stability and Usability Improvements

Kubernetesのインストール、アップグレードと設定を、より安定したものにすることが、この 1.15 リリースサイクルにおける SIG Cluster Lifecycle における一番の目標でした。(2019/05/06 の[コミュニティアップデート](https://docs.google.com/presentation/d/1QUOsQxfEfHlMq4lPjlK2ewQHsr9peEKymDw5_XwZm8Q/edit?usp=sharing)をみてください。) ベアメタルにおけるツールの提供とプロダクションレディなユーザストーリーにおけるバグの修正、例えば高可用性といったユースケースは 1.15 において優先度が与えられました。

Cluster Lifecycle のビルディングブロックの一つである kubeadm はプロダクションクラスタのブートストラップを効率化する機能や安定性に必要となるコミュニティからの働きを受け続けています。kubeadm は 高可用性 (HA) のサポートをベータに昇格しました。これらはユーザが親しんでいる `kubeadm init` や `kubeadm join` を使って [HA コントロールプレーンを設定してデプロイ](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/)することを可能にします。新しくテストスイートはこれらの機能が長期に渡って安定することを保証するために作られました。

証明書の管理は 1.15 でより安定しました。kubeadm はシームレスに証明書を期限前にローテートします。[kubeadmのドキュメント](https://github.com/kubernetes/website/blob/dev-1.15/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md)で、どのように証明書を管理しているのかチェックしてください。

1.15 では kubeadm の設定 API が v1beta1 から v1beta2 になりました。

これらの変更は以下の Kubernetes の改良を反映したものです。

- [Ability to create dynamic HA clusters with kubeadm](https://github.com/kubernetes/enhancements/issues/357)
- [kubeadm: graduate the kubeadm configuration](https://github.com/kubernetes/enhancements/issues/970)

## 既知の問題 (Known Issues)

- **今の所、新しいコントロールプレーンの追加は kubeadm 1.15.0 の時点で期待通りに動作しません。この機能は 1.15.0 のリリースに向けて準備されていましたが、修正は以降のパッチリリースに含まれると思われます。**
    - :pencil: What's new に大きく書いておきながら動かないらしい。 :eyes: 

## アップグレード時の注意点 (Urgent Upgrade Notes)

### Lifecycle

- **非推奨であった古い kubeadm の設定バージョン v1alpha3 は完全に削除されました。** ([#75179](https://github.com/kubernetes/kubernetes/pull/75179), [@rosti](https://github.com/rosti))
- **kubeup.sh は "centos" と "local" プロバイダをサポートしなくなりました。** ([#76711](https://github.com/kubernetes/kubernetes/pull/76711), [@dims](https://github.com/dims))
    - :pencil: `cluster/` ディレクトリ以下のスクリプトは SIG Cluster Lifecycle の管理下だったのか :eyes: 

## 廃止される機能 (Deprecations)

### kubeadm

- **`kubeadm upgrade node config` と `kubeadm upgrade node experimental-control-plane` コマンドは `kubeadm upgrade node` コマンドにその機能を譲るため非推奨となりました、将来のリリースで削除されます。** ([#78408](https://github.com/kubernetes/kubernetes/pull/78408), [@fabriziopandini](https://github.com/fabriziopandini))
- **`--experimental-control-plane` フラグは `--control-plane` フラグとなり、非推奨となりました。また `--experimental-upload-certs` も `--upload-certs` フラグとなり非推奨です。** ([#78452](https://github.com/kubernetes/kubernetes/pull/78452), [@fabriziopandini](https://github.com/fabriziopandini))
- **`kubeadm config upload` は、その代替が正式機能となったため、非推奨となりました。`kubeadm init phase upload-config` を代わりに利用してください。** ([#77946](https://github.com/kubernetes/kubernetes/pull/77946), [@Klaven](https://github.com/Klaven))

## 注目機能 (Notable Features)

### Stable

- なし

### Beta

- **kubeadm の設定ファイルフォーマットである v1beta2 バージョンの一環として、証明書をアップロードおよびダウンロード時に利用するための暗号化および復号化キーを指定できるようになりました。** ([#77012](https://github.com/kubernetes/kubernetes/pull/77012), [@rosti](https://github.com/rosti))
- **kubeadm のプレフライトチェック時に、どのエラーを無視できるかを、`InitConfiguration` と `JoinConfiguration` に指定できるようになりました。** ([#75499](https://github.com/kubernetes/kubernetes/pull/75499), [@marccarre](https://github.com/marccarre))

### Alpha

- なし

### Staging Repositories

- なし

### CLI Improvements

- **`kubeadm upgrade node` が追加されました。このコマンドは2台目以降のコントロールプレーンノードとワーカーノードに利用可能です。これに伴って `kubeadm upgrade node experimental-control-plane` コマンドと `kubeadm upgrade node config` コマンドは非推奨となりました。** ([#78408](https://github.com/kubernetes/kubernetes/pull/78408), [@fabriziopandini](https://github.com/fabriziopandini))
    - :pencil: 今まではノードのアップグレード時に 2台目以降のコントロールプレーンとワーカーノードでアップグレードのコマンドを使い分ける必要がありましたが、それが統一されたようです。
- **`kubeadm alpha certs renew` コマンドと `kubeadm upgrade` コマンドが kubeadm により管理される `KubeConfig` ファイルの中の証明書更新をサポートするようになりました。この機能は外部のCAによって署名された証明書には利用することができません。** ([#77180](https://github.com/kubernetes/kubernetes/pull/77180), [@fabriziopandini](https://github.com/fabriziopandini))
- **ローカルのPKI証明書の期限を管理するために `kubeadm alpha certs check-expiration` コマンドが追加されました。** ([#77863](https://github.com/kubernetes/kubernetes/pull/77863), [@fabriziopandini](https://github.com/fabriziopandini))

### Misc

- なし

## API の変更 (API Changes)

- **kubeadm: `v1beta2` バージョンの設定ファイルが導入されました。** ([#76710](https://github.com/kubernetes/kubernetes/pull/76710), [@rosti](https://github.com/rosti))

## その他の注目機能 (Other notable changes)

- **`kubeadm upgrade` コマンドがそれぞれのコンポーネントのアップグレード前に(外部のCAによって署名された証明書で無い限り、)証明書を更新するようになりました。ユーザは** ([#76862](https://github.com/kubernetes/kubernetes/pull/76862), [@fabriziopandini](https://github.com/fabriziopandini))
- **kubeadm 自体はノードデプロイ時に RSA キーを生成しますが、`--cert-dir` オプションで指定したディレクトリに ECDSA キーがあった場合、それを利用可能になりました。** ([#76390](https://github.com/kubernetes/kubernetes/pull/76390), [@rojkov](https://github.com/rojkov))
- **kubeadm に Windowsワーカーノード向けに CRI の自動検知が実装されました。** ([#78053](https://github.com/kubernetes/kubernetes/pull/78053), [@ksubrmnn](https://github.com/ksubrmnn))
- **`kubeadm config images` コマンドに `--image-repository` フラグが追加されました。** ([#75866](https://github.com/kubernetes/kubernetes/pull/75866), [@jmkeyes](https://github.com/jmkeyes))
    - :pencil: 指定した `--image-repository` から必要なコンテナイメージを pull しておくことができるようになりました。
    - :pencil: レビューに「エアギャップ環境のユーザ(**と中国**)のユーザにべんりですね！」ってあって笑える。
- **`kubeadm reset` コマンドが phases として利用可能になりました。** ([#77847](https://github.com/kubernetes/kubernetes/pull/77847), [@yagonobre](https://github.com/yagonobre))
    - :pencil: `kubeadm reset` で行われていた色々なリセットが phase に別れて、それぞれの phase ごとに実行できるようになりました。
    - :pencil: 例
    <pre>$ kubeadm reset preflight
$ kubeadm reset update-cluster-status
$ kubeadm reset remove-etcd-member
$ kubeadm reset cleanup-node</pre>
- **kubeadm: 新しいコントロールプレーンの追加やリセット時の `kubeadm-config` configmap の更新が、失敗しづらくなりました。この改善により、より安全に複数のコントロールプレーンが同時に追加されたりリセットできるようになります。** ([#76821](https://github.com/kubernetes/kubernetes/pull/76821), [@ereslibre](https://github.com/ereslibre))
    - :pencil: これまでの kubeadm のユースケースとしては、手作業で一台一台、ノードを追加、削除、という用途が多かったのだと思いますが、Cluster Lifecycle を管理するビルディングブロックの一つとして、例えば Cluster API から一気に、自動でノードの追加や削除を行う、といったユースケースが増えてきたのでしょう。
- **kubeadm: サポートするDockerの最低バージョンが1.13.1になりました。** ([#77051](https://github.com/kubernetes/kubernetes/pull/77051), [@chenzhiwei](https://github.com/chenzhiwei))
    - :pencil: Kubernetes 本体のサポートバージョンと合わせたようです。
- **kubeadm の CoreDNS バージョンを 1.3.1 にリバートしました。** ([#78545](https://github.com/kubernetes/kubernetes/pull/78545), [@neolit123](https://github.com/neolit123))
    - :pencil: 一度、[一気に 1.5 系まで上げた](https://github.com/kubernetes/kubernetes/pull/78030)ようですが、1.3.1 に戻したようです。
    - :pencil: CoreDNS の設定ファイルは 1.3系と1.5系で互換性がないので問題が出たのではないかと思われます。
- **`kubeadm token create --print-join-command` コマンドの機械可読性を修正しました。** ([#75487](https://github.com/kubernetes/kubernetes/pull/75487), [@displague](https://github.com/displague))
    - :pencil: 出力される join command に不必要なタブや改行が含まれていたものがクリーンアップされました。
- **`kubeadm alpha certs renew --csr-only` コマンドが現在の証明書を更新する証明書の属性のための信頼できるソースとして利用するようになりました。これは `kubeadm alpha certs renew` と同様の仕様となります。** ([#77780](https://github.com/kubernetes/kubernetes/pull/77780), [@fabriziopandini](https://github.com/fabriziopandini))
    - :pencil: `--csr-only` フラグをつけなかった場合とつけた場合で動作が異なっていたので修正したようです。
- **kubeadm: 一度で複数のブートストラップトークンを削除できるようになりました。** ([#75646](https://github.com/kubernetes/kubernetes/pull/75646), [@bart0sh](https://github.com/bart0sh))
    - :pencil: `kubeadm token delete` コマンドが複数のトークンを引数に取ることができるようになったという変更のようです。
- **OpenRC init システムのサポートを追加しました。** ([#73101](https://github.com/kubernetes/kubernetes/pull/73101), [@oz123](https://github.com/oz123))
    - :pencil: kubeadm は init システムとして systemd のみをサポートしてるのかと思ってましたが、Windows サポートの一環として init がインタフェースに切り出されて、そこに OpenRC サポートの隙ができた模様。
- **DNSレコードのデフォルトTTLが古いdnsmasqベースのkube-dnsとの一貫性を保つために5秒から30秒に変更されました。デフォルトのTTL自体は `kubectl edit -n kube-system configmap/coredns` コマンドを使って変更することができます。** ([#76238](https://github.com/kubernetes/kubernetes/pull/76238), [@Dieken](https://github.com/Dieken))
- **GCEでmTLSが有効化されていた場合は、etcdとkube-apiserverの通信がHTTPの代わりにHTTPSを利用するようになりました。** ([#74690](https://github.com/kubernetes/kubernetes/pull/74690), [@wenjiaswe](https://github.com/wenjiaswe))

## 所感

kubeadm のマスターノード HA が本格的に導入されてきた感がありますが、まだまだハマりポイントはありそうというのと、そもそもクラスタ作成に kubeadm 使ってないのでもっと下回りのアップデートもリリースノートに含めて欲しかったです！

## おまけ

SIG Cluster Lifecycle の Kubernetes 1.14 時点における変更内容まとめが宿題のように残っていたので、

<a href="https://qiita.com/shmurata/items/a796e02740b0eb7df65a#sig-special-interest-group-毎の変更点"><img width="360" alt="スクリーンショット 2019-06-25 15.47.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9958/16c01355-f292-0342-120f-f72dcc1537d8.png"></a>

余った時間にまとめました…。
### 注目機能 1.14 (Notable Features 1.14)
- **kubeadm: 新しいコントロールプレーン追加時に、すでに `init` や `upload-certs` によって証明書がクラスタにアップロードされていた際、それらをダウンロードして利用できるようになりました。** ([#74168](https://github.com/kubernetes/kubernetes/pull/74168), [@ ereslibre](https://github.com/ereslibre))
- **`kubeadm reset` 時にローカルのetcdメンバーを削除するようになりました。** ([#74112](https://github.com/kubernetes/kubernetes/pull/74112), [@pytimer](https://github.com/pytimer))
- **Linux Kernel 5.0 以上を利用時に、kubeadm のプレフライトチェックで失敗しないようになりました。** ([#74355](https://github.com/kubernetes/kubernetes/pull/74355), [@brb](https://github.com/brb))
- **新しいコントロールプレーン追加時に必要とする証明書を kubeadm-certs secretに `init` もしくは `upload-certs` phase 時に `--experimental-upload-certs` フラグを利用してアップロードできるようになりました。** ([#73907](https://github.com/kubernetes/kubernetes/pull/73907), [@yagonobre](https://github.com/yagonobre))
- **もし、Dockerを利用しておらず、一つのCRIのみをインストールしていた場合、CRIのデフォルトのドメインソケットを使ってインストールされているCRIを判別するようになりました。そのため、`--cri-socket` は省略可能となりました。** ([#69366](https://github.com/kubernetes/kubernetes/pull/69366), [@rosti](https://github.com/rosti))

### バグ修正や変更など 1.14 (Detailed Bug Fixes And Changes 1.14)
- **kubeadm: URL のパース時に nil ポインターを指していた問題を修正しました。** ([#74454](https://github.com/kubernetes/kubernetes/pull/74454), [@bart0sh](https://github.com/bart0sh))
- **CoreDNS のマニフェストに readinessProbe を追加しました。** ([#74137](https://github.com/kubernetes/kubernetes/pull/74137), [@rajansandeep](https://github.com/rajansandeep))
- **kubeadm: v1alpha3 バージョンの設定ファイルは、v1beta1 に変換する以外の用途で利用することはできません。** ([#74025](https://github.com/kubernetes/kubernetes/pull/74025), [@rosti](https://github.com/rosti))
- **kubeadm: `--kubeconfig-dir` と `--config` フラグを kubeadm init 時に同時に利用することが可能になりました。** ([#73998](https://github.com/kubernetes/kubernetes/pull/73998), [@yagonobre](https://github.com/yagonobre))
    - :pencil: `kubeadm init phase kubeconfig` 利用時に `--config` オプションと `--kubeconfig-dir` を同時に指定することができなかったため、`--config` を指定すると kubeconfig を出力するディレクトリを変更することができない、などと言った問題があったようです。
- **kubeadm: 全てのマスターコンポーネントはクラスターの重要コンポーネントとして扱うために、`PriorityClassName` を全面的に信頼するようになりました。`scheduler.alpha.kubernetes.io/critical-pod` のアノテーションは Kubernetes 1.14 ですでに利用できなくなっており、マスターコンポーネントに追加されなくなりました。** ([#73857](https://github.com/kubernetes/kubernetes/pull/73857), [@ereslibre](https://github.com/ereslibre))
- **kubeadm: リセット時に動作中のコンテナを削除する際失敗しても、バックトレースを出力しないようになりました。** ([#73951](https://github.com/kubernetes/kubernetes/pull/73951), [@rosti](https://github.com/rosti))
- **diff のために利用しているライブラリの '%' などのような文字に関連したバグを修正しました。** ([#73941](https://github.com/kubernetes/kubernetes/pull/73941), [@neolit123](https://github.com/neolit123))
- **kubeadm reset: 設定ファイルが無かった場合にクラッシュする問題を修正しました。** ([#73636](https://github.com/kubernetes/kubernetes/pull/73636), [@bart0sh](https://github.com/bart0sh))
- **CoreDNS のバージョンが 1.3.1 になりました。** ([#73610](https://github.com/kubernetes/kubernetes/pull/73610), [@rajansandeep](https://github.com/rajansandeep))
- **新しいコントロールプレーンがjoinする際に証明書があった場合、それらが少なくとも要求されるSANsとマッチすることを保証するようになりました。** ([#73093](https://github.com/kubernetes/kubernetes/pull/73093), [@ereslibre](https://github.com/ereslibre))
- **kubeadm: ServiceAccount のためのキーペアを生成する際に `--cert-dir` オプションが指定できなくなっていた問題が修正されました。** 
- **kubeadm: コントロールプレーン追加時に、`etcd` を明示的に待つようになりました。** ([#72984](https://github.com/kubernetes/kubernetes/pull/72984), [@ereslibre](https://github.com/ereslibre))
- **kubeadm: 新しいコントロールプレーン追加時にコンテナイメージをプルするようになりました。** ([#72870](https://github.com/kubernetes/kubernetes/pull/72870), [@MalloZup](https://github.com/MalloZup))
    - :pencil: `--experimental-control-plane` で join する際にコントロールプレーンで利用するイメージがなかった場合、join に失敗してたらしい。
- **kube-proxy の設定ファイルが変更した場合、kube-proxyが終了するようになりました。** ([#59176](https://github.com/kubernetes/kubernetes/pull/59176), [@dixudx](https://github.com/dixudx))
    - :pencil: kube-proxy 自身が設定ファイルの変更を監視し、変更が発生した場合は終了するようになりました。これを利用して設定ファイルの自動再読み込みを行うことができます。
- **kube-addon-manager が v9.0 にアップデートされ、kubectl の v1.13.2 を利用するようになりました。そのため、workload リソース prune するのに apps/v1 API を利用するようになります。** ([#72978](https://github.com/kubernetes/kubernetes/pull/72978), [@liggitt](https://github.com/liggitt))
- **kubeadm: `--experimental-upload-certs` フラグを利用時に証明書と秘密鍵が無いことを許容するようになりました。** ([#75415](https://github.com/kubernetes/kubernetes/pull/75415), [@ereslibre](https://github.com/ereslibre))