一.引言

k8s 在1.24.x之后的版本放弃了和 docker 的兼容,使用 containerd 作为底层的容器,直接参照官方文档的资料进行更新就会报错。因为你没有安装或者配置 containerd,所以要安装 containerd 并配置才能正确的升级 k8s,如果當前K8S使用的是docker-ce 24.0版本,無需安裝containerd ,默認已安裝,只需要參考以下升級步驟,即可從1.23.X 升級到1.24.X

 

二.查看當前版本

[root@k8s-master-01 ~]# kubectl get node

640b5e9728d349ac99e6ad6eaa48f575.png

三.Master 节点操作

1.升级 kubeadm

yum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes

kubeadm version

kubeadm upgrade plan

c0a1401ed0ed48a29ffe907bf64cd5b2.png

4340458ad400433a96ca2d3c1941f1f5.png31d5cb233b7c48ba9e56ecfce26f8ddb.png

從執行升級計劃中可以看到容器運行時的提示

2.修改節點runtime

備註:安裝了docker 24版本,默認安裝了containerd

[root@k8s-master-01 ~]# kubectl edit nodes k8s-master-01

K8s 1.23版本之前使用的runtime是/var/run/dockershim.sock

修改為/var/run/containerd/containerd.sock

2b0e646759b44512a135c9237b2c2826.png

3.修改默认Cgroup驱动

containerd config default > /etc/containerd/config.toml

SystemdCgroup = false改為true

776ed2b292294874a33f6f529e67eed8.png

4.修改kubelet相关启动参数

vim /var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS="--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2 --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"

3febf20f91e3414cbc6c21c23f2e83a8.png

5.重新加载配置

systemctl daemon-reload

#重启containerd

systemctl restart containerd

#重啟kubelet

systemctl restart kubelet

 

6.配置containerd 连接socket

cat >/etc/crictl.yaml<<EOF

runtime-endpoint: unix:///run/containerd/containerd.sock

image-endpoint: unix:///run/containerd/containerd.sock

timeout: 10

debug: false

EOF

 

7.配置containerd 代理

mkdir /etc/systemd/system/containerd.service.d

cat > /etc/systemd/system/containerd.service.d/http_proxy.conf << EOF

> [Service]

> Environment="HTTP_PROXY=http://<proxy_ip>:<proxy_port>/"

EOF

ede501701ab24a40a6ec2f89e7b932be.png

8.重新加載containerd服務

systemctl daemon-reload

systemctl restart containerd

crictl pull registry.k8s.io/kube-scheduler:v1.24.17

827971b438bb4164906848dca58083f8.png

9.執行升級

驅逐該節點上的pod

kubectl drain k8s-master-02 --ignore-daemonsets

如有提示存儲報錯,執行該命令

kubectl drain k8s-master-02 --ignore-daemonsets --delete-emptydir-data

kubeadm upgrade apply v1.24.17

更換runtime容器運行時後,pull鏡像使用crictl pull命令

a58f8a2b723044e6b1d34aeb7475b56c.pngbe3973a3c7e0450aac5106dbf8d45149.png6e5f0937077f4f26982db96042d669a3.png77ac1f03907048ba97b63884bc0ab25b.png

備註:升級時,K8s自動備份kube-apiserver.yaml

[upgrade/staticpods] Moved new manifest to "/etc/kubernetes/manifests/kube-apiserver.yaml" and backed up old manifest to "/etc/kubernetes/tmp/kubeadm-backup-manifests-2023-11-17-15-02-02/kube-apiserver.yaml"

10.升级 kubelet

yum install -y kubelet-1.24.17-0 kubectl-1.24.17-0 --disableexcludes=kubernetes

03bc66e8bf164c239567a61dc5c25857.png

systemctl daemon-reload && systemctl restart containerd  && systemctl restart kubelet

問題一:

升級完kubelet後,發現kubelet 服務報錯

systemctl status kubelet.service

29fff998fba44a4bacd351ece5d90118.png

 journalctl -xeu kubelet

50d4913619564d0288d0f9b275ccc871.png

解決方法:

修改kubelet相关启动参数

cp /etc/sysconfig/kubelet /etc/sysconfig/kubelet.backup

echo "KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd" >/etc/sysconfig/kubelet

systemctl restart kubelet

參考大神博客: <kubeadm 修改runtime为containerd_段帅星的博客-CSDN博客>

 

問題二:

升級完master01節點後,查看kube-system 命名空間下pod運行情況,發現該節點的calico pod一直重啟,查看日誌報錯信息如下:

3f3467729afe41ee849869c6bee1f02b.png

解決方法:

ps -ef | grep felix

kill掉該進程後,立馬又會運行起來

13328c25f7e74798b68f5b543932549d.png

最終解決方法殺掉runsv主進程後恢復正常,恢復需要大概幾分鐘時間calico pod才正常

4d3fa7ca2d194529936dfec3b3cb3e8b.png

 68fff1491af2471b822e4fcad69508dd.png

參考大神博客:https://blog.csdn.net/miluowan/article/details/132213960

問題三:

集群從1.23升級到1.24,更換runtime運行時後,發現創建pod後無法獲取IP,pod一直處於Terminating狀態,而且有以下報錯

3aa6c257704a4788985beae53a4db1ae.png

e378549c6b4e456b9337a854ba604437.png

解決方法:升級calico組件,k8s 和calico版本對應關係

Kubernetes 版本

Calico 版本

Calico 文档

1.18、1.19、1.20

3.18

System requirements

1.19、1.20、1.21

3.19

System requirements

1.19、1.20、1.21

3.2

System requirements

1.20、1.21、1.22

3.21

System requirements

1.21、1.22、1.23

3.22

System requirements

1.21、1.22、1.23

3.23

System requirements

1.22、1.23、1.24

3.24

System requirements

升級calico組件到3.24後,問題依然存在,繼續查看calico網絡組件CNI日誌

Tail -n 10 /var/log/calico/cni/cni.log

有一條報錯信息:ERROR][14475] plugin.go 513: Final result of CNI DEL was an error. error=error getting ClusterInformation: Get "https://[10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default": Service Unavailable

 

根據apis/crd.projectcalico.org/v1/clusterinformations/default service unavailable 查詢到是因為containerd設置了代理導致,修改containerd代理中加入NO_PROXY 10.0.0.0/8後日誌恢復正常,沒有再報錯,感謝大神博客:https://github.com/projectcalico/calico/issues/2941

e1732b05e5b8429aaf41dfb127c14009.png

修改前CNI日誌報錯信息

ea7e8c8854d94832aabe586d113af633.png

修改後CNI日誌信息

17fb236505ba4e34a879b88b7b65d457.png

修改完,重新加載containerd服務,pod可以正常建立

systemctl daemon-reload  && systemctl restart containerd

902ade99d81f4ca9a3bafb3103f49019.png

四.升級node節點

1.在worker上安装kubeadm v1.24.17

[root@k8s-node-01 ~]# yum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes

4b1f7984357b44e183ad7cec63be661e.png

2.在master上腾空worker節點

kubectl drain  k8s-node-01  --ignore-daemonsets

報錯如下:

5c4e441707a24237ae1bf909cf3ce013.png

解決方法:

kubectl drain k8s-node-01 --ignore-daemonsets --delete-emptydir-data

3.修改runtime

kubectl edit nodes k8s-node-01

K8s 1.23版本之前使用的runtime是/var/run/dockershim.sock

修改為/var/run/containerd/containerd.sock

4.修改kubelet的变量文件

vim /var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS="--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2 --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"

5.修改默认Cgroup驱动

containerd config default > /etc/containerd/config.toml

SystemdCgroup = false改為true

6.配置containerd 连接socket

cat >/etc/crictl.yaml<<EOF

runtime-endpoint: unix:///run/containerd/containerd.sock

image-endpoint: unix:///run/containerd/containerd.sock

timeout: 10

debug: false

EOF

7.重新加载配置

systemctl daemon-reload

#重启containerd

systemctl restart containerd

#重啟kubelet

systemctl restart kubelet

8.修改代理(有外網的可忽略)

mkdir /etc/systemd/system/containerd.service.d

cat > /etc/systemd/system/containerd.service.d/http_proxy.conf << EOF

> [Service]

> Environment="HTTP_PROXY=http://<proxy_ip>:<proxy_port>/"

 EOF

9.切换到master上升级kubelet配置

kubeadm upgrade node

10.升级kubelet和kubectl

yum install -y kubelet-1.24.17-0 kubectl-1.24.17-0 --disableexcludes=kubernetes

 

11.修改kubelet相关启动参数

cp /etc/sysconfig/kubelet /etc/sysconfig/kubelet.backup

echo "KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd" >/etc/sysconfig/kubelet

systemctl restart kubelet

 

12.重新加載kubelet服務

systemctl daemon-reload && systemctl restart kubelet

 

13.驗證集群

e883ef9be8c841a595350e852e0bc784.png

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐