文章目录
- 一、环境
- 二、注意事项
- 1、备份数据
- 2、跨版本升级
- 3、支持的版本偏差
- 3.1、kube-apiserver
- 3.2、kubeklet
- 3.3、kube-proxy
- 3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager
- 3.5、kubectl
 
- 4、升级流程
 
- 三、版本升级(补丁版本升级)
- 1、查看当前版本
- 2、确定要升级到的版本
- 3、升级 master 节点
- 3.1、升级 kubeadm
- 3.2、验证下载的 kubeadm 版本是否正确
- 3.3、验证升级计划
- 3.4、根据提示,选择合适版本升级
- 3.5、设置 master 节点进入维护状态
- 3.6、升级 kubelet 和 kubectl
- 3.7、重载重启 kubelet
- 3.8、解除对 master 节点的隔离状态
- 3.9、验证 master 节点升级情况
 
- 4、升级 Worker 节点
- 4.1、升级 kubeadm
- 4.2、升级 kubelet 的配置
- 4.3、设置 worker 节点为维护状态
- 4.4、升级 kubelet 和 kubectl
- 4.5、重载重启 kubelet
- 4.6、解除对 worker 节点的隔离状态
 
- 5、最终结果
 
- 四、版本升级(次要版本升级)
- 1、查看当前版本
- 2、升级 master 节点
- 2.1、升级 kubeadm
- 2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办
 
- 2.2、验证下载的 kubeadm 版本是否正确
- 2.3、验证升级计划
- 2.4、根据提示,选择合适版本升级
- 2.5、设置 master 节点进入维护状态
- 2.6、升级 kubelet 和 kubectl
- 2.7、重载重启 kubelet
- 2.8、解除对 master 节点的隔离状态
- 2.9、验证 master 节点升级情况
 
- 3、升级 Worker 节点
- 3.1、升级 kubeadm
- 3.2、升级 kubelet 的配置
- 3.3、设置 worker 节点为维护状态
- 3.4、升级 kubelet 和 kubectl
- 3.5、重载重启 kubelet
- 3.6、解除对 worker 节点的隔离状态
 
- 4、验证
 
- 五、工作原理
- 1、kubeadm upgrade apply 做了以下工作:
- 2、kubeadm upgrade node 在其他控制平节点上执行以下操作:
- 3、kubeadm upgrade node 在工作节点上完成以下工作:
 
一、环境
| 操作系统 | CentOS Linux release 7.9.2009 (Core) | 
|---|---|
| Kubernetes 部署工具 | kubeadm | 
| 集群架构 | 一个主节点(Master Node)和两个工作节点(Worker Nodes) | 
| 部署环境 | Vmware Workstation 16 Pro | 
| 网络插件 | Flannel | 

二、注意事项
1、备份数据
升级前最好备份所有组件及数据,例如etcd
2、跨版本升级
不要跨两个大版本进行升级,可能会存在版本bug
Kubernetes 版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是补丁版本
-  1.22.2 --> 1.22.16 可以 
-  1.22.2 --> 1.23.2 可以 
-  1.22.2 --> 1.25.2 不可以 
-  跨多个版本的可以逐个版本进行升级。 
3、支持的版本偏差
3.1、kube-apiserver
在高可用性(HA)集群中, 最新版和最老版的 kube-apiserver 实例版本偏差最多为一个次要版本。
例如:
- 最新的 kube-apiserver实例处于 1.31 版本
- 其他 kube-apiserver实例支持 1.31 和 1.30 版本
3.2、kubeklet
- kubelet版本不能比- kube-apiserver版本新。
- kubelet可以比- kube-apiserver低三个次要版本(如果- kubelet< 1.25,则只能比- kube-apiserver低两个次要版本)。
例如:
- kube-apiserver处于 1.31 版本
- kubelet支持 1.31、1.30、1.29 和 1.28 版本
如果 HA 集群中的
kube-apiserver实例之间存在版本偏差,这会缩小允许的kubelet版本范围。
例如:
- kube-apiserver实例处于 1.31 和 1.30 版本
- kubelet支持 1.30、1.29 和 1.28 版本(不支持 1.31 版本,因为这将比- kube-apiserver1.30 版本的实例新)
3.3、kube-proxy
- kube-proxy不能比- kube-apiserver新。
- kube-proxy最多可以比- kube-apiserver旧三个小版本(- kube-proxy< 1.25 最多只能比- kube-apiserver旧两个小版本)。
- kube-proxy可能比它旁边运行的- kubelet实例旧或新最多三个次要版本(- kube-proxy< 1.25 最多只能是比它并行运行的- kubelet实例旧或新的两个次要版本)。
例如:
- kube-apiserver的版本是 1.31
- kube-proxy支持的版本是 1.31、 1.30 、1.29 和 1.28
如果在 HA 集群中的
kube-apiserver实例之间存在版本偏差, 所允许的kube-proxy版本范围会被缩小。
例如:
- kube-apiserver实例的版本是 1.31 和 1.30
- kube-proxy版本为 1.30、 1.29 和 1.28(1.31 将不被支持, 因为该版本将比 1.30 的 kube-apiserver 实例更新)
3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager
kube-controller-manager、kube-scheduler 和 cloud-controller-manager 不能比与它们通信的 kube-apiserver 实例新。 它们应该与 kube-apiserver 次要版本相匹配,但可能最多旧一个次要版本(允许实时升级)。
例如:
- kube-apiserver处于 1.31 版本
- kube-controller-manager、- kube-scheduler和- cloud-controller-manager支持 1.31 和 1.30 版本
如果 HA 集群中的
kube-apiserver实例之间存在版本偏差, 并且这些组件可以与集群中的任何kube-apiserver实例通信(例如,通过负载均衡器),这会缩小这些组件所允许的版本范围。
例如:
- kube-apiserver实例处于 1.31 和 1.30 版本
- kube-controller-manager、- kube-scheduler和- cloud-controller-manager与可以路由到任何- kube-apiserver实例的负载均衡器通信
- kube-controller-manager、- kube-scheduler和- cloud-controller-manager支持 1.30 版本(不支持 1.31 版本,因为它比 1.30 版本的- kube-apiserver实例新)
3.5、kubectl
kubectl 在 kube-apiserver 的一个次要版本(较旧或较新)中支持。
例如:
- kube-apiserver处于 1.31 版本
- kubectl支持 1.32、1.31 和 1.30 版本
如果 HA 集群中的
kube-apiserver实例之间存在版本偏差,这会缩小支持的kubectl版本范围。
例如:
- kube-apiserver实例处于 1.31 和 1.30 版本
- kubectl支持 1.31 和 1.30 版本(其他版本将与- kube-apiserver组件之一相差不止一个的次要版本)
4、升级流程
- 升级主控制平面节点
- 升级其他控制平面节点
- 升级工作节点
三、版本升级(补丁版本升级)
目标:v1.22.2 --> v1.22.16
1、查看当前版本
kubectl get nodes

2、确定要升级到的版本
当前我们的版本在1.22.2,我们需要升级到1.22.16(属于补丁版本升级)
查询版本,会列出当前所有的正式版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes


3、升级 master 节点
控制面上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制面节点。该节点上必须拥有 /etc/kubernetes/admin.conf 文件。 即管理员使用的 kubeconfig 证书文件
3.1、升级 kubeadm
yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes

3.2、验证下载的 kubeadm 版本是否正确
kubeadm version

3.3、验证升级计划
检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。
kubeadm upgrade plan
在打印信息中可以看到,升级集群每个组件对应的当前版本和升级后的版本。而且升级的组件只包括kube-apiserver,kube-controller-manager,kube-scheduler,kube-proxy,CoreDNS,etcd。
不包括kubectl,kubelet,docker和网络组件flannel等

3.4、根据提示,选择合适版本升级
kubeadm upgrade apply v1.22.16
| 过程中会交互式的询问你是否继续升级 | 
|---|
|  | 
| 输入 y 确认继续后进入到镜像预拉取阶段,可以提前输入 kubeadm config images pull拉取必须镜像减少升级时间 | 
|  | 
| 成功出现 SUCCESS!即可 | 
|  | 
3.5、设置 master 节点进入维护状态
通过将 master 节点标记为不可调度并腾空节点为 master 节点作升级准备
kubectl drain k8s-master1 --ignore-daemonsets

3.6、升级 kubelet 和 kubectl
同样的,把 kubelet 和 kubectl 都升级到 1.22.16 版本
yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

3.7、重载重启 kubelet
systemctl daemon-reload && systemctl restart kubelet
3.8、解除对 master 节点的隔离状态
kubectl uncordon k8s-master1

3.9、验证 master 节点升级情况
已成功升级到 1.22.16 版本
kubectl get nodes

4、升级 Worker 节点
工作节点上的升级过程最好一次执行一个节点,一次执行几个节点也行
4.1、升级 kubeadm
yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes
4.2、升级 kubelet 的配置
kubeadm upgrade node

4.3、设置 worker 节点为维护状态
kubectl drain k8s-node1 --ignore-daemonsets

4.4、升级 kubelet 和 kubectl
yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

4.5、重载重启 kubelet
systemctl daemon-reload && systemctl restart kubelet
4.6、解除对 worker 节点的隔离状态
剩下的节点也是重复
4、升级 Worker 节点的操作即可
kubectl uncordon k8s-node1

5、最终结果
done
kubectl get nodes

四、版本升级(次要版本升级)
目标:v1.22.16 --> v1.23.16
1、查看当前版本
kubectl get nodes

2、升级 master 节点
2.1、升级 kubeadm
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办
- 卸载当前版本的
kubeadm- 清理缓存
- 重新安装指定 kubeadm 版本
yum remove kubeadm
yum clean all
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

2.2、验证下载的 kubeadm 版本是否正确
kubeadm version

2.3、验证升级计划
kubeadm upgrade plan
2.4、根据提示,选择合适版本升级
kubeadm upgrade apply v1.23.16

2.5、设置 master 节点进入维护状态
kubectl drain k8s-master1 --ignore-daemonsets
2.6、升级 kubelet 和 kubectl
同样的,把 kubelet 和 kubectl 都升级到 1.23.16 版本
yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes

2.7、重载重启 kubelet
systemctl daemon-reload && systemctl restart kubelet
2.8、解除对 master 节点的隔离状态
kubectl uncordon k8s-master1
2.9、验证 master 节点升级情况
kubectl get nodes

3、升级 Worker 节点
3.1、升级 kubeadm
ansible 的执行升级操作
ansible k8s-node -m shell -a 'yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes'
3.2、升级 kubelet 的配置
ansible k8s-node -m shell -a 'kubeadm upgrade node'
3.3、设置 worker 节点为维护状态
kubectl drain k8s-node1 --ignore-daemonsets
kubectl drain k8s-node2 --ignore-daemonsets
3.4、升级 kubelet 和 kubectl
ansible k8s-node -m shell -a 'yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes'
3.5、重载重启 kubelet
ansible k8s-node -m shell -a 'systemctl daemon-reload && systemctl restart kubelet'
3.6、解除对 worker 节点的隔离状态
kubectl uncordon k8s-node1
kubectl uncordon k8s-node2
4、验证
kubectl get nodes

五、工作原理
1、kubeadm upgrade apply 做了以下工作:
kubeadm upgrade apply 做了以下工作:
- 检查你的集群是否处于可升级状态: 
  - API 服务器是可访问的
- 所有节点处于 Ready状态
- 控制面是健康的
 
- 强制执行版本偏差策略。
- 确保控制面的镜像是可用的或可拉取到服务器上。
- 如果组件配置要求版本升级,则生成替代配置与/或使用用户提供的覆盖版本配置。
- 升级控制面组件或回滚(如果其中任何一个组件无法启动)。
- 应用新的 CoreDNS和kube-proxy清单,并强制创建所有必需的 RBAC 规则。
- 如果旧文件在 180 天后过期,将创建 API 服务器的新证书和密钥文件并备份旧文件。
2、kubeadm upgrade node 在其他控制平节点上执行以下操作:
- 从集群中获取 kubeadm ClusterConfiguration。
- (可选操作)备份 kube-apiserver 证书。
- 升级控制平面组件的静态 Pod 清单。
- 为本节点升级 kubelet 配置
3、kubeadm upgrade node 在工作节点上完成以下工作:
- 从集群取回 kubeadm ClusterConfiguration。
- 为本节点升级 kubelet 配置。



















