☰
Kubernetes 生产集群跨版本平滑升级:etcd 数据面零抖动与节点滚动维护
2026/9/27 8:29:46 网站建设 项目流程

Kubernetes 生产集群跨版本平滑升级:etcd 数据面零抖动与节点滚动维护

在企业级基础设施运维中,Kubernetes 集群的跨大版本升级是一项极高风险的工程操作。稍有不慎,就可能导致 API Server 短暂失联、CoreDNS 解析抖动、甚至由于 etcd 的 Raft 选举震荡引发生产集群整体降级。

为了实现承载上万容器的核心生产集群从 v1.26 平滑演进至 v1.28,我们梳理并落地了一套标准化的控制面升级与节点分批排空维护手册。

sequenceDiagram autonumber actor SRE as 运维工程师 participant etcd as etcd 集群 participant Master as Master 控制面 participant Node as Worker 计算节点 participant PDB as PodDisruptionBudget SRE->>etcd: 执行全量快照备份 (etcdctl snapshot save) SRE->>Master: 逐台升级 kube-apiserver/controller-manager Master-->>SRE: 控制面组件健康检查通过 SRE->>PDB: 校验业务 PDB 预算与健康度 SRE->>Node: 标记不可调度并排水 (kubectl drain) Node-->>SRE: 业务 Pod 优雅驱逐并于健康节点重建 SRE->>Node: 升级 Containerd 运行时与 Kubelet SRE->>Node: 恢复调度并解除封锁 (kubectl uncordon)

1. 升级前的基线核查与 etcd 状态锁定

在敲下任何升级命令前,第一步永远是控制面与 etcd 的状态体检与数据快照:

# 1. 验证当前 etcd 集群健康度与 Leader 状态 ETCDCTL_API=3 etcdctl \ --endpoints=https://10.0.1.10:2379,https://10.0.1.11:2379,https://10.0.1.12:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint status --write-out=table # 2. 触发一致性快照备份 ETCDCTL_API=3 etcdctl \ --endpoints=https://10.0.1.10:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /data/backup/etcd-snapshot-$(date +%Y%m%d%H%M).db # 3. 校验快照完整性 ETCDCTL_API=3 etcdctl snapshot status /data/backup/etcd-snapshot-*.db

必须确认各节点间的 DB 物理大小差异在 5% 以内,且 Raft Term 一致无频繁切主。同时,检查kube-apiserver的废弃 API(Deprecated APIs)调用,利用kube-no-trouble (kubent)扫描全集群资源,杜绝升级后旧 CRD 无法解析的隐患。

2. Worker 节点无损滚动排水与维护

控制面平稳升级后,进入耗时最长的计算节点维护阶段。直接强杀节点会导致有状态服务数据损坏或无状态服务短暂 502。

我们通过PodDisruptionBudget (PDB)与严密的drain参数组合来控制并发驱逐影响:

# 为核心业务配置 PDB 防线,保证驱逐时始终有可用实例存活 apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: order-center-pdb namespace: prod spec: minAvailable: 75% selector: matchLabels: app: order-center

运维脚本中的排水与升级标准步骤如下:

NODE_NAME="node-prod-worker-08" # 1. 标记节点不可调度,防止新 Pod 调度进入 kubectl cordon ${NODE_NAME} # 2. 优雅驱逐节点上的 Pod,忽略 DaemonSet 并允许删除本地空目录存储 kubectl drain ${NODE_NAME} \ --ignore-daemonsets \ --delete-emptydir-data \ --force \ --grace-period=60 \ --timeout=300s # 3. 在节点上更新 kubelet 与 containerd apt-get update && apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 systemctl daemon-reload systemctl restart containerd systemctl restart kubelet # 4. 恢复节点调度状态 kubectl uncordon ${NODE_NAME}

3. 升级演练中的高频陷阱与防范

在多次跨版本升级中,有几个极易被忽视的边缘陷阱必须重点关注:

第一,CoreDNS 与 CNI 插件版本滞后。在升级主版本时,CNI(如 Cilium 或 Calico)往往需要配合更新 eBPF Map 格式或 IPAM 路由规则。如果在升级前未将 CNI 升级至兼容版本,节点重启后可能出现跨主机 Pod 无法互通的严重事故。

第二,有状态存储卷(PVC/PV)卸载挂死。某些使用了 NFS 或 Ceph RBD 的 Pod 在被强行驱逐时,若挂载点发生 IO 阻塞,VolumeAttachment可能会卡在Attached状态数十分钟,导致新 Pod 无法挂载启动。升级前必须通过监控摸底存储卷读写负载,提前解除卡滞连接。

第三,滚动步长控制。对数千节点的大规模集群,严禁按固定机器数量排水,必须按业务域与机架拓扑进行“机架感知分批升级”,确保任何时刻同一个微服务的副本不会在同一批次被全部轮换。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询