はじめに
Kubernetes 1.15 の CHANGELOG から SIG Cluster Lifecycle の取り組みについてまとめます。
SIG Cluster Lifecycle は複数のサブプロジェクトを持つ比較的大きめの SIG ですが、リリースノートに載った変更は主に kubeadm に関するもので、Cluster API やその他のサブプロジェクトに関するリリースノートはほとんどありませんでした。
その他の変更点についてはKubernetes 1.15: 変更点まとめから参照できます。
主な変更点 (1.15 What's New)
Cluster Lifecycle Stability and Usability Improvements
Kubernetesのインストール、アップグレードと設定を、より安定したものにすることが、この 1.15 リリースサイクルにおける SIG Cluster Lifecycle における一番の目標でした。(2019/05/06 のコミュニティアップデートをみてください。) ベアメタルにおけるツールの提供とプロダクションレディなユーザストーリーにおけるバグの修正、例えば高可用性といったユースケースは 1.15 において優先度が与えられました。
Cluster Lifecycle のビルディングブロックの一つである kubeadm はプロダクションクラスタのブートストラップを効率化する機能や安定性に必要となるコミュニティからの働きを受け続けています。kubeadm は 高可用性 (HA) のサポートをベータに昇格しました。これらはユーザが親しんでいる kubeadm init
や kubeadm join
を使って HA コントロールプレーンを設定してデプロイすることを可能にします。新しくテストスイートはこれらの機能が長期に渡って安定することを保証するために作られました。
証明書の管理は 1.15 でより安定しました。kubeadm はシームレスに証明書を期限前にローテートします。kubeadmのドキュメントで、どのように証明書を管理しているのかチェックしてください。
1.15 では kubeadm の設定 API が v1beta1 から v1beta2 になりました。
これらの変更は以下の Kubernetes の改良を反映したものです。
既知の問題 (Known Issues)
-
今の所、新しいコントロールプレーンの追加は kubeadm 1.15.0 の時点で期待通りに動作しません。この機能は 1.15.0 のリリースに向けて準備されていましたが、修正は以降のパッチリリースに含まれると思われます。
- What's new に大きく書いておきながら動かないらしい。
アップグレード時の注意点 (Urgent Upgrade Notes)
Lifecycle
- 非推奨であった古い kubeadm の設定バージョン v1alpha3 は完全に削除されました。 (#75179, @rosti)
-
kubeup.sh は "centos" と "local" プロバイダをサポートしなくなりました。 (#76711, @dims)
-
cluster/
ディレクトリ以下のスクリプトは SIG Cluster Lifecycle の管理下だったのか
-
廃止される機能 (Deprecations)
kubeadm
-
kubeadm upgrade node config
とkubeadm upgrade node experimental-control-plane
コマンドはkubeadm upgrade node
コマンドにその機能を譲るため非推奨となりました、将来のリリースで削除されます。 (#78408, @fabriziopandini) -
--experimental-control-plane
フラグは--control-plane
フラグとなり、非推奨となりました。また--experimental-upload-certs
も--upload-certs
フラグとなり非推奨です。 (#78452, @fabriziopandini) -
kubeadm config upload
は、その代替が正式機能となったため、非推奨となりました。kubeadm init phase upload-config
を代わりに利用してください。 (#77946, @Klaven)
注目機能 (Notable Features)
Stable
- なし
Beta
- kubeadm の設定ファイルフォーマットである v1beta2 バージョンの一環として、証明書をアップロードおよびダウンロード時に利用するための暗号化および復号化キーを指定できるようになりました。 (#77012, @rosti)
-
kubeadm のプレフライトチェック時に、どのエラーを無視できるかを、
InitConfiguration
とJoinConfiguration
に指定できるようになりました。 (#75499, @marccarre)
Alpha
- なし
Staging Repositories
- なし
CLI Improvements
-
kubeadm upgrade node
が追加されました。このコマンドは2台目以降のコントロールプレーンノードとワーカーノードに利用可能です。これに伴ってkubeadm upgrade node experimental-control-plane
コマンドとkubeadm upgrade node config
コマンドは非推奨となりました。 (#78408, @fabriziopandini)- 今まではノードのアップグレード時に 2台目以降のコントロールプレーンとワーカーノードでアップグレードのコマンドを使い分ける必要がありましたが、それが統一されたようです。
-
kubeadm alpha certs renew
コマンドとkubeadm upgrade
コマンドが kubeadm により管理されるKubeConfig
ファイルの中の証明書更新をサポートするようになりました。この機能は外部のCAによって署名された証明書には利用することができません。 (#77180, @fabriziopandini) -
ローカルのPKI証明書の期限を管理するために
kubeadm alpha certs check-expiration
コマンドが追加されました。 (#77863, @fabriziopandini)
Misc
- なし
API の変更 (API Changes)
その他の注目機能 (Other notable changes)
-
kubeadm upgrade
コマンドがそれぞれのコンポーネントのアップグレード前に(外部のCAによって署名された証明書で無い限り、)証明書を更新するようになりました。ユーザは (#76862, @fabriziopandini) -
kubeadm 自体はノードデプロイ時に RSA キーを生成しますが、
--cert-dir
オプションで指定したディレクトリに ECDSA キーがあった場合、それを利用可能になりました。 (#76390, @rojkov) - kubeadm に Windowsワーカーノード向けに CRI の自動検知が実装されました。 (#78053, @ksubrmnn)
-
kubeadm config images
コマンドに--image-repository
フラグが追加されました。 (#75866, @jmkeyes)-
指定した
--image-repository
から必要なコンテナイメージを pull しておくことができるようになりました。 - レビューに「エアギャップ環境のユーザ(と中国)のユーザにべんりですね!」ってあって笑える。
-
指定した
-
kubeadm reset
コマンドが phases として利用可能になりました。 (#77847, @yagonobre)-
kubeadm reset
で行われていた色々なリセットが phase に別れて、それぞれの phase ごとに実行できるようになりました。 - 例
$ kubeadm reset preflight
-
$ kubeadm reset update-cluster-status
$ kubeadm reset remove-etcd-member
$ kubeadm reset cleanup-node
-
kubeadm: 新しいコントロールプレーンの追加やリセット時の
kubeadm-config
configmap の更新が、失敗しづらくなりました。この改善により、より安全に複数のコントロールプレーンが同時に追加されたりリセットできるようになります。 (#76821, @ereslibre)- これまでの kubeadm のユースケースとしては、手作業で一台一台、ノードを追加、削除、という用途が多かったのだと思いますが、Cluster Lifecycle を管理するビルディングブロックの一つとして、例えば Cluster API から一気に、自動でノードの追加や削除を行う、といったユースケースが増えてきたのでしょう。
-
kubeadm: サポートするDockerの最低バージョンが1.13.1になりました。 (#77051, @chenzhiwei)
- Kubernetes 本体のサポートバージョンと合わせたようです。
-
kubeadm の CoreDNS バージョンを 1.3.1 にリバートしました。 (#78545, @neolit123)
- 一度、一気に 1.5 系まで上げたようですが、1.3.1 に戻したようです。
- CoreDNS の設定ファイルは 1.3系と1.5系で互換性がないので問題が出たのではないかと思われます。
-
kubeadm token create --print-join-command
コマンドの機械可読性を修正しました。 (#75487, @displague)- 出力される join command に不必要なタブや改行が含まれていたものがクリーンアップされました。
-
kubeadm alpha certs renew --csr-only
コマンドが現在の証明書を更新する証明書の属性のための信頼できるソースとして利用するようになりました。これはkubeadm alpha certs renew
と同様の仕様となります。 (#77780, @fabriziopandini)-
--csr-only
フラグをつけなかった場合とつけた場合で動作が異なっていたので修正したようです。
-
-
kubeadm: 一度で複数のブートストラップトークンを削除できるようになりました。 (#75646, @bart0sh)
-
kubeadm token delete
コマンドが複数のトークンを引数に取ることができるようになったという変更のようです。
-
-
OpenRC init システムのサポートを追加しました。 (#73101, @oz123)
- kubeadm は init システムとして systemd のみをサポートしてるのかと思ってましたが、Windows サポートの一環として init がインタフェースに切り出されて、そこに OpenRC サポートの隙ができた模様。
-
DNSレコードのデフォルトTTLが古いdnsmasqベースのkube-dnsとの一貫性を保つために5秒から30秒に変更されました。デフォルトのTTL自体は
kubectl edit -n kube-system configmap/coredns
コマンドを使って変更することができます。 (#76238, @Dieken) - GCEでmTLSが有効化されていた場合は、etcdとkube-apiserverの通信がHTTPの代わりにHTTPSを利用するようになりました。 (#74690, @wenjiaswe)
所感
kubeadm のマスターノード HA が本格的に導入されてきた感がありますが、まだまだハマりポイントはありそうというのと、そもそもクラスタ作成に kubeadm 使ってないのでもっと下回りのアップデートもリリースノートに含めて欲しかったです!
おまけ
SIG Cluster Lifecycle の Kubernetes 1.14 時点における変更内容まとめが宿題のように残っていたので、
余った時間にまとめました…。
注目機能 1.14 (Notable Features 1.14)
-
kubeadm: 新しいコントロールプレーン追加時に、すでに
init
やupload-certs
によって証明書がクラスタにアップロードされていた際、それらをダウンロードして利用できるようになりました。 (#74168, @ ereslibre) -
kubeadm reset
時にローカルのetcdメンバーを削除するようになりました。 (#74112, @pytimer) - Linux Kernel 5.0 以上を利用時に、kubeadm のプレフライトチェックで失敗しないようになりました。 (#74355, @brb)
-
新しいコントロールプレーン追加時に必要とする証明書を kubeadm-certs secretに
init
もしくはupload-certs
phase 時に--experimental-upload-certs
フラグを利用してアップロードできるようになりました。 (#73907, @yagonobre) -
もし、Dockerを利用しておらず、一つのCRIのみをインストールしていた場合、CRIのデフォルトのドメインソケットを使ってインストールされているCRIを判別するようになりました。そのため、
--cri-socket
は省略可能となりました。 (#69366, @rosti)
バグ修正や変更など 1.14 (Detailed Bug Fixes And Changes 1.14)
- kubeadm: URL のパース時に nil ポインターを指していた問題を修正しました。 (#74454, @bart0sh)
- CoreDNS のマニフェストに readinessProbe を追加しました。 (#74137, @rajansandeep)
- kubeadm: v1alpha3 バージョンの設定ファイルは、v1beta1 に変換する以外の用途で利用することはできません。 (#74025, @rosti)
-
kubeadm:
--kubeconfig-dir
と--config
フラグを kubeadm init 時に同時に利用することが可能になりました。 (#73998, @yagonobre)-
kubeadm init phase kubeconfig
利用時に--config
オプションと--kubeconfig-dir
を同時に指定することができなかったため、--config
を指定すると kubeconfig を出力するディレクトリを変更することができない、などと言った問題があったようです。
-
-
kubeadm: 全てのマスターコンポーネントはクラスターの重要コンポーネントとして扱うために、
PriorityClassName
を全面的に信頼するようになりました。scheduler.alpha.kubernetes.io/critical-pod
のアノテーションは Kubernetes 1.14 ですでに利用できなくなっており、マスターコンポーネントに追加されなくなりました。 (#73857, @ereslibre) - kubeadm: リセット時に動作中のコンテナを削除する際失敗しても、バックトレースを出力しないようになりました。 (#73951, @rosti)
- diff のために利用しているライブラリの '%' などのような文字に関連したバグを修正しました。 (#73941, @neolit123)
- kubeadm reset: 設定ファイルが無かった場合にクラッシュする問題を修正しました。 (#73636, @bart0sh)
- CoreDNS のバージョンが 1.3.1 になりました。 (#73610, @rajansandeep)
- 新しいコントロールプレーンがjoinする際に証明書があった場合、それらが少なくとも要求されるSANsとマッチすることを保証するようになりました。 (#73093, @ereslibre)
- kubeadm: ServiceAccount のためのキーペアを生成する際に
--cert-dir
オプションが指定できなくなっていた問題が修正されました。 -
kubeadm: コントロールプレーン追加時に、
etcd
を明示的に待つようになりました。 (#72984, @ereslibre) -
kubeadm: 新しいコントロールプレーン追加時にコンテナイメージをプルするようになりました。 (#72870, @MalloZup)
-
--experimental-control-plane
で join する際にコントロールプレーンで利用するイメージがなかった場合、join に失敗してたらしい。
-
-
kube-proxy の設定ファイルが変更した場合、kube-proxyが終了するようになりました。 (#59176, @dixudx)
- kube-proxy 自身が設定ファイルの変更を監視し、変更が発生した場合は終了するようになりました。これを利用して設定ファイルの自動再読み込みを行うことができます。
- kube-addon-manager が v9.0 にアップデートされ、kubectl の v1.13.2 を利用するようになりました。そのため、workload リソース prune するのに apps/v1 API を利用するようになります。 (#72978, @liggitt)
-
kubeadm:
--experimental-upload-certs
フラグを利用時に証明書と秘密鍵が無いことを許容するようになりました。 (#75415, @ereslibre)