目录
[4.master1节点迁移容器运行时(docker → containerd)](#4.master1节点迁移容器运行时(docker → containerd))
[5.master2节点迁移容器运行时(docker → containerd)](#5.master2节点迁移容器运行时(docker → containerd))
[6.node1节点容器运行时迁移(docker → containerd)](#6.node1节点容器运行时迁移(docker → containerd))
[7.升级集群计划(v1.23.14 → v1.24.1)](#7.升级集群计划(v1.23.14 → v1.24.1))
[1. 环境](#1. 环境)
[2.master1节点迁移容器运行时(docker → containerd)](#2.master1节点迁移容器运行时(docker → containerd))
[3.master2节点迁移容器运行时(docker → containerd)](#3.master2节点迁移容器运行时(docker → containerd))
[4.node1节点迁移容器运行时(docker → containerd)](#4.node1节点迁移容器运行时(docker → containerd))
[5.升级集群计划(v1.23.14 → v1.24.1)](#5.升级集群计划(v1.23.14 → v1.24.1))
[7.升级 master2节点版本(v1.24.1)](#7.升级 master2节点版本(v1.24.1))
[8.升级 node1节点版本(v1.24.1)](#8.升级 node1节点版本(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。
bash
kubectl get nodes -owide #查看容器运行时
(2)迁移master1
bash
kubectl drain master1 --delete-emptydir-data --force --ignore-daemonsets #对k8s控制节点xianchaomaster1进行drain
(3)关闭并卸载Docker
bash
systemctl disable docker --now #先启动docker
yum remove docker-ce docker-ce-cli -y #卸载
(4)安装并配置containerd
bash
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服务
bash
systemctl enable containerd ; systemctl restart containerd # 重启
systemctl status containerd # 查看服务状态
(6)配置并启动kubelet
bash
vim /etc/sysconfig/kubelet #设置kubelet启动参数
systemctl restart kubelet #重启kubelet服务
(7)对master节点进行uncordon
bash
kubectl uncordon master1 #解除维护
(8)验证
bash
kubectl get nodes -owide #验证是否把容器运行时由docker迁移到containerd
5.master2节点迁移容器运行时(docker → containerd)
(1)确定迁移容器运行时
可以看到目前的容器运行时是docker 20.10.6。
bash
kubectl get nodes -owide #查看容器运行时
(2)迁移master2
bash
kubectl drain master2 --delete-emptydir-data --force --ignore-daemonsets #对k8s控制节点xianchaomaster1进行drain
(3)关闭并卸载Docker
bash
systemctl disable docker --now #先启动docker
yum remove docker-ce docker-ce-cli -y #卸载
(4)安装并配置containerd
bash
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服务
bash
systemctl enable containerd ; systemctl restart containerd # 重启
systemctl status containerd # 查看服务状态
(6)配置并启动kubelet
bash
vim /etc/sysconfig/kubelet #设置kubelet启动参数
systemctl restart kubelet #重启kubelet服务
(7)对master2节点进行uncordon
bash
kubectl uncordon master2 #解除维护
(8)验证
bash
kubectl get nodes -owide #验证是否把容器运行时由docker迁移到containerd
6.node1节点容器运行时 迁移**(docker → containerd)**
(1) 迁移node1节点
bash
kubectl drain node1 --delete-emptydir-data --force --ignore-daemonsets #对k8s工作节点xianchaonode1进行drain
(2)关闭并卸载Docker
bash
systemctl disable docker --now # 关闭
yum remove docker-ce docker-ce-cli -y # 卸载
(3)安装并配置containerd
bash
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服务
bash
systemctl enable containerd ; systemctl restart containerd # 重启
(5)配置并启动kubelet
bash
vim /etc/sysconfig/kubelet #设置kubelet启动参数
systemctl restart kubelet #重启kubelet服务
kubectl get nodes -owide #查看pod
(6)对node1节点进行uncordon
bash
kubectl uncordon node1 #解除维护
(7)验证
bash
kubectl get nodes -owide #验证是否把容器运行时由docker迁移到containerd
(8)查看
bash
kubectl get pods -n kube-system #查看集群
7.升级集群计划( v1.23.14 → v1.24.1**)**
(1)查看集群
bash
kubectl get nodes -owide # 查看集群版本
(2)修改master1节点kubelet参数
bash
kubectl edit nodes master1 #修改
systemctl restart kubelet #重启
(3)修改master2节点kubelet参数
bash
kubectl edit nodes master2 #修改
systemctl restart kubelet #重启
(4)修改node1节点kubelet参数
bash
kubectl edit nodes node1 #修改
systemctl restart kubelet #重启
(5)确定升级版本
bash
# 执行如下命令确定升级版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
我的目标版本是1.24.1-0。
8.升级master1节点版本(v1.24.1)
(1)在k8s控制节点master1安装kubeadm1.24.1
bash
yum install -y kubeadm-1.24.1-0 --disableexcludes=kubernetes
(2)腾空控制节点master1
bash
kubectl drain master1 --delete-emptydir-data --force --ignore-daemonsets
(3)升级控制节点master1各个组件
bash
kubeadm upgrade apply v1.24.1
(4)升级kubectl和kubelet到1.24.1
bash
yum install -y kubelet-1.24.1-0 kubectl-1.24.1-0 --disableexcludes=kubernetes
(5)修改kubelet参数
bash
vim /var/lib/kubelet/kubeadm-flags.env
(6)重启kubelet
bash
systemctl daemon-reload; systemctl restart kubelet
(7)解除master1的节点维护
bash
kubectl uncordon master1
(8)查看节点状态
bash
kubectl get nodes
9.升级master2节点版本(v1.24.1)
(1)在k8s控制节点master1安装kubeadm1.24.1
bash
yum install -y kubeadm-1.24.1-0 --disableexcludes=kubernetes
(2)腾空控制节点master1
bash
kubectl drain master2 --delete-emptydir-data --force --ignore-daemonsets
(3)升级控制节点master1各个组件
bash
kubeadm upgrade apply v1.24.1
(4)升级kubectl和kubelet到1.24.1
bash
yum install -y kubelet-1.24.1-0 kubectl-1.24.1-0 --disableexcludes=kubernetes
(5)修改kubelet参数
bash
vim /var/lib/kubelet/kubeadm-flags.env
(6)重启kubelet
bash
systemctl daemon-reload; systemctl restart kubelet
(7)解除master1的节点维护
bash
kubectl uncordon master2
(8)查看节点状态
bash
kubectl get nodes
10.升级node1节点版本(v1.24.1)
(1)在k8s工作节点node1安装kubeadm1.24.1
bash
yum install -y kubeadm-1.24.1-0 --disableexcludes=kubernetes
(2)腾空控制节点master1
bash
kubectl drain node1 --delete-emptydir-data --force --ignore-daemonsets
(3)升级node1上的kubelet
bash
kubeadm upgrade node
(4)修改kubelet参数
bash
vim /var/lib/kubelet/kubeadm-flags.env
(5)升级kubelet和kubectl
bash
yum install -y kubelet-1.24.1-0 kubectl-1.24.1-0 --disableexcludes=kubernetes
(6)重启kubelet
bash
systemctl daemon-reload; systemctl restart kubelet
(7)解除node11的节点维护
bash
kubectl uncordon node1
11.验证集群(v1.24.1)
(1)验证集群状态是否正常
bash
kubectl get nodes
# 结果如下:
[root@master1 ~]# kubectl get nodes
版本均已升级到 v1.24.1。
(2) 查看集群服务状态
bash
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。
(2)迁移master1
(3)关闭并卸载Docker
先启动docker,再卸载
(4)安装并配置containerd
① 安装
② 生成配置文件
③ 使用vim编辑器打开
④第一步:搜素mirrors,并修改(原来一行变三行)
修改前:
修改后:
⑤ 第二步:搜索sandbox,并修改。
修改前:
修改后:
⑥ 第三步:搜索SystemdCgroup,并修改。
修改前:
修改后:
(5)重启containerd服务
① 重启
②查看服务
(6)配置并启动kubelet
① 设置
②修改
③ 重启kubelet服务
④这时查看pod,master1为SchedulingDisabled,容器运行时还未更新
(7)对master1节点进行uncordon
(8)验证(此时master1可以调度)
3.master2节点迁移容器运行时(docker → containerd)
(1)迁移master2
(2)关闭并卸载Docker
先启动
卸载
(4)安装并配置containerd
① 安装
② ⑩配置
③ 生成配置文件
④ 使用vim编辑器打开
⑤第一步:搜素mirrors,并修改(原来一行变三行)
⑥第二步:搜索sandbox,并修改。
⑦ 第三步:搜索SystemdCgroup,并修改。
(5)重启containerd服务
① 重启
② 查看服务
(6)配置并启动kubelet
①设置
② 修改
③ 重启
④ 这时查看pod,master2为SchedulingDisabled,容器运行时已更新
(7)对master2节点进行uncordon
(8)验证(此时master2可以调度)
4.node1节点迁移容器运行时(docker → containerd)
(1) 迁移node1节点
(2)关闭并卸载Docker
关闭并卸载
(3)安装并配置containerd
① 安装
② 配置
③生成配置文件
④ 使用vim编辑器打开
⑤ 第一步:搜素mirrors,并修改(原来一行变三行)。
⑥第二步:搜索sandbox,并修改。
⑦ 第三步:搜索SystemdCgroup,并修改。
(4)重启containerd服务
① 重启
② 查看服务
(5)配置并启动kubelet
① 设置
② 这时查看pod,node1为SchedulingDisabled,容器运行时已更新
(6)对node节点进行uncordon
(7)验证 (此时node1可以调度)
(8)查看
5.升级集群计划**(** v1.23.14 → v1.24.1**)**
(1)确定升级版本
可以看到目前的版本是v1.23.14。
(2)修改节点kubelet参数(在runtime由docker迁移到containerd之后做)
①修改master1节点
修改前:
修改后:
②重启
③修改master2节点
修改前:
修改后:
④重启
⑤修改node1节点
修改前:
修改后:
④重启
(3)确定升级计划
执行如下命令确定升级版本
我的目标版本是1.24.1-0。
6.升级master1节点版本(v1.24.1)
(1)在k8s控制节点master1安装kubeadm1.24.1
(2)腾空控制节点master1
(3)升级控制节点master1各个组件
成功
(4)升级kubectl和kubelet到1.24.1
(5)修改kubelet参数
修改前:
修改后:
(6)重启kubelet
(7)解除master1的节点维护
(8)查看节点状态(master1已升级为v1.24.1)
7.升级 master2节点版本(v1.24.1)
(1)在k8s控制节点master2安装kubeadm1.24.1
(2)腾空控制节点master2
(3)升级master2节点
成功:
(4)升级kubectl和kubelet到1.24.1
(5)修改kubelet参数
修改前:
修改后:
(6)重启kubelet
(7)查看节点状态(master1和master2都已升级为v1.24.1)
8.升级 node1节点版本(v1.24.1)
(1)在node1节点上安装kubeadm 1.24.1
(2)腾空节点node1(驱逐node1的pod)
(3)升级node1上的kubelet
(4)修改kubelet变量
修改前:
修改后:
(5)升级kubelet和kubectl
(6)解除对node1的保护
9.验证集群(v1.24.1)
(1)验证集群状态是否正常
版本均已升级到 v1.24.1。
(2) 查看集群服务状态