Docker サポートが削除される警告をきちんと読まずに Kubernetes を 1.24 にアップグレードしたらクラスタが壊れたという話。
kubeadm upgrade plan
に警告がでるapt update
をしたところ Kubernetes 1.24 へのアップグレードができそうだったので、kubeadm upgrade plan
を実行したところ、次のような警告が出た。
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0505 14:28:42.708621 126359 initconfiguration.go:120] Usage of CRI endpoints without URL scheme is deprecated and can cause kubelet errors in the future. Automatically prepending scheme "unix" to the "criSocket" with value "/var/run/dockershim.sock". Please update your configuration!
[preflight] Running pre-flight checks
なにやら Docker 周りの警告のようだが、自動でスキームを付けるといったことが書かれているし問題ないだろうとおもってアップグレードを続行した。
アップグレードが終わった直後から、HTTP が繋がらないというアラートが大量に飛んでくる。kubectl describe pod
をしてみると、どうやら Node に Pod をスケジュールできないことが原因の模様。
kubectl describe nodes
をすると、なぜか NodeNotReady
の文字が。
Kubelet がうまいこと動いていないのだろうと当たりをつけ、Kubelet のログを確認する。そうすると、なにやら次のようなエラーを吐いて起動に失敗していることが判明した。
Error: failed to parse kubelet flag: unknown flag: --network-plugin
/var/lib/kubeadm-flags/env
を見ると、(当時のファイルが残っていないので定かではないが) 確かに --network-plugin=cni
のようなオプションが付けられていた。
ここで、はじめに kubeadm upgrade plan
したときの警告に含まれていた dockershim.sock
やオプションに含まれる CNI
から、そういえば Kubernetes が Docker のサポートを打ち切るというような記事を以前に読んだことを思い出す。
慌ててリリースノートを読むと、確かに 1.24 から Docker をそのまま使い続けることができないことが書かれていた。
FAQ を読むと 、Docker のまま今回のアップデートに対応する方法が書かれていることに気がついた。
思い切って containerd
に差し替えることも考えたが、とりあえずの対策として cri-dockerd
をインストールして解決することにした。
Flag --pod-infra-container-image has been deprecated, will be removed in 1.27. Image garbage collector will get sandbox image information from CRI.
"--pod-infra-container-image will not be pruned by the image garbage collector in kubelet and should also be set in the remote runtime"
のような警告も出ていたので、該当のオプションも消した。
当然のことである。