1. 程式人生 > 其它 >Kubernetes 升級至 1.24 並將 container runtime 切換至 containerd

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

搞定!