Kubeadm 升級K8S集群1.23.X到1.24.X(原創)
k8s 從1.23.X升級到1.24.X
一.引言
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
三.Master 节点操作
1.升级 kubeadm
yum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes
kubeadm version
kubeadm upgrade plan
從執行升級計劃中可以看到容器運行時的提示
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
3.修改默认Cgroup驱动
containerd config default > /etc/containerd/config.toml
SystemdCgroup = false改為true
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.重新加载配置
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
8.重新加載containerd服務
systemctl daemon-reload
systemctl restart containerd
crictl pull registry.k8s.io/kube-scheduler:v1.24.17
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命令
備註:升級時,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
systemctl daemon-reload && systemctl restart containerd && systemctl restart kubelet
問題一:
升級完kubelet後,發現kubelet 服務報錯
systemctl status kubelet.service
journalctl -xeu kubelet
解決方法:
修改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
問題二:
升級完master01節點後,查看kube-system 命名空間下pod運行情況,發現該節點的calico pod一直重啟,查看日誌報錯信息如下:
解決方法:
ps -ef | grep felix
kill掉該進程後,立馬又會運行起來
最終解決方法殺掉runsv主進程後恢復正常,恢復需要大概幾分鐘時間calico pod才正常
參考大神博客:https://blog.csdn.net/miluowan/article/details/132213960
問題三:
集群從1.23升級到1.24,更換runtime運行時後,發現創建pod後無法獲取IP,pod一直處於Terminating狀態,而且有以下報錯
解決方法:升級calico組件,k8s 和calico版本對應關係
Kubernetes 版本 | Calico 版本 | Calico 文档 |
1.18、1.19、1.20 | 3.18 | |
1.19、1.20、1.21 | 3.19 | |
1.19、1.20、1.21 | 3.2 | |
1.20、1.21、1.22 | 3.21 | |
1.21、1.22、1.23 | 3.22 | |
1.21、1.22、1.23 | 3.23 | |
1.22、1.23、1.24 | 3.24 |
升級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
修改前CNI日誌報錯信息
修改後CNI日誌信息
修改完,重新加載containerd服務,pod可以正常建立
systemctl daemon-reload && systemctl restart containerd
四.升級node節點
1.在worker上安装kubeadm v1.24.17
[root@k8s-node-01 ~]# yum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes
2.在master上腾空worker節點
kubectl drain k8s-node-01 --ignore-daemonsets
報錯如下:
解決方法:
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.驗證集群
更多推荐
所有评论(0)