Kubernetes 1.25版本:SIG Cluster Lifecycle的更改内容
从Kubernetes 1.25的CHANGELOG中挑选了SIG Cluster Lifecycle的相关工作。
感觉变化比平常少了许多,变得更加平静稳定。
主要テーマ (Major Themes)
- なし。
重大なアップグレードに関する警告 (Urgent Upgrade Notes)
- なし。
种类的更改
废止预定
kubeadm: ConfigMap “kubeadm-config” の ClusterConfiguration.imageRepository に古い”k8s.gcr.io”が含まれていた場合、”upgrade apply/diff/node” 中にそれを新しいデフォルトである “registry.k8s.io” に置き換えます。ただし、更新の反映は “upgrade apply” の場合のみに行われます。 (#110343, @neolit123)
kubeadm: kubeadm 特有のフィーチャーゲートであるUnversionedKubeletConfigMapがGAとなり、デフォルトで有効化されるようになりました。kubeletに関連したConfigMapとRBACルールは古い*kubelet-config-x.yy(x.yyはコントロールプレーンのバージョンです)というネーミングルールから、シンプルな*kubelet-configという名前になりました。もし、以前にUnversionedKubeletConfigMapをfalseに設定し古いネーミングフォーマットを利用していた場合、のバージョンをv1.25に上げる前に手作業で kube-system/kubelet-config-x.yy を kube-system/kubelet-config にコピーしなければなりません。 (#110327, @neolit123)
kubeadm: node-role.kubernetes.io/master:NoSchedule taintを新しいクラスタのコントロールプレーンに適用することはなくなりました。また、”kubeadm upgrade apply”中に既存のtaintをコントロールプレーンから削除します。 (#110095, @neolit123)
node-role.kubernetes.io/master のリネームは段階的に4つのステップで行われているのですが、これは三つ目の段階となり、次のリリースでひと段落となります。
First Stage (1.20)
Label: node-role.kubernetes.io/control-plane の導入。
Toleration: node-role.kubernetes.io/control-plane:NoSchedule の導入。
Second Stage (1.24)
Label: node-role.kubernetes.io/master の削除。
Taint: node-role.kubernetes.io/control-plane:NoSchedule の導入。
Third Stage (1.25)
Taint: node-role.kubernetes.io/master:NoSchedule の削除。
Fourth Stage (1.26)
Toleration: node-role.kubernetes.io/master:NoSchedule の削除。
APIの変更 (API Change)
- なし。
功能 (Feature) – 功能
kubeadm: kubeadm join時のdiscovery/kubeconfigを使った追加の認証戦略 “client-go 認証プラグイン exec, tokenFile, authProvider” がサポートされました。 (#110553, @tallaxes)
kubeadm join 時に、kubeadm init の際に提示された token を使うことが多いと思いますが、それとは別に kubeconfig ファイルをjoin時のクラスタへの接続とその認証に払い出されたトークンの代わりに利用することができるようです。
確かに、トークンを毎回払い出さずに、事前にjoinに必要な権限を渡してあるアカウントを作成しておけば運用が楽になりそうです。
kubeadm: CoreDNSのバージョンをv1.9.3にアップデートしました。 (#110489, @pacoxu)
kubeadm: kubeadm init phase addon における kube-proxy, coredns のアドオンフェーズ位において –print-manifest フラグがサポートされました。このフラグを指定すると、kubeadm は指定されたアドオンを適用せず、代わりに適用される API オブジェクトをターミナルに表示します。 (#109995, @wangyysde)
kubeadm: v1beta1.KubeletConfiguration に含まれる kubelet の設定ファイルをパッチできるようになりました。この新しいパッチターゲットはkubeletconfigurationと呼ばれています(e.g. パッチファイルは kubeletconfiguration+json.json)。メインの–configの一部としてinitに渡されるKubeletConfigurationはクラスターのKubeletConfigurationとしてグローバルに保持されますが、このパッチによりinitおよびjoinとupgrade時にノード特有のKubeletConfigurationを適用することが可能になります。 (#110405, @neolit123)
kubeadm: etcd static podの liveness probe が /health?serializable=true&exclude=NOSPACE を利用しているのに対して startup probe は /health?serializable=false を利用するようになりました。NOSPACE除外は、管理者がetcdの1メンバーずつスペースの問題に対処することを可能にします。 (#110744, @neolit123)
kubeadm: etcd static podのlivenessおよびreadinessprobeにおいて、新しいetcd v3.5.3+以降のヘルスチェック用エンドポイントである/health?serializable=trueを使うように変更しました。これにより、個々のetcdメンバーの状態をトラックすることができるようになり、もしetcdクラスターの一部のメンバーが正常でなかった場合でも全てのetcdのメンバーが失敗するようなことがなくなりました。 (#110072, @neolit123)
kubeadm: kubeadm upgrade plan 時に、–outputフラグを使うことで実験的にJSON/YAMLを出力することができるようになりました。 (#108447, @pacoxu)
kubeadm: CoreDNS に preferred anti-affinity がデフォルトで有効化されるようになりました。 (#110593, @SataQiu)
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- kube-dns
topologyKey: kubernetes.io/hostname
weight: 100
错误修复 (Bug or Regression)
kubeadm: ノードのアノテーション中の重複した unix:// プレフィックスを削除しました。 (#110656, @pacoxu)
kubeadm: 設定可能なKubernetesVersionがkubeadm join時に適用されていなかった問題を修正しました。 (#110791, @SataQiu)
kubeadm: etcdの–experimental-watch-progress-notify-intervalフラグが有効化され、5秒に設定されました。このフラグはetcdがwatch dataをkube=apiserverに送る際のインターバルを指定します。 (#111383, @p0lyn0mial)
kubeadm: image pullの間、crictlを実行する際にOSの環境変数を設定するようにしました。これによりcrictlのインターネット接続に対して*PROXY環境変数が影響を与えることができなかった問題を修正しました。 (#110134, @mk46)
kubeadm: レガシーな “master”taintが存在する場合にのみ、コントロールプレーンノードをtaintするようにしました。これにより、kubeadm upgrade を行うと、ユーザーが明示的にノードのtaintを解除した場合でも、新しい “control plane” taintでコントロールプレーンノードが再テイントされるという問題を回避することができます。 (#109840, @neolit123)
リソースの少ない自宅クラスタだとコントロールプレーンノードも有効活用するためにtaintを外すということはよくあります。
kubeadm: Kubernetes の CI バージョンを使う際、ユーザの指定したイメージレポジトリを配慮するようになりました。 (#111017, @SataQiu)
kubeadm: resetフェーズにおけるコンテナの削除時にリトライを行うようになりました。 (#110837, @SataQiu)
resetでコンテナが削除されないことがあり、それがたまたまapiserverなどのようにkubernetesに必須のポートを使うコンテナだった場合、再度行った kubeadm initでkubeadmが失敗することがあったようです。
其他(清理或碎片)
kubeadm: 追加のdockershimのクリーンアップを実行するようにしました。dockershimが1.24で削除され、kubeadm 1.25がkubeletのversion 1.24と1.25をサポートすることを考慮し、全てのcontainer runtimeが–container-runtime=remoteを指定することでremoteとして扱われるようにしました。–network-pluginフラグは新しいクラスターでは利用されることはありません。kubeadm reset 時における/var/lib/dockershim, /var/run/kubernetes, /var/lib/cniといったdockershimに関連するディレクトリのクリンナップは行われなくなります。 (#110022, @neolit123)
確かにクリンナップされなくなっていました。
root@node-cp01:/etc/kubernetes/manifests# kubeadm reset
[reset] Reading configuration from the cluster...
[reset] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0921 04:21:43.809172 21624 reset.go:103] [reset] Unable to fetch the kubeadm-config ConfigMap from cluster: failed to get config map: Get "https://10.244.5.135:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s": dial tcp 10.244.5.135:6443: connect: connection refuse
d
W0921 04:21:43.810777 21624 preflight.go:55] [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
W0921 04:21:46.176911 21624 removeetcdmember.go:85] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/etcd /var/lib/kubelet]