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 的配置同上。

搞定!

posted @ 2022-05-11 21:30  dudu  阅读(3942)  评论(0编辑  收藏  举报