Kubernetes 升級至 1.24 並將 container runtime 切換至 containerd
Kubernetes 1.24 於 2022 年 5 月 3 日正式釋出(詳見 Kubernetes 1.24: Stargazer),1.24 版本的一個重大變化是從 kubelet 中移除了 dockershim,因此我們將 container runtime 從 docker 切換至 containerd,從而給升級過程中製造了不小的麻煩。
這篇博文分享的是將 Kubernetes 從 1.23.5 升級至 1.24 的實際操作步驟,升級成功後重新操作一遍並記錄步驟。
先升級 control-plane,升級命令如下
apt update apt-get install -y --allow-change-held-packages kubeadm=1.24.0-00 kubeadm upgrade apply v1.24.0 --ignore-preflight-errors=CoreDNSUnsupportedPlugins apt-get install kubelet kubectl
升級完成後 api-server 無法訪問
$ kubectl get nodes
The connection to the server k8s-api:6443 was refused - did you specify the right host or port?
出現這個問題是由於 Kubernetes 1.24 預設不支援 docker。
接下來將 container runtime 從 docker 切換到 containerd。
安裝最新版 containerd,Kubernetes 1.24 支援的 containerd 版本如下
containerd v1.6.4 and later, v1.5.11 and later
安裝命令
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install containerd.io
重新生成 containerd 配置
containerd config default > /etc/containerd/config.toml
注:或者從已有的 /etc/containerd/config.toml 中移除 disabled_plugins = ["cri"]
的配置。
修改 containerd 配置檔案 /etc/containerd/config.toml
,感謝這篇幫了大忙的博文 How to smoothly switch the kubernetes container runtime from docker to container
將 sandbox_image 的值從 k8s.gcr.io/pause:3.6
修改為 registry.aliyuncs.com/google_containers/pause:3.6
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
...
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
新增容器映象加速器
[plugins]
[plugins."io.containerd.grpc.v1.cri".registry]
...
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://xxxxxx.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["registry.aliyuncs.com/google_containers"]
接著修改 kubelet 配置檔案,修改 /var/lib/kubelet/kubeadm-flags.env 中的 kubelet 引數
- 新增
--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock
- 刪除
--network-plugin=cni
- 將
pause:3.1
改為pause:3.6
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6 --resolv-conf=/run/systemd/resolve/resolv.conf --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
執行下面的命令使修改的配置生效
systemctl daemon-reload && systemctl restart containerd && systemctl restart kubelet
到此 control-plane 的升級就完成了!
NAME STATUS ROLES AGE VERSION
kube-master0 Ready control-plane 476d v1.24.0
接下了升級 node
apt-get update && apt-get install -y kubeadm kubelet kubectl
containerd 的升級與配置、kubelet 的配置同上。
搞定!