K8s集群升级(1.24版本之前)

2024.5.30

搭建k8s集群的方式有很多种,比如二进制,kubeadm,RKE(Rancher)等,k8s集群升级方式也各有千秋,本文主要介绍使用kubeadm方式搭建的k8s集群升级方法。

注意事项:
升级集群版本建议逐步升级,比如 v1.20.4–>v1.21.4–>v1.22.4–>v1.23.4–>v1.24.4,不能跨大版本升级,否则会报错。
例如:
1.19.x → 1.20.y——可以(其中y > x)
1.19.x → 1.21.y——不可以跨段(其中y > x)
1.21.x → 1.21.y——可以(只要其中y > x)

一、升级控制节点

1)查看控制节点K8s版本(所有master节点)

	[root@k8s-master01 ~]# yum list --showduplicates kubeadm --disableexcludes=kubernetes

2)升级kubeadm(所有master节点,确定你所要升级的版本)

	[root@k8s-master01 ~]# yum install -y kubeadm-1.19.10 kubelet-1.19.10 kubectl-1.19.10 --disableexcludes=kubernetes

3)查看kubeadm版本(所有master节点)

	[root@k8s-master01 ~]# kubeadm version

4)查看升级计划(master01节点)

	[root@k8s-master01 ~]# kubeadm upgrade plan

注意:kubeadm upgrade 会自动对 kubeadm 在节点上所管理的证书执行续约操作。
如果需要略过证书续约操作,可以使用标志 --certificate-renewal=false。

5)升级master(master01节点)

	[root@k8s-master01 ~]# kubeadm upgrade apply v1.19.10 --v=5

#升级过程中输入y
–v=5: 这个选项用于设置日志的详细级别。在 Kubernetes 中,日志级别是一个整数,范围 从 0 到 10,其中 0 表示几乎不输出日志,10 表示输出非常详细的日志。在这个命令中,–v=5 表示设置日志级别为 5。
若有其他master节点需要升级,操作步骤与前四步一样,但需要使用kubeadm upgrade node命令。

[root@k8s-master02 ~]# kubeadm upgrade node(master02节点和master03节点)

6)升级kubectl和kubelet(master01节点)

多台 master 节点操作,操作顺序:master1——>master2——>master3——>master* 等分别在多台master节点上执行如下操作,注意更改节点名称。

驱逐master节点

将当前节点标记为不可调度,并驱逐节点上的Pod(master01节点)

	[root@k8s-master01 ~]# kubectl drain k8s-master02 --ignore-daemonsets
	[root@k8s-master01 ~]# kubectl drain k8s-master03 --ignore-daemonsets

##说明:–ignore-daemonsets 无视DaemonSet管理下的Pod。即–ignore-daemonsets往往需要指定的,这是因为deamonset会忽略unschedulable标签,
由于deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,这样就会成为死循环。因此忽略daemonset。

升级kubelet和kubectl组件(所有master节点)

[root@k8s-master01 ~]# yum install -y kubelet-1.19.10 kubectl-1.19.10 --disableexcludes=kubernetes

说明: --disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库

重启kubelet(所有master节点)

[root@k8s-master01 ~]# systemctl daemon-reload
[root@k8s-master01 ~]# systemctl restart kubelet
[root@k8s-master01 ~]# systemctl status kubelet

恢复节点调度,使其上线(master01节点)

[root@k8s-master01 ~]# kubectl uncordon k8s-master02
[root@k8s-master01 ~]# kubectl uncordon k8s-master03

7)查看master节点状态(所有master节点)
[root@k8s-master01 ~]# kubectl get cs

解决controller-manager和scheduler组件状态不健康问题

sed -i 's/- --port=0/#&/' /etc/kubernetes/manifests/kube-scheduler.yaml
sed -i 's/- --port=0/#&/' /etc/kubernetes/manifests/kube-controller-manager.yaml
systemctl restart kubelet

8)查看master节点状态

kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    master   70m   v1.19.10
k8s-master02   Ready    master   60m   v1.19.10
k8s-master03   Ready    master   60m   v1.19.10
k8s-node01     Ready    <none>   58m   v1.18.20
k8s-node02     Ready    <none>   58m   v1.18.20

二、升级node01节点

node节点上的升级过程应该一次执行一个节点,或者一次执行几个节点,以不影响运行工作负载所需的最小容量。

1)升级kubeadm(node01节点)

[root@k8s-node01 ~]# yum install -y kubeadm-1.19.10 kubelet-1.19.10 kubectl-1.19.10 --disableexcludes=kubernetes

2)查看kubeadm版本(node01节点)

[root@k8s-node01 ~]# kubeadm version

3)升级node(node01节点)

[root@k8s-node01 ~]# kubeadm upgrade node

4)驱逐node01节点(master01节点)

#将节点标记为不可调度并驱逐所有pod,准备节点的维护
[root@k8s-master01 ~]# kubectl drain k8s-node01 --ignore-daemonsets

5)升级kubelet和kubectl组件(node01节点)

 [root@k8s-node01 ~]# yum install -y kubelet-1.19.10 kubectl-1.19.10 --disableexcludes=kubernetes
[root@k8s-node01 ~]# systemctl daemon-reload
[root@k8s-node01 ~]# systemctl restart kubelet
[root@k8s-node01 ~]# systemctl status kubelet

6)恢复node节点调度(master01节点)

[root@k8s-master01 ~]# kubectl uncordon k8s-node01

7)同样的操作步骤升级node02节点

执行上面6步,注意修改节点名称

8)查看所有节点版本(master01节点)

[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    master   79m   v1.19.10
k8s-master02   Ready    master   69m   v1.19.10
k8s-master03   Ready    master   69m   v1.19.10
k8s-node01     Ready    <none>   67m   v1.19.10
k8s-node02     Ready    <none>   67m   v1.19.10

故障恢复

1)如果kubeadm upgrade失败且没有回滚,例如由于执行期间意外关闭,可在再次执行kubeadm upgrade。
2)在升级期间,kubeadm将以下备份文件写入/etc/kubernetes/tmp目录下。

kubeadm-backup-etcd-<date>-<time>
kubeadm-backup-manifests-<date>-<time>
Logo

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

更多推荐