K8s集群平滑升级(Smooth Upgrade of K8S Cluster)

简介:

Kubernetes ‌**(简称K8s)是一个开源的容器编排和管理平台,由Google开发并维护。它最初是为了解决谷歌内部大规模容器管理的问题而设计的,后来在2014年开源,成为云原生技术的核心组成部分。**‌‌1

K8s的主要功能和特点包括:

  • 自动化部署和大规模伸缩‌:K8s支持自动化的应用部署和扩展,能够根据需求动态调整应用实例的数量,从而实现负载均衡和高可用性。
  • 应用容器化管理‌:K8s提供了容器生命周期管理、健康检查、日志记录等功能,确保应用的稳定运行和高效维护。
  • 多租户和隔离‌:K8s支持多租户环境,每个租户可以在独立的命名空间中运行应用,确保资源隔离和安全。
  • 自我修复‌:K8s具有自我修复的能力,能够检测并修复应用故障,确保服务的连续性。

K8s在多个行业中得到了广泛应用,特别是在金融行业,许多银行的内部结算系统都部署在K8s平台上。随着云原生技术的不断发展,K8s也在不断进化,以满足更复杂的工作负载管理需求。

升级前版本:1.28.2

升级后版本:1.29.10

升级概要

  • 升级集群版本建议逐步升级,k8s版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是补丁版本,尽量不能跳过次要版本升级,比如1.28.0->1.30.0可能遭遇失败,补丁版本可以跳跃更新,比如1.28.2->1.28.10

  • 尽量将kubelet和kubeadm版本保持一致,可以偏差一个版本

  • 升级后,因为容器spec的哈希值已更改,所有容器都会被重新启动

kubernetes官方升级参考: 升级工作的基本流程如下:

  • 升级控制节点(master)

  • 升级其他控制平面节点(高可用集群)

  • 升级工作节点(worker)

更改软件包仓库(所有节点)

现在新版本都使用单独的软件仓库,需要修改里面的版本值,如你需要1.29版本,就需要将版本改为v1.29。

复制代码
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
EOF

将软件仓库配置分发到node节点

复制代码
scp /etc/yum.repos.d/kubernetes.repo root@10.0.0.101:/etc/yum.repos.d
scp /etc/yum.repos.d/kubernetes.repo root@10.0.0.102:/etc/yum.repos.d

升级前备份

复制代码
# 备份目录
cp -a /etc/kubernetes/  /etc/kubernetes.bak

cp -a /var/lib/etcd   /var/lib/etcd.bak

# 备份etcd数据
ETCDCTL_API=3 etcdctl snapshot save /data/etcd/etcd_bak.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key 

# 如果没有etcdctl工具需要安装一下
yum install -y etcd

控制平台节点(master)升级

1 升级kubeadm

复制代码
yum install -y kubeadm-'1.29.10-*' --disableexcludes=kubernetes

说明:--disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库

2 验证下载操作正常,并且 kubeadm 版本正确

可见版本已经升级到1.29.10

3、验证升级计划:

复制代码
kubeadm upgrade plan

此命令检查你的集群是否可被升级,并取回你要升级的目标版本。命令也会显示一个包含组件配置版本状态的表格。

4 选择要升级到的目标版本

复制代码
kubeadm upgrade apply v1.29.10

5 腾空节点

将节点标记为不可调度并驱逐所有负载,准备节点的维护:

复制代码
# 将 <node-to-drain> 替换为你要腾空的控制面节点名称
kubectl drain <node-to-drain> --ignore-daemonsets

kubectl drain k8s-master --ignore-daemonsets

说明:--ignore-daemonsets 忽略DaemonSet管理下的Pod

6 升级 kubelet 和 kubectl

(1)升级 kubelet 和 kubectl:

复制代码
yum install -y kubelet-'1.29.10-*' kubectl-'1.29.10-*' --disableexcludes=kubernetes

(2)重启 kubelet:

复制代码
sudo systemctl daemon-reload
sudo systemctl restart kubelet

7 解除节点的保护

复制代码
# 将 <node-to-uncordon> 替换为你的节点名称
kubectl uncordon <node-to-uncordon>

kubectl uncordon k8s-master

此时master节点已经升上去了。

升级工作节点

工作节点上的升级过程应该一次执行一个节点,以不影响运行工作负载所需的最小容量。

我的集群有两个工作节点,先升级节点1,再升级2,步骤是一样的

1 升级 kubeadm

复制代码
# 将 1.29.x-* 中的 x 替换为最新的补丁版本
sudo yum install -y kubeadm-'1.29.x-*' --disableexcludes=kubernetes

yum install -y kubeadm-'1.29.10-*' --disableexcludes=kubernetes

2 执行 "kubeadm upgrade"

对于工作节点,下面的命令会升级本地的 kubelet 配置:

复制代码
kubeadm upgrade node

3 腾空节点(master上执行)

将节点标记为不可调度并驱逐所有负载,准备节点的维护:

复制代码
# 将 <node-to-drain> 替换为你正腾空的节点的名称

节点1:
kubectl drain k8s-node1 --ignore-daemonsets

节点2:
kubectl drain k8s-node2 --ignore-daemonsets

4 升级 kubelet 和 kubectl

(1)升级 kubelet 和 kubectl

尽量跟kubeadm版本保持一致

复制代码
yum install -y kubelet-'1.29.10-*' kubectl-'1.29.10-*' --disableexcludes=kubernetes

(2)重启 kubelet

复制代码
sudo systemctl daemon-reload
sudo systemctl restart kubelet

5 解除节点的保护(master上执行)

通过将节点标记为可调度,让节点重新上线:

复制代码
# 在控制平面节点上执行此命令
# 将 <node-to-uncordon> 替换为你的节点名称
kubectl uncordon <node-to-uncordon>

节点1:
kubectl uncordon k8s-node1

节点2:
kubectl uncordon k8s-node2

6 查看节点情况

其他工作节点也按照升级工作节点来操作的步骤进行操作

最后结果:

升级成功后,需要确保所有的对象资源的状态跟升级前是一样的。

相关推荐
XINVRY-FPGA2 小时前
XCVP1802-2MSILSVC4072 AMD Xilinx Versal Premium Adaptive SoC FPGA
人工智能·嵌入式硬件·fpga开发·数据挖掘·云计算·硬件工程·fpga
杜子不疼.3 小时前
【探索实战】从0到1打造分布式云原生平台:Kurator全栈实践指南
分布式·云原生
qq_2153978973 小时前
docker 安装 opengauss 高斯数据库
运维·docker·容器
settingsun12253 小时前
分布式系统架构:百万并发系统设计
云原生·架构·分布式系统
谷隐凡二4 小时前
Kubernetes主从架构简单解析:基于Python的模拟实现
python·架构·kubernetes
陈陈CHENCHEN4 小时前
SuperMap iManager for K8s 离线环境镜像仓库 Containerd 部署
kubernetes
f***14774 小时前
对Docker部署的MySQL中的数据进行备份恢复
mysql·docker·容器
m***92385 小时前
docker中配置redis
redis·docker·容器
谷隐凡二5 小时前
Docker 的核心理念及技术的简单说明
运维·docker·容器
会飞的小蛮猪6 小时前
Ubuntu24.04 基于Containerd部署K8s1.34(私服部署)
docker·云原生·kubernetes