Kubernetes 版本升级操作指南

DevOps技术栈

共 4200字,需浏览 9分钟

 ·

2022-02-22 15:40

原文链接:https://blog.devgenius.io/kubernetes-upgrade-the-hard-way-be2c75bb9b8f

Kubernetes 升级之路

首先,让我们定义一下 Kubernetes 中 hard-way 的概念:Kubernetes 中的困难方式是为了学习和应用每一步,但是你要了解该步骤背后的内容。因此,您每点击一个命令都会发生神奇的事情,最后通过一个很长的路径和命令才能升级您的集群。第一次看起来可能很难,但这将是您之后升级的经验积累,因为您将熟悉每个 Kubernetes 升级组件,因为您将使用大量命令工具,这可以帮助您进行故障排除并为您提供更多的集群可控性。

现在让我们跳到一个演示中,用我们的双手来操作命令行。我们将把一个集群从1.22版升级到1.23版。

前提条件

  • 确保备份所有重要组件,例如存储在数据库中的应用状态。Kubernetes 升级不涉及正常的工作负载,只涉及与 Kubernetes 相关的组件,但备份始终是最佳实践。
  • 必须禁用Swap交换

步骤

master节点

  1. 清空主节点

驱逐/删除主节点的所有 Pod(镜像 Pod 除外)(不能通过 API 服务器删除),以便能够执行升级。如果有 daemon set-managed pods,drain 不会在没有 --ignore-daemonsets 的情况下继续进行,因为这些 pods 将立即被 daemon set 控制器替换,它会忽略不可调度的标记。

#kubectl drain master --ignore-daemonsets
node/master already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-proxy-lfplf, kube-system/weave-net-fv7sn
evicting pod kube-system/coredns-64897985d-pl2v9
evicting pod kube-system/coredns-64897985d-65g5p
pod/coredns-64897985d-65g5p evicted
pod/coredns-64897985d-pl2v9 evicted
node/master drained

Draining 成功后,您可以检查节点的状态以确保它是SchedulingDisabled,这意味着该节点上不能调度任何 Pod。

#kubectl get nodes 
NAME STATUS ROLES VERSION 
master Ready, SchedulingDisabled control-plane,master v1.22.2 
worker Ready  v1.22.2
  1. 更新系统中的包管理器,根据您的操作系统,它可能会有所不同。
#apt-get update
  1. 在包管理器中搜索可用的 kubeadm 包,并使用 grep 过滤结果以获得您需要的版本。在我们的例子中是 1.23 版本。
#apt-cache show kubeadm | grep 1.23

输出应类似于以下内容:

Version: 1.23.1–00
Filename: pool/kubeadm_1.23.1–00_amd64_6bc970cf9bf5349ba18526f77c6ac16caf2a52b6a7b0e40753541ebef52ad99f.deb
Version: 1.23.0–00
Filename: pool/kubeadm_1.23.0–00_amd64_36016a07eb5c2bfae656cfee1b3848930757d201b474fea1cce1ecd507b94f0b.deb
  1. 保留 kubectl 和 kubelet包,防止它们被自动安装、升级或删除。这是一个预防措施。
#apt-mark hold kubectl kubelet
  1. 取消保留 kubeadm 包,升级后再次 hold。
#apt-mark unhold kubeadm
#apt-get install kubeadm=1.23.1–00
#apt-mark hold kubeadm
  1. 检查 kubeadm版本以确保它已升级。
#kubeadm version
kubeadm 版本
  1. 查看kubeadm升级计划,看看还有哪些组件需要升级。
#kubeadm upgrade plan
kubeadm 升级计划
  1. 应用计划,你应该可以看到升级成功的消息
#kubeadm upgrade apply v1.23.1
  1. 取消保留 kubectl 和 kubelet包,升级它们然后再次持有它们。

请注意,如果您要复制此内容,您可能需要删除“-”并在终端中再次输入,因为它可能被视为拼写错误。

#apt-mark unhold kubelet kubectl 
#apt-get install kubelet=1.23.1-00 kubectl=1.23.1-00 
#apt-mark hold kubelet kubectl
  1. 重新启动 kubelet 并检查是否正常运行。
#systemctl restart kubelet
#systemctl status kubelet
  1. 运行 kubeadm upgrade plan check以确保一切都已升级。
#kubeadm upgrade plan
kubeadm 升级检查
  1. 检查节点状态和主节点的新版本。
#kubectl get nodes
NAME       STATUS                    ROLES                   VERSION
master     Ready,SchedulingDisabled  control-plane,master    v1.23.1
worker     Ready                                       v1.22.2
  1. 解封主节点,使其再次可调度
#kubectl uncordon master
#kubectl get nodes
NAME       STATUS    ROLES                  VERSION
master     Ready     control-plane,master   v1.23.1
worker     Ready                      v1.22.2

这里我们完成了主节点,让我们移动到工作节点

worker 节点

我们将重复使用以下相同的命令

  1. 清空主节点

您可能需要使用“force”参数来强制驱逐一些 pod。

#kubectl drain worker --ignore-daemonsets --force
node/cks-worker drained
  1. 更新包管理器。取消保留,安装 kubeadm。
#apt-get update
#apt-mark unhold kubeadm
#apt-get install kubeadm=1.23.1-00
#apt-mark hold kubeadm
  1. 取消保留,安装,然后保留 kubectl 和 kubeadm。
#apt-mark unhold kubelet kubectl 
#apt-get install kubelet=1.23.1-00 kubectl=1.23.1-00 
#apt-mark hold kubelet kubectl
  1. 重启kubelet进程并检查其状态
#systemctl restart kubelet
#systemctl status kubelet
  1. 检查节点状态
#kubectl get nodes
NAME       STATUS                   ROLES                 VERSION
master     Ready                    control-plane,master  v1.23.1
worker     Ready,SchedulingDisabled                 v1.23.1
  1. 解封worker节点,使其再次可调度
#kubectl uncordon worker
#kubectl get nodes 
NAME STATUS ROLES VERSION 
master      Ready      control-plane,master    v1.23.1
worker      Ready                        v1.23.1

至此升级成功!!

结论

我们将 Kubernetes 集群版本从 1.22.2 升级到 1.23.1 Kubeadm 包升级到 1.23.1 版本,然后使用 kubeadm 升级集群的其他组件。Kubectl 和 Kubelet 升级到同一个版本 1.23.1 一般来说,基本步骤就是清空节点,取消持有安装包,升级它然后再次持有它,最后解封节点。

- END -

 推荐阅读 






31天拿下K8s全球含金量最高的双证书
9个常用的Shell脚本,面试也常问!
11 个步骤完美排查服务器是否被入侵
我是怎么画架构图的?
Nginx 通过 Lua + Redis 实现动态封禁 IP
Linux 性能全方位调优经验总结
10 分钟理解微服务、容器和 Kubernetes
Kubernetes 生态架构图
20张最全的DevOps架构师技术栈图谱
在Kubernetes上部署一套 Redis 集群
Linux Shell 脚本编程最佳实践
做了这么多年运维工作,现在才看清职业方向
Gitlab+Jenkins+k8s+Helm 的自动化部署实践
搭建一套完整的企业级 K8s 集群(v1.22,二进制方式)



点亮,服务器三年不宕机

浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报