Kubernetes 控制平面升级、HPA配置与etcd数据备份恢复

Kubernetes 控制平面升级、HPA配置与etcd数据备份恢复

_

一、控制平面升级

1. 控制平面升级的目标与价值

对Kubernetes控制平面进行版本升级,是集群运维优化的核心操作,主要目的包含多方面:

  • 安全加固,通过更新系统安全补丁、修复版本已知漏洞,有效规避安全风险,全面提升集群整体安全防护能力;

  • 功能迭代,升级后可适配最新的Kubernetes接口规范,启用全新API资源与智能调度能力,丰富集群功能特性;

  • 版本兼容维护,统一控制平面与工作节点的版本基线,保障集群各组件版本一致性,规避版本差异引发的兼容异常;

  • 性能优化,依托新版核心组件的算法优化与机制升级,提升集群资源调度、生命周期管理的整体运行效率;

  • 满足合规规范,适配企业运维标准与行业技术规范,达到集群运行的最低版本合规要求。

## 2. 控制平面升级流程

控制平面升级操作不会直接影响工作节点上业务负载的持续运行,但仍建议提前驱逐节点业务并完成集群数据备份。Kubernetes集群可借助kubeadm工具完成控制平面版本升级,整体流程分为以下步骤:

  • 升级节点本地的kubeadm工具;

  • 执行kubeadm命令升级控制平面核心组件,包含API Server、Controller Managerr、Scheduler;

  • 完成kubelet与kubectl的版本更新;

  • 【可选】升级etcd数据库,正式操作前建议先完成数据备份,防止数据丢失。

3. ETCD备份与恢复

etcd作为Kubernetes集群的核心数据库,持久化保存集群全部状态数据,涵盖各类资源对象定义(Pod、Service、Deployment、ConfigMap等)、集群网络、调度、认证相关配置以及控制平面组件运行状态。因此,做好etcd的备份与恢复,是保障集群高可用、实现故障容灾的关键手段。其主要价值体现在:

  • 实现灾难恢复,当节点故障或数据异常丢失时复原集群状态;

  • 控制平面版本升级前完成备份,规避升级风险;

  • 支持集群数据迁移,将集群完整状态迁移至全新环境;

  • 周期性创建数据快照,满足数据审计与异常回滚需求。

二、HPA案例配置

如果无法正常拉取镜像,可以访问我提供的百度云链接下载。

HPA组件包 https://pan.baidu.com/s/18oYx5ijpAsFnuR5ZQ2fotg?pwd=pfrd

提取码: pfrd

1. 创建Deployment和Service

[Step1] 本地新建YAML清单,定义Deployment资源描述模板。使用hpa-example镜像构建Deployment,该镜像是Kubernetes官方提供的HPA专用测试镜像,内部基于php-apache构建。页面内置一段CPU密集型运算代码,持续访问80端口时,Pod的CPU占用会快速上升,专门用于验证HPA水平自动扩缩容功能。

root@k8s-master:~# vim hpa-example-deployment.yml
​
# 写入下列内容
# 版本号,固定为apps/v1,如果1.9.0以前版本使用apps/v1beta2
apiVersion: apps/v1
kind: Deployment        # 资源类型
metadata:
  name: hpa-example-deployment
spec:
  selector:
    matchLabels:        # 标签匹配模式:精确匹配
      app: hpa-example  # 匹配的标签值
  template:     # 对Pod模板的定义,至少要定义一个Label
    metadata:
      labels:   # 给Pod加上标签,需要和selector定义一致
        app: hpa-example
    spec:
      containers:       # 定义容器的属性
        - name: hpa-example-deployment
          image: hpa-example:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          resources:
            limits:
              cpu: 500m     # CPU上限,最大0.5核
            requests:
              cpu: 300m     # CPU资源请求0.3核

[Step2] 根据YAML文件向Kubernetes集群声明式地创建Deployment资源。

root@k8s-master:~# kubectl create -f hpa-example-deployment.yml

[Step3] 验证:基于文件内定义的资源清单,查询集群中该资源的运行状态与基础信息。

root@k8s-master:~# kubectl get -f hpa-example-deployment.yml

[Step4] 本地新建YAML清单,定义Service资源描述模板。

root@k8s-master:~# vim hpa-example-service.yml
​
#  写入下列内容
apiVersion: v1      # 固定配置
kind: Service       # 资源类型
metadata:   
  name: hpa-example-service
  labels:           # 定义标签
    app: hpa-example    
spec:
  ports:
    - port: 80      # Service在集群内暴露的访问端口
  selector:         # 标签选择器,匹配后端Pod
    app: hpa-example    # 匹配后端Deployment标签

[Step5] 根据YAML文件向Kubernetes集群声明式地创建Service资源。

root@k8s-master:~# kubectl create -f hpa-example-service.yml

[Step6] 验证:基于文件内定义的资源清单,查询集群中该资源的运行状态与基础信息。

root@k8s-master:~# kubectl get -f hpa-example-service.yml

[Step7] 验证:通过Service地址访问hpa-example测试网页。

root@k8s-master:~# curl 10.111.143.44; echo
  • ;:表示连续执行两条命令

  • echo:默认情况下,hpa-example不会换行。这里为了美观,单独输出一个换行。

2. 创建HorizontalPodAutoscaler

[Step1] 本地新建YAML清单,定义HorizontalPodAutoscaler资源描述模板。创建HPA资源,设定CPU使用率阈值为50%。当Pod平均CPU利用率高于50%时,等待10秒稳定周期后执行扩容;当CPU利用率低于50%时,等待30秒稳定周期后执行缩容,避免瞬时流量波动引发频繁扩缩震荡。

root@k8s-master:~# vim hpa.yml
​
# 写入下列内容
apiVersion: autoscaling/v2      # 支持HPA多指标、自定义伸缩策略
kind: HorizontalPodAutoscaler   # 资源类型
metadata:
  name: hpa
  namespace: default    # 需要和绑定的Deployment处于同一命名空间
spec:
  maxReplicas: 10       # Pod副本最大数量,扩容上限为10个
  metrics:          # 伸缩依据的监控指标配置
    - resource:
        name: cpu   # 采集指标为CPU
        target:
          averageUtilization: 50    # CPU使用阈值为50%
          type: Utilization         # 按照利用率方式计算
      type: Resource    # 指标类别:系统基础资源指标
  minReplicas: 1    # Pod副本最小数量,缩容下限为1
  scaleTargetRef:   # 指定HPA管理的目标工作负载
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-example-deployment    # 绑定名称Deployment
  behavior:         # 自定义扩缩容策略稳定窗口
    scaleUp:        # 扩容相关配置
      # 当监测到CPU负载高于阈值,不会立刻扩容,持续等待10秒;如果10秒过后负载依旧超标,才执行扩容。
      stabilizationWindowSeconds: 10
    scaleDown:      # 缩容相关配置
      # 当监测到CPU负载低于阈值,持续等待30秒;30秒内负载持续偏低,才执行缩容。
      stabilizationWindowSeconds: 30

[Step2] 根据YAML文件向Kubernetes集群声明式地创建HorizontalPodAutoscaler资源。

root@k8s-master:~# kubectl create -f hpa.yml

[Step3] 验证:基于文件内定义的资源清单,查询集群中该资源的运行状态与基础信息。

root@k8s-master:~# kubectl get -f hpa.yml

3. 验证

[Step1] 实时监控名称为hpa的水平自动扩缩器状态,动态刷新展示指标负载、当前副本数、目标副本数变化。

root@k8s-master:~# kubectl get hpa hpa --watch

[Step2] 在k8s-worker1和k8s-worker2上同时连续访问hpa-example测试网页。

root@k8s-worker1:~# while sleep 0.01; do wget -q -O- http://10.111.143.44; done

[Step3] 观察命令的回显结果,可以看到当占用率升高的是时候,副本数会自动增加。

[Step4] 将脚本终止,然后观察回显结果。可以看到当占用率下降时,副本数自动减少。

三、控制平面升级案例

1. 封锁控制平面节点

[Step1] 查看当前kubeadm版本。

root@k8s-master:~# kubeadm version

[Step2] 更新当前APT源,然后列出当前软件源中所有可供安装的版本。

root@k8s-master:~# apt-get update
root@k8s-master:~# apt list kubeadm -a
  • kubeadm/unknown 1.34.10-1.1 amd64 [upgradable from: 1.34.2-1.1]:当前系统已安装版本1.34.2-1.1,存在更高版本可升级

  • kubeadm/unknown,now 1.34.2-1.1 amd64 [installed,upgradable to: 1.34.10-1.1]:软件源内最新可用版本为1.34.10-1.1,可从现有1.34.2直接升级。

[Step3] 这里我们将版本升级为1.34.10,将Master节点标记为不可调度。

root@k8s-master:~# kubectl cordon k8s-master
root@k8s-master:~# kubectl get nodes

[Step4] 封锁k8s-master节点,并驱逐该节点上所有工作负载Pod。忽略DaemonSet类型Pod不进行驱逐,同时允许移除挂载emptyDir临时存储的Pod。

root@k8s-master:~# kubectl drain k8s-master --ignore-daemonsets --delete-emptydir-data
  • kubectl drain:腾空节点,驱逐节点上所有Pod,同时自动执行cordon封锁节点,禁止新Pod调度进来。

  • --ignore-daemonsets:忽略DaemonSet控制器管理的Pod(如Filebeat、NodeExporter等)。DaemonSet Pod需要常驻各个节点,如果不添加该参数,drain命令会报错,无法执行。

  • --delete-emptydir-data:允许删除使用emptyDir类型临时存储的Pod,emptyDir数据跟随Pod生命周期,Pod删除后数据永久丢失。不加此参数,存在emptyDir的Pod会阻止drain执行。

2. 控制平面升级

[Step1] 执行apt命令升级kubeadm、kubelet、kubectl软件包,此步骤仅更新节点本地二进制程序,尚未完成Kubernetes控制平面升级。

root@k8s-master:~# apt-get install -y kubelet=1.34.10-1.1 kubeadm=1.34.10-1.1 kubectl=1.34.10-1.1

[Step2] 检查并输出控制平面升级方案,模拟升级规划,此时不会执行任何变更。

root@k8s-master:~# kubeadm upgrade plan

[Step3] 这里跳过etcd升级,避免出现数据风险,可以提前备份etcd中数据。

root@k8s-master:~# kubeadm upgrade apply 1.34.10 --etcd-upgrade=false
[upgrade] Are you sure you want to proceed? [y/N]: y

[Step4] 重启kubelet并解除cordon,恢复Master节点的调度能力。观察节点信息可见两台工作节点版本尚未更新。原因在于kubeadm upgrade apply仅负责升级控制平面相关组件,不会自动更新各节点本地的kubelet二进制程序,需要登录worker节点手动执行软件包安装命令,并重启kubelet服务完成版本升级。

root@k8s-master:~# systemctl restart kubelet.service
root@k8s-master:~# kubectl uncordon k8s-master
root@k8s-master:~# kubectl get nodes

3. 工作节点升级

按照Kubernetes升级规范,应该逐个升级worker节点,不建议同时操作所有工作节点,避免业务整体中断。

[Step1] 在工作节点k8s-worker1升级kubeadm、kubelet、kubectl至1.34.10版本。

root@k8s-worker1:~# apt-get update
root@k8s-worker1:~# apt-get install -y kubelet=1.34.10-1.1 kubeadm=1.34.10-1.1 kubectl=1.34.10-1.1

[Step2] 在工作节点k8s-worker2升级kubeadm、kubelet、kubectl至1.34.10版本。

root@k8s-worker2:~# apt-get update
root@k8s-worker2:~# apt-get install -y kubelet=1.34.10-1.1 kubeadm=1.34.10-1.1 kubectl=1.34.10-1.1

[Step3] 在工作节点k8s-worker1重启kubelet服务,加载新版本程序。

root@k8s-worker1:~# systemctl restart kubelet.service

[Step4] 在工作节点k8s-worker2重启kubelet服务,加载新版本程序。

root@k8s-worker2:~# systemctl restart kubelet.service

[Step5] 在控制平面查看节点详细信息,可以看kubelet版本升级成功。

root@k8s-master:~# kubectl get nodes

四、ETCD备份与恢复案例

1. ETCD备份

[Step1] 安装ETCD客户端。

root@k8s-master:~# apt-get update
root@k8s-master:~# apt-get install -y etcd-client

[Step2] 采用etcdctl v3对etcd数据库进行快照备份,命令携带通信地址、CA证书、服务证书与私钥,生成一致性快照文件,备份结束后可校验快照状态。

root@k8s-master:~# ETCDCTL_API=3 etcdctl --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 \
snapshot save /opt/etcd-snapshot-$(date +%Y%m%d).db
  • ETCDCTL_API=3:指定使用etcd API v3,快照备份仅支持API3。

  • etcdctl:ETCD官方命令客户端工具,用于和ETCD服务交互。

  • --endpoints=https://127.0.0.1:2379:指定连接的etcd服务地址。

  • --cacert=/etc/kubernetes/pki/etcd/ca.crt:CA根证书文件,校验etcd服务端证书合法性

  • --cert=/etc/kubernetes/pki/etcd/server.crt:客户端证书,server.crt为客户端访问etcd使用

  • --key=/etc/kubernetes/pki/etcd/server.key:客户端证书对应的私钥,与cert配套使用

  • snapshot save:在线生成etcd全量快照备份,无需停止etcd,在线备份集群所有数据。

[Step3] 验证:查看etcd快照文件的元数据信息,校验快照文件是否完好、读取快照内部统计信息。

root@k8s-master:~# ETCDCTL_API=3 etcdctl --write-out=table \
snapshot status /opt/etcd-snapshot-20260802.db

2. ETCD恢复

[Step1] 停止kubelet服务,执行ETCD数据快照恢复。

root@k8s-master:~# systemctl stop kubelet.service
root@k8s-master:~# ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 \
snapshot restore /opt/etcd-snapshot-20260802.db

[Step2] 启动kubelet服务,查询ETCD数据库健康状态。

root@k8s-master:~# systemctl start kubelet.service
root@k8s-master:~# ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
endpoint health
  • ETCDCTL_API=3:指定使用etcd API v3,监控检查仅支持API3。

  • etcdctl:ETCD官方命令客户端工具,用于和ETCD服务交互。

  • --endpoints=https://127.0.0.1:2379:指定连接的etcd服务地址。

  • --cacert=/etc/kubernetes/pki/etcd/ca.crt:CA根证书文件,校验etcd服务端证书合法性

  • --cert=/etc/kubernetes/pki/etcd/peer.crt:客户端证书,peer.crt为etcd节点之间相互通信使用

  • --key=/etc/kubernetes/pki/etcd/peer.key:客户端证书对应的私钥,与cert配套使用

  • endpoint health:检查etcd端点健康状态



Kubernetes 环境下Prometheus监控栈部署 2026-10-30

评论区