目录

一、理论

1.K8S集群升级

2.环境

3.升级策略

4.master1节点迁移容器运行时(docker → containerd) 

5.master2节点迁移容器运行时(docker → containerd) 

6.node1节点容器运行时迁移(docker → containerd) 

7.升级集群计划(v1.23.14 → v1.24.1)

8.升级master1节点版本(v1.24.1)

9.升级master2节点版本(v1.24.1)

10.升级node1节点版本(v1.24.1)

11.验证集群(v1.24.1)

二、实验

1. 环境

2.master1节点迁移容器运行时(docker → containerd) 

3.master2节点迁移容器运行时(docker → containerd) 

4.node1节点迁移容器运行时(docker → containerd) 

5.升级集群计划(v1.23.14 → v1.24.1)

6.升级master1节点版本(v1.24.1)

7.升级 master2节点版本(v1.24.1)

8.升级 node1节点版本(v1.24.1)

9.验证集群(v1.24.1)


一、理论

1.K8S集群升级

(1)概念

        搭建K8S集群的方式有很多种,比如二进制,kubeadm,RKE(Rancher)等,K8S集群升级方式也各有千秋,目前准备使用kubeadm方式搭建的k8s集群升级方法。

        需要注意的是,升级集群版本建议逐步升级,比如v1.21.1–>v1.22.1–>v1.23.1–>v1.24.1,不能跨度过大,否则会报错。

2.环境

(1)主机(容器运行时)

表1 主机(容器运行时)

主机

架构

当前容器运行时

目标容器运行时

IP

master1

K8S master节点

docker 20.10.6

containerd 1.6.24

192.168.204.180

master2

K8S master节点

docker 20.10.6

containerd 1.6.24

192.168.204.181

node1

K8S node节点

docker 20.10.6

containerd 1.6.24

192.168.204.182 

(2)主机 (集群版本)

表2 主机(集群版本)

主机

架构

当前版本

目标版本

IP

master1

K8S master节点

v1.23.14

v1.24.1

192.168.204.180

master2

K8S master节点

v1.23.14

v1.24.1

192.168.204.181

node1

K8S node节点

v1.23.14

v1.24.1

192.168.204.182 

3.升级策略

(1)升级策略1

先迁移容器运行时为containerd:

docker → containerd

(2)升级策略2

然后升级集群版本到v1.24.1:

v1.23.14 → v1.24.1

4.master1节点迁移容器运行时(docker → containerd) 

(1)确定迁移容器运行时

可以看到目前的容器运行时是docker 20.10.6。

kubectl get nodes -owide #查看容器运行时

(2)迁移master1

kubectl drain master1  --delete-emptydir-data  --force --ignore-daemonsets   #对k8s控制节点xianchaomaster1进行drain

(3)关闭并卸载Docker

systemctl disable docker  --now     #先启动docker

yum remove docker-ce docker-ce-cli -y #卸载

(4)安装并配置containerd

yum install  containerd.io cri-tools  -y   # 安装

crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock

containerd config default > /etc/containerd/config.toml    #生成配置文件

vim /etc/containerd/config.toml    #使用vim编辑器打开,分别搜素mirrors、sandbox、SystemdCgroup并修改

(5)重启containerd服务

systemctl enable containerd  ; systemctl restart containerd  # 重启

systemctl status containerd    # 查看服务状态

(6)配置并启动kubelet

vim /etc/sysconfig/kubelet     #设置kubelet启动参数

systemctl restart kubelet      #重启kubelet服务

(7)对master节点进行uncordon

kubectl uncordon master1       #解除维护

(8)验证

kubectl get nodes -owide       #验证是否把容器运行时由docker迁移到containerd

5.master2节点迁移容器运行时(docker → containerd) 

(1)确定迁移容器运行时

可以看到目前的容器运行时是docker 20.10.6。

kubectl get nodes -owide #查看容器运行时

(2)迁移master2

kubectl drain master2  --delete-emptydir-data  --force --ignore-daemonsets   #对k8s控制节点xianchaomaster1进行drain

(3)关闭并卸载Docker

systemctl disable docker  --now     #先启动docker

yum remove docker-ce docker-ce-cli -y #卸载

(4)安装并配置containerd

yum install  containerd.io cri-tools  -y   # 安装

crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock

containerd config default > /etc/containerd/config.toml    #生成配置文件

vim /etc/containerd/config.toml    #使用vim编辑器打开,分别搜素mirrors、sandbox、SystemdCgroup并修改

(5)重启containerd服务

systemctl enable containerd  ; systemctl restart containerd  # 重启

systemctl status containerd    # 查看服务状态

(6)配置并启动kubelet

vim /etc/sysconfig/kubelet     #设置kubelet启动参数

systemctl restart kubelet      #重启kubelet服务

(7)对master2节点进行uncordon

kubectl uncordon master2      #解除维护

(8)验证

kubectl get nodes -owide       #验证是否把容器运行时由docker迁移到containerd

6.node1节点容器运行时迁移(docker → containerd) 

(1) 迁移node1节点

kubectl drain node1 --delete-emptydir-data  --force --ignore-daemonsets   #对k8s工作节点xianchaonode1进行drain

(2)关闭并卸载Docker

systemctl disable docker --now     # 关闭

yum remove docker-ce docker-ce-cli -y  # 卸载

(3)安装并配置containerd

yum install  containerd.io cri-tools  -y    #安装

crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock   # 配置

containerd config default > /etc/containerd/config.toml   #生成配置文件

vim /etc/containerd/config.toml     #使用vim编辑器打开,分别搜素mirrors、sandbox、SystemdCgroup并修改

(4)重启containerd服务

systemctl enable containerd  ; systemctl restart containerd   # 重启

(5)配置并启动kubelet

vim /etc/sysconfig/kubelet     #设置kubelet启动参数

systemctl restart kubelet       #重启kubelet服务

kubectl get nodes -owide         #查看pod

(6)对node1节点进行uncordon

kubectl uncordon node1   #解除维护

(7)验证

kubectl get nodes -owide       #验证是否把容器运行时由docker迁移到containerd

(8)查看

kubectl get pods -n kube-system      #查看集群

7.升级集群计划(v1.23.14 → v1.24.1)

(1)查看集群

kubectl get nodes -owide  # 查看集群版本

(2)修改master1节点kubelet参数

kubectl edit nodes master1   #修改
 
systemctl restart kubelet    #重启

 (3)修改master2节点kubelet参数

kubectl edit nodes master2   #修改
 
systemctl restart kubelet    #重启

 (4)修改node1节点kubelet参数

kubectl edit nodes node1   #修改
 
systemctl restart kubelet    #重启

(5)确定升级版本

# 执行如下命令确定升级版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes

 我的目标版本是1.24.1-0。

8.升级master1节点版本(v1.24.1)

(1)在k8s控制节点master1安装kubeadm1.24.1

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

(2)腾空控制节点master1

kubectl drain master1  --delete-emptydir-data  --force --ignore-daemonsets

(3)升级控制节点master1各个组件

kubeadm upgrade apply v1.24.1

(4)升级kubectl和kubelet到1.24.1

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

(5)修改kubelet参数

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

(6)重启kubelet

systemctl daemon-reload;  systemctl restart kubelet

(7)解除master1的节点维护

kubectl uncordon master1

(8)查看节点状态

kubectl get nodes

9.升级master2节点版本(v1.24.1)

在k8s控制节点master1安装kubeadm1.24.1

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

(2)腾空控制节点master1

kubectl drain master2  --delete-emptydir-data  --force --ignore-daemonsets

(3)升级控制节点master1各个组件

kubeadm upgrade apply v1.24.1

(4)升级kubectl和kubelet到1.24.1

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

(5)修改kubelet参数

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

(6)重启kubelet

systemctl daemon-reload;  systemctl restart kubelet

(7)解除master1的节点维护

kubectl uncordon master2

(8)查看节点状态

kubectl get nodes

10.升级node1节点版本(v1.24.1)

在k8s工作节点node1安装kubeadm1.24.1

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

(2)腾空控制节点master1

kubectl drain node1  --delete-emptydir-data  --force --ignore-daemonsets

(3)升级node1上的kubelet

kubeadm upgrade node

(4)修改kubelet参数

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

(5)升级kubelet和kubectl

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

(6)重启kubelet

systemctl daemon-reload;  systemctl restart kubelet

(7)解除node11的节点维护

kubectl uncordon node1

11.验证集群(v1.24.1)

(1)验证集群状态是否正常

kubectl get nodes

# 结果如下:
[root@master1 ~]# kubectl get nodes

版本均已升级到 v1.24.1。

(2) 查看集群服务状态

kubectl get pods -n kube-system

二、实验

1. 环境

(1)主机(容器运行时)

表1 主机(容器运行时)

主机

架构

当前容器运行时

目标容器运行时

IP

master1

K8S master节点

docker 20.10.6

containerd 1.6.24

192.168.204.180

master2

K8S master节点

docker 20.10.6

containerd 1.6.24

192.168.204.181

node1

K8S node节点

docker 20.10.6

containerd 1.6.24

192.168.204.182 

(2)主机 (集群版本)

表2 主机(集群版本)

主机

架构

当前版本

目标版本

IP

master1

K8S master节点

v1.23.14

v1.24.14

192.168.204.180

master2

K8S master节点

v1.24.14

v1.24.14

192.168.204.181

node1

K8S node节点

v1.24.14

v1.24.14

192.168.204.182 

2.master1节点迁移容器运行时(docker → containerd) 

 (1)确定迁移容器运行时

可以看到目前的容器运行时是docker 20.10.6。

k8s如何让容器重新pull k8s容器迁移_容器

(2)迁移master1

k8s如何让容器重新pull k8s容器迁移_kubernetes_02

(3)关闭并卸载Docker

先启动docker,再卸载

k8s如何让容器重新pull k8s容器迁移_kubernetes_03

(4)安装并配置containerd

① 安装

k8s如何让容器重新pull k8s容器迁移_kubernetes_04

② 生成配置文件

k8s如何让容器重新pull k8s容器迁移_云原生_05

③  使用vim编辑器打开

k8s如何让容器重新pull k8s容器迁移_容器_06

④第一步:搜素mirrors,并修改(原来一行变三行)

修改前:

k8s如何让容器重新pull k8s容器迁移_docker_07

修改后:

k8s如何让容器重新pull k8s容器迁移_docker_08

⑤ 第二步:搜索sandbox,并修改。

修改前:

k8s如何让容器重新pull k8s容器迁移_kubernetes_09

修改后:

k8s如何让容器重新pull k8s容器迁移_云原生_10

⑥ 第三步:搜索SystemdCgroup,并修改。

修改前:

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_11

修改后:

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_12

(5)重启containerd服务

① 重启

k8s如何让容器重新pull k8s容器迁移_云原生_13

②查看服务

k8s如何让容器重新pull k8s容器迁移_docker_14

(6)配置并启动kubelet

①  设置

k8s如何让容器重新pull k8s容器迁移_容器_15

②修改

k8s如何让容器重新pull k8s容器迁移_云原生_16

③ 重启kubelet服务

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_17

④这时查看pod,master1为SchedulingDisabled,容器运行时还未更新

k8s如何让容器重新pull k8s容器迁移_容器_18

(7)对master1节点进行uncordon

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_19

(8)验证(此时master1可以调度)

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_20

3.master2节点迁移容器运行时(docker → containerd) 

(1)迁移master2

k8s如何让容器重新pull k8s容器迁移_kubernetes_21

(2)关闭并卸载Docker

先启动

k8s如何让容器重新pull k8s容器迁移_容器_22

卸载

k8s如何让容器重新pull k8s容器迁移_docker_23

(4)安装并配置containerd

①  安装

k8s如何让容器重新pull k8s容器迁移_云原生_24

② ⑩配置

k8s如何让容器重新pull k8s容器迁移_容器_25

③ 生成配置文件

k8s如何让容器重新pull k8s容器迁移_docker_26

④ 使用vim编辑器打开

k8s如何让容器重新pull k8s容器迁移_容器_27

⑤第一步:搜素mirrors,并修改(原来一行变三行)

k8s如何让容器重新pull k8s容器迁移_云原生_28

⑥第二步:搜索sandbox,并修改。

k8s如何让容器重新pull k8s容器迁移_云原生_29

⑦ 第三步:搜索SystemdCgroup,并修改。

k8s如何让容器重新pull k8s容器迁移_云原生_30

(5)重启containerd服务

① 重启

k8s如何让容器重新pull k8s容器迁移_kubernetes_31

②  查看服务

k8s如何让容器重新pull k8s容器迁移_docker_32

(6)配置并启动kubelet

①设置

k8s如何让容器重新pull k8s容器迁移_云原生_33

② 修改

k8s如何让容器重新pull k8s容器迁移_容器_34


③ 重启

k8s如何让容器重新pull k8s容器迁移_docker_35

④ 这时查看pod,master2为SchedulingDisabled,容器运行时已更新

k8s如何让容器重新pull k8s容器迁移_云原生_36

 (7)对master2节点进行uncordon

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_37

(8)验证(此时master2可以调度)

k8s如何让容器重新pull k8s容器迁移_docker_38

4.node1节点迁移容器运行时(docker → containerd) 

(1) 迁移node1节点

k8s如何让容器重新pull k8s容器迁移_docker_39

(2)关闭并卸载Docker

关闭并卸载

k8s如何让容器重新pull k8s容器迁移_kubernetes_40

(3)安装并配置containerd

①  安装

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_41

② 配置

k8s如何让容器重新pull k8s容器迁移_云原生_42

③生成配置文件

k8s如何让容器重新pull k8s容器迁移_云原生_43

④ 使用vim编辑器打开

k8s如何让容器重新pull k8s容器迁移_容器_44

⑤ 第一步:搜素mirrors,并修改(原来一行变三行)。

k8s如何让容器重新pull k8s容器迁移_kubernetes_45

⑥第二步:搜索sandbox,并修改。

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_46

⑦ 第三步:搜索SystemdCgroup,并修改。

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_47

(4)重启containerd服务

① 重启

k8s如何让容器重新pull k8s容器迁移_kubernetes_48

②  查看服务

k8s如何让容器重新pull k8s容器迁移_容器_49

(5)配置并启动kubelet

①  设置

k8s如何让容器重新pull k8s容器迁移_kubernetes_50

② 这时查看pod,node1为SchedulingDisabled,容器运行时已更新

k8s如何让容器重新pull k8s容器迁移_kubernetes_51

(6)对node节点进行uncordon

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_52

(7)验证 (此时node1可以调度)

k8s如何让容器重新pull k8s容器迁移_云原生_53

(8)查看

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_54

5.升级集群计划(v1.23.14 → v1.24.1)

(1)确定升级版本

可以看到目前的版本是v1.23.14。

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_55

(2)修改节点kubelet参数(在runtime由docker迁移到containerd之后做)

①修改master1节点

k8s如何让容器重新pull k8s容器迁移_docker_56

修改前:

k8s如何让容器重新pull k8s容器迁移_云原生_57

修改后:

k8s如何让容器重新pull k8s容器迁移_kubernetes_58

②重启

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_59

③修改master2节点

k8s如何让容器重新pull k8s容器迁移_云原生_60

 修改前:

k8s如何让容器重新pull k8s容器迁移_云原生_57

修改后:

k8s如何让容器重新pull k8s容器迁移_kubernetes_58

④重启

k8s如何让容器重新pull k8s容器迁移_云原生_63

⑤修改node1节点

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_64

 修改前:

k8s如何让容器重新pull k8s容器迁移_云原生_57

修改后:

k8s如何让容器重新pull k8s容器迁移_kubernetes_58

④重启

k8s如何让容器重新pull k8s容器迁移_kubernetes_67

(3)确定升级计划

执行如下命令确定升级版本

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_68

k8s如何让容器重新pull k8s容器迁移_kubernetes_69

我的目标版本是1.24.1-0。

6.升级master1节点版本(v1.24.1)

(1)在k8s控制节点master1安装kubeadm1.24.1

k8s如何让容器重新pull k8s容器迁移_kubernetes_70

(2)腾空控制节点master1

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_71

(3)升级控制节点master1各个组件

k8s如何让容器重新pull k8s容器迁移_docker_72

成功

k8s如何让容器重新pull k8s容器迁移_云原生_73

(4)升级kubectl和kubelet到1.24.1

k8s如何让容器重新pull k8s容器迁移_kubernetes_74

(5)修改kubelet参数

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_75

修改前:

k8s如何让容器重新pull k8s容器迁移_docker_76

修改后:

k8s如何让容器重新pull k8s容器迁移_云原生_77

(6)重启kubelet

k8s如何让容器重新pull k8s容器迁移_kubernetes_78

(7)解除master1的节点维护

k8s如何让容器重新pull k8s容器迁移_docker_79

(8)查看节点状态(master1已升级为v1.24.1)

k8s如何让容器重新pull k8s容器迁移_docker_80

k8s如何让容器重新pull k8s容器迁移_kubernetes_81

7.升级 master2节点版本(v1.24.1)

(1)在k8s控制节点master2安装kubeadm1.24.1

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_82

(2)腾空控制节点master2

k8s如何让容器重新pull k8s容器迁移_云原生_83

(3)升级master2节点

k8s如何让容器重新pull k8s容器迁移_容器_84

成功:

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_85

(4)升级kubectl和kubelet到1.24.1

k8s如何让容器重新pull k8s容器迁移_云原生_86

(5)修改kubelet参数

k8s如何让容器重新pull k8s容器迁移_云原生_87

修改前:

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_88

修改后:

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_89

(6)重启kubelet

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_90

(7)查看节点状态(master1和master2都已升级为v1.24.1)

k8s如何让容器重新pull k8s容器迁移_k8s如何让容器重新pull_91

8.升级 node1节点版本(v1.24.1)

(1)在node1节点上安装kubeadm 1.24.1

k8s如何让容器重新pull k8s容器迁移_kubernetes_92

(2)腾空节点node1(驱逐node1的pod)

k8s如何让容器重新pull k8s容器迁移_docker_93

(3)升级node1上的kubelet

k8s如何让容器重新pull k8s容器迁移_kubernetes_94

(4)修改kubelet变量

k8s如何让容器重新pull k8s容器迁移_云原生_95

修改前:

k8s如何让容器重新pull k8s容器迁移_容器_96

修改后:

k8s如何让容器重新pull k8s容器迁移_容器_97

(5)升级kubelet和kubectl

k8s如何让容器重新pull k8s容器迁移_docker_98

(6)解除对node1的保护

k8s如何让容器重新pull k8s容器迁移_docker_99

9.验证集群(v1.24.1)

(1)验证集群状态是否正常


k8s如何让容器重新pull k8s容器迁移_kubernetes_100

版本均已升级到 v1.24.1。

(2) 查看集群服务状态

k8s如何让容器重新pull k8s容器迁移_kubernetes_101