はじめに
Kubernetes 1.17 の CHANGELOG から SIG Cluster Lifecycle の取り組みについてにピックアップしました。
hyperkube が非推奨になるかならないかでバタバタしており、リリースノートに一貫性がなく、非常に読みづらくストレスフルでした
1.17 の主な変更点 (What's New)
- なし
既知の問題 (Known Issues)
- なし
重大なアップグレードに関する通達 (Urgent Upgrade Notes)
Cluster Lifecycle
-
kubeadm: init サブコマンドに kubelet-finalize フェーズと、プライマリのコントロールプレーンノードにおける kubelet クライアント証明書の自動更新を有効化する実験的なサブフェーズを追加しました。1.17 以前および、既存のkubeadm initで作成されたノードで、kubelet クライアント証明書のローテーションを行いたい場合は、
/etc/kubernetes/kubelet.conf
を編集し、埋め込みされたクライアント証明書と鍵から、以下二つのローテーションされた証明書のシムリンクに変更してください。client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem, client-key: /var/lib/kubelet/pki/kubelet-client-current.pem (#84118, @neolit123)-
kubeadm join で繋がったノードはすでにクライアント証明書のローテートに対応していたのですが、kubeadm init で作成された最初のノードは証明書とキーが kubelet.conf にハードコードされたままになっていたようです。kubernetes/kubeadm#1753
-
廃止予定および削除された機能 (Deprecations and Removals)
-
kubeadm.k8s.io/v1beta1
は非推奨になりました。設定ファイルを新しい、非推奨ではない API バージョンに更新してください。 (#83276, @Klaven) -
kubeadm は hyperkube イメージの使用を非推奨としました。 (#85094, @rosti)
-
hyperkube イメージ本体が非推奨 (k/k レポジトリでのメンテナンスが行われなくなり、コミュニティベースとなった) となったため、それに合わせた変更とissueに書かれているのですが、参照先のissueは結局closeされており、hyperkube 自体は非推奨になったわけではないようです。
TL;DR we are not moving the binary/image from k/k, we have an alternative container image based on a script now.
-
注目機能 (Notable Features)
Stable
- なし
Beta
- なし
API の変更点 (API Changes)
- なし
その他の注目すべき変更 (Other notable changes)
Cluster Lifecycle
-
kubeadm alpha certsコマンドは、該当するファイルが存在しない場合、処理をスキップするようになりました。 (#85092, @fabriziopandini)
-
例えば、
kubeadm alpha certs check-expiration
の実行時などに、何らかの理由で証明書が失われていた場合/無かった場合、エラーでコマンドの実行自体が終了してしまっていました。 -
この変更により、コマンドの実行がベストエフォートとなり、処理できる処理のみをとにかく実行するようになりました。
-
-
kubeadm:
kubeadm token create
コマンドで--certificate-key
フラグが利用できるようになりました。このフラグは証明書のコピーを伴ったコントロールプレーンノードとしての join コマンドを生成する為に利用することができます。 (#84591, @TheLastProject) -
kubeadm: kubeletが標準エラーでログをダンプする場合、kubeadmがkubeletのバージョンを解析できない問題を修正します。 (#85351, @rosti)
-
kubeadm は kubelet のバージョンを
execer.Command("kubelet", "--version")
を用いて取得しますが、command.CombinedOutput()
の結果を用いていた為、標準エラーに何らかの出力があった場合解析に失敗していたようです。
-
- kubeadm: etcd API の全ての呼び出しをリトライするようにしました。これによってkubeadm はネットワークの不調などに、より耐性を持つようになります。 (#85201, @fabriziopandini)
- kubeadm: 特定の条件下で、initとjoinが無期限にハングするバグを修正しました。 (#85156, @chuckha)
-
kubeadm: CoreDNS version 1.6.5 を利用するようになりました。 (#85109, @rajansandeep)
- kubernetes プラグインにコントロールプレーンのレイテンシを測定するためのメトリクスが追加されました。
- healthプラグインにlameduckオプションがデフォルトで有効化され、シャットダウンする前に一定の時間待機するようになります。
-
kubeadm: 外部のetcdを利用したクラスターで
kubeadm alpha certs
コマンドを実行する際に発生したバグが修正されました。 (#85091, @fabriziopandini) -
kubeadm は kubeletおよびkube-proxyの設定ファイルに対するバリデーションとでフォルティングを行わないようになりました。 (#79223, @rosti)
- kubeadm から k/k パッケージへの依存を取り除く作業の一環のようです。
-
kubeadm: v1.14 より非推奨の
kubeadm upgrade apply
における--cri-socket
フラグは削除されました。 (#85044, @neolit123) -
kubeadm: apiserverのエンドポイントが到達不能であった場合、
kubeadm reset
などのコマンドがハングする問題を修正しました。 (#84648, @neolit123)-
apiserverへの接続タイムアウトがデフォルト値で数分かかってしまうため、10s にハードコードしていました。
-
-
kubeadm: 二番目以降のコントロールプレーンノードで、
kubeadm upgrade node
実行時にetcd のアップグレードがスキップされていた問題が修正されました。 (#85024, @neolit123)-
v1.15 の kubeadm でも問題になることがわかっているため、この修正はバックポートされます。
-
v1.14 と v1.13 のサポートするetcdのバージョンは同じため問題ないようです。
-
-
kubeadm: kube-proxyの
.containers[].env
に関連する問題を修正しました。 (#84888, @neolit123)-
ホストの
*_PROXY
環境変数を kube-proxy に伝播する実装に問題があったようです。
-
-
GKEのWindowsのテストログをダンプする為に diagnostics tool を使用するようにしました。 (#83517, @YangLu1031)
-
k/kレポジトリ中の
cluster/
ディレクトリにあるlog-dump スクリプトの話です。
-
-
kubeadm:
--flex-volume-plugin-dir
フラグで渡されたディレクトリを kube-controller-manager がホストパスで常にマウントするようになりました。 (#84468, @neolit123) -
Cluster Autoscaler のバージョンを 1.16.2 に更新しました。 (#84038, @losipiuk)
-
これもk/kレポジトリ中の
cluster/
ディレクトリ中のスクリプトの話です。
-
-
kubeadm は
/etc/cni/net.d
をインストールしないため、削除しなくなりました。ユーザは自身でそのファイルを削除するか、それらを生成したコンポーネントに任せてください。 (#83950, @yastij) -
kubeadm: ノードアップグレードのための、
--certificate-renewal
フラグの不適切なデフォルト値を修正しました。 (#83528, @neolit123)-
デフォルト false が true に変更されました。
-
-
metrics-server のバージョンを 0.3.5 にしました。 (#83015, @olagacek)
-
k/kレポジトリ中の
cluster/addons
ディレクトリにあるアドオンマニフェストの話です。
-
-
Dashboard: non-Linuxノードにおいてダッシュボードを無効化しました。この手順はWindowsワーカーのノードをサポートするために必要です。 (#82975, @wawa0210)
-
k/kレポジトリ中の
cluster/addons
ディレクトリにあるアドオンマニフェストの話です。 -
ダッシュボードってLinuxじゃないと動かないんですね?
-
-
ブートストラップトークンのクリーンナップ時に kube-controller-managerがパニックする問題を修正しました。 (#82887, @tedyu)
-
controller のキューに文字列を入れるべきところでオブジェクトをそのまま突っ込んでパニックを起こしていたようです。
-
-
kubeadm: Jobをデプロイするアップグレード時のヘルスチェックを追加しました。 (#81319, @neolit123)
-
アップグレード前のヘルスチェックとして以下を行なっているようです。
- Job を作成して apiserver が起動しているかを確認。
- コントロールプレーンのノードが Ready であるか確認。
- Static Pod のマニフェストがディスクに存在しているか確認。
-
- kubeadmは、kube-controller-manager のデュアルスタックのためのノードCIDRを自動で計算するようになりました。 (#85609, @Arvinderpal)
-
kubeadm: resetサブコマンドがフォルダを削除できなかった場合、ワーニングを出すようにしました。 (#85265, @SataQiu)
-
前回調査時にも感じたが、エラーを握りつぶしていたところを修正する変更が多い。
-
- kubeadm: kube-schedulerとkube-controller-managerのセキュアなヘルスチェックの使用を有効化しました。それにより、kube-schedulerのポートが10251から10259に、kube-controller-managerのポートが10252から10257に変わりました。 (#85043, @neolit123)
-
kubeletの新しいコマンドラインオプションである
--reserved-cpus
が明示的にシステムのために予約されたCPUリストを定義するため導入されました。例えば、--reserved-cpus=0,1,2,3
と指定された場合、CPUの0,1,2,3はシステムのために予約されます。24個のCPUを持ったシステムでは、ユーザはカーネルオプションとしてisolcpus=4-23
と指定し CPUの 4-23 をユーザコンテナに使用できます。 (#83592, @jianzzha)-
SIG-Node の変更に見えるが、なぜここに…。
-
-
kubelet:
--config
で指定される kubelet の設定ファイルが厳密に解釈されるようになりました。例えば重複した内容や、存在しない項目があった場合に失敗します。この変更により、設定ファイルに異常であったり、インデントがおかしかったりタイポがあったりしたことによる予期しない振る舞いから守られます。 (#83204, @obitech) -
kubeadm: kube-proxy にプロキシに関する環境変数を伝播するようになりました。 (#84559, @yastij)
-
あ、バグを混入してたやつだ。
-
-
最新の有効なDockerバージョンを19.03に更新しました。 (#84476, @neolit123)
Version: []string{`1\.13\..*`, `17\.0[3,6,9]\..*`, `18\.0[6,9]\..*`, `19\.03\..*`},
-
Ingres-GCE のバージョンを v1.6.1 に更新しました。 (#84018, @rramkumar1)
-
k/kレポジトリ中の
cluster/
ディレクトリ中のスクリプトの話です。
-
-
kubeadm:
certs check-expiration
で関係する CA の有効期限を表示するようにしました。 (#83932, @SataQiu)-
以下のような表示になるらしい。
-
[root@node-ttnm ~]# ./kubeadm alpha certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 15, 2020 08:25 UTC 364d no
apiserver Oct 15, 2020 08:25 UTC 364d ca no
apiserver-etcd-client Oct 15, 2020 08:25 UTC 364d etcd-ca no
apiserver-kubelet-client Oct 15, 2020 08:25 UTC 364d ca no
controller-manager.conf Oct 15, 2020 08:25 UTC 364d no
etcd-healthcheck-client Oct 15, 2020 08:25 UTC 364d etcd-ca no
etcd-peer Oct 15, 2020 08:25 UTC 364d etcd-ca no
etcd-server Oct 15, 2020 08:25 UTC 364d etcd-ca no
front-proxy-client Oct 15, 2020 08:25 UTC 364d front-proxy-ca no
scheduler.conf Oct 15, 2020 08:25 UTC 364d no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Oct 13, 2029 08:25 UTC 9y no
etcd-ca Oct 13, 2029 08:25 UTC 9y no
front-proxy-ca Oct 13, 2029 08:25 UTC 9y no
-
kubeadm:
kubeadm token list
の出力で JSON, YAML, Go テンプレートおよび JsonPath フォーマットを実装しました。 (#78764, @bart0sh) -
kubeadm: 広告アドレスとして 127.0.0.1 のサポートを追加しました。kubeadmは自動的にこの値をループバックインタフェースのグローバルユニキャストIPアドレスに変換します。 (#83475, @fabriziopandini)
-
ユースケースとして RFC5549 でループバックについた IPv4のアドレスをアドバタイズする場合について書かれていました。
-
-
kube-scheduler:
--config
で指定される kube-scheduler の設定ファイルが厳密に解釈されるようになりました。例えば重複した内容や、存在しない項目があった場合に失敗します。この変更により、設定ファイルに異常であったり、インデントがおかしかったりタイポがあったりしたことによる予期しない振る舞いから守られます (#83030, @obitech) -
kubeadm: 設定ファイル中の ServiceSubnet に渡される Service CIDR のカンマで区切られたリストを
--service-cluster-ip-range
で設定できるようになりました。 (#82473, @Arvinderpal) -
clictl を v1.16.1 に更新しました。 (#82856, @Random-Liu)
-
k/kレポジトリ中の
cluster/
ディレクトリ中の GCE 向けスクリプトの話のようです。
-
-
非推奨の extensions API の使用に関する問題を修正するため、addon-resizer を 1.8.7 に更新しました。 (#85864, @liggitt)
-
k/kレポジトリ中の
cluster/addons
ディレクトリ中のアドオンで利用している addon-resizer のバージョンの話です。
-
-
スクリプトベースの必要なバイナリを全て含んだ hyperkube に簡素化しました。これは go ベースの hyperkube コマンドとそのイメージの等価な代替です。 (#84662, @dims)
-
hyperkube を非推奨にしようとする動きがあったのですが、その理由の一つが hyperkube コマンドが go で実装されており
k8s.io/kubernetes
に依存していたことだったようです。 -
k8s.io/kubernetes
はライブラリとしての利用を推奨しておらず hyperkube がその非推奨な依存を持っていたためです。 -
この PR で hyperkube をスクリプトベースで再実装し、
k8s.io/kubernetes
への依存を取り除いたようです。 -
ただ、この実装方法では全てのバイナリ (apiserver, controller-manager, scheduler など)をイメージに内包することになり、結果的にイメージサイズが大きくなります。このことにより hyperkube を使う大きな理由の一つが失われたように感じます。
-
-
hyperkubeは新しい GitHub レポジトリに移動し、1.17のリリースに含まれなくなるようでしょう。 (#83454, @dims)
-
最終的な結論を見る限りこのリリースノートは嘘です。
-
-
kube-up スクリプトから Prometheus クラスターモニタリングアドオンを削除しました。 (#83442, @serathius)
-
メンテナンスも大変だし、
cluster/addons
の Prometheus なんて誰も使ってないでしょ、ということで削除したようです。
-
-
sourceReady は kubelet の設定源、例えば apiserverのupdate readinessなどのreadinessを供給します。 (#81344, @zouyee)
-
リリースノート見ただけじゃなんじゃこりゃって感じですな。
-
reconcile する前にソースの Ready を見るようにしたらしい。
-
ってか、これも SIG-Node では…。
-
-
このPRは、NodeLocal DNSCacheが有効かどうかに関係なく、
--cluster-dns
フラグの値をkube-dnsサービスIPに設定します。 NodeLocal DNSCacheは、リンクローカルとサービスIPの両方でリッスンします。 (#84383, @prameshj)-
cluster/addons
のノードローカルDNSアドオンの話のようです。
-
-
kube-dns アドオンにて、全てのコンテナが制限された権限で実行されるようになりました。またほと温度のコンテナがnon-rootなユーザで実行されるようになり、rootのファイルシステムがリードオンリーになりました。また、残ったrootで実行されるコンテナも、最小限の要求されるLinuxケーパビリティを持つようになりました。全てのコンテナの権限昇格も無効化されました。 (#82347, @pjbgf)
-
kube-dns ってまだ使ってるユーザいるのかな?
-
cluster/addons
にある kube-dns の話です。
-
-
Kubernetes は firewalld を監視しません。ファイアウォールのメンテナンスのためにfirewalldを利用しているシステムではfirewalldによる kube-proxy のiptables ルールを削除するような破壊的な操作からの回復が少し時間がかかるようになります。 (#81517, @danwinship)
- これらの変更の副作用としてkube-proxyの
sync_proxy_rules_last_timestamp_seconds
のメトリクスはこれまでと同様に振る舞いません。単に60秒ごとの更新というよりもむしろServiceやEndpointの変更時にのみ変更します。もし、あなたがiptablesの更新が失敗したことを監視したかった場合sync_proxy_rules_iptables_restore_failures_total
を利用する方が良いかもしれません。 -
SIG-Network では…?
- これらの変更の副作用としてkube-proxyの