🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 整体思路: - 升级master节点 - 第一个控制节点 - 其他master - 升级node节点 - 验证集群状态 # 升级master节点 ## 第一个控制节点 0. 摘除流量 这里使用的haproxy做流量负载,所以该文章只演示haproxy的移除负载负载 前提条件: - HAproxy 启动监控统计页面 ![](https://img.kancloud.cn/1a/36/1a36ef5a2c1f66b6ae817af6abb38782_1920x700.png) >[danger] 注意:访问的地址必须是 负载IP(VIP)地址。将 `status` 参数从 `READY` 改成 `MAINT` 1. 升级kubeadm ```shell yum upgrade -y kubeadm-1.20.15-0 --disableexcludes=kubernetes ``` > 通过 `yum list --showduplicates kubeadm` 命令,确认集群版本。 > **注意**: 升级 `kubeadm` 低于 1.20.x 版本,会有依赖提示安装 `kubelet` 和 `kubectl` 最新版本。需要特别留意再输入 y 继续安装 2. 验证 kubeadm 版本正确 ```shell $ kubeadm version -o short v1.19.16 ``` 3. 验证升级计划 ```shell kubeadm upgrade plan ``` > **说明**: > 1. 此命令检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。 > 2. 如果 `kubeadm upgrade plan` 给出任何需要手动升级的组件配置, 用户必须通过 `--config` 命令行标志向 `kubeadm upgrade apply` 命令提供替代的配置文件。 如果不这样做,`kubeadm upgrade apply` 会出错并退出,不再执行升级操作。 4. 升级集群 ```shell kubeadm upgrade apply v1.19.16 ``` 5. [可选]升级 CNI 驱动插件 这里使用calico网络插件。 - 第一步:确认当前使用calico的版本。 - 第二步:查看 [官网](https://projectcalico.docs.tigera.io/archive/v3.18/getting-started/kubernetes/requirements#kubernetes-requirements) 是否支持这个版本的kubernetes集群版本。 >[info] 如果官网反馈是没有测试过的话,建议升级calico插件。 6. 设置第一个控制面节点维护状态 ```shell kubectl drain <node-to-drain> --ignore-daemonsets ``` 7. 升级 kubelet 服务 ```shell yum upgrade kubectl-1.20.15-0 kubelet-1.20.15-0 --disableexcludes=kubernetes systemctl daemon-reload systemctl restart kubelet ``` 8. 取消第一个控制面节点维护状态 ```shell kubectl uncordon <node-to-uncordon> ``` 9. 将流量切换到第一个控制节点 1. 将第一个控制节点 status 从 `MAINT` 改成 `READY` 状态 2. 将其他控制节点 `status` 参数从 `READY` 改成 `MAINT` 10. [可选]运行测试容器到第一个控制面节点 ```shell # 创建deployment kubectl create deployment alpine --image=alpine:3.16 -- sleep 3600 # 容忍任何污点 以及 调度到指定节点 kubectl patch deployment alpine -p '{"spec": {"template": {"spec": {"tolerations": [{"operator": "Exists"}], "nodeSelector": {"kubernetes.io/hostname": "master03"}}}}}' # 查看pod运行情况 $ kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES alpine-5f7998d889-8kzpg 1/1 Running 0 9s 10.244.235.11 master03 <none> <none> # 测试与pod的连通性 $ kubectl -n kube-system get pod -owide -l k8s-app=kube-dns NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-7f89b7bc75-hw4pt 1/1 Running 0 158m 10.244.241.68 master01 <none> <none> coredns-7f89b7bc75-pz9zb 1/1 Running 0 158m 10.244.59.198 master02 <none> <none> $ kubectl exec -it alpine-5f7998d889-8kzpg -- ping -c4 10.244.241.68 PING 10.244.241.68 (10.244.241.68): 56 data bytes 64 bytes from 10.244.241.68: seq=0 ttl=62 time=0.550 ms 64 bytes from 10.244.241.68: seq=1 ttl=62 time=0.485 ms 64 bytes from 10.244.241.68: seq=2 ttl=62 time=0.520 ms 64 bytes from 10.244.241.68: seq=3 ttl=62 time=0.589 ms --- 10.244.241.68 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.485/0.536/0.589 ms # 测试service连通性 $ kubectl exec -it alpine-5f7998d889-8kzpg -- wget --no-check-certificate -q -O - https://kubernetes:443/version { "major": "1", "minor": "20", "gitVersion": "v1.20.15", "gitCommit": "8f1e5bf0b9729a899b8df86249b56e2c74aebc55", "gitTreeState": "clean", "buildDate": "2022-01-19T17:23:01Z", "goVersion": "go1.15.15", "compiler": "gc", "platform": "linux/amd64" } # 清理deployment $ kubectl delete deploy alpine ``` > 如果容器正常运行且与其他 `podIP` 和 `serverIP` 可以正常通讯即可 ## 其它控制面节点 1. 升级控制面组件 及 kubelet配置文件 ```shell yum upgrade kubeadm-1.20.15-0 --disableexcludes=kubernetes kubeadm upgrade node ``` 2. 升级 kubelet 服务 ```shell kubectl drain <node-to-drain> --ignore-daemonsets yum upgrade kubectl-1.20.15-0 kubelet-1.20.15-0 --disableexcludes=kubernetes systemctl daemon-reload systemctl restart kubelet kubectl uncordon <node-to-uncordon> ``` 3. 流量恢复其他节点 将其他控制节点 status 从 `MAINT` 改成 `READY` 状态 # 升级node节点 1. 修改配置kubelet配置文件以及更新证书 ```shell yum upgrade kubeadm-1.20.15-0 --disableexcludes=kubernetes kubeadm upgrade node ``` 2. 升级 kubelet 服务 ```shell kubectl drain <node-to-drain> --ignore-daemonsets yum upgrade kubectl-1.20.15-0 kubelet-1.20.15-0 --disableexcludes=kubernetes systemctl daemon-reload systemctl restart kubelet kubectl uncordon <node-to-uncordon> ``` # 验证集群状态 ```shell $ kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready control-plane,master 2d v1.20.15 master02 Ready control-plane,master 2d v1.20.15 master03 Ready control-plane,master 2d v1.20.15 ``` # 参考文档 kubeadm升级集群:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/