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"
添加容器镜像加速器
- 在
/etc/containerd/certs.d/docker.io/hosts.toml
中添加下面的配置
[host."https://xxxxxx.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
- 在
/etc/containerd/certs.d/k8s.gcr.io/hosts.toml
中添加下面的配置
[host."registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
- 以下是过时的镜像加速器配置方法 /etc/containerd/config.toml
[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 的配置同上。
搞定!