Kubernetes 集群升级

Kubernetes 升级前检查、组件兼容、节点滚动升级、验证清单和回滚预案。

Kubernetes 集群升级

Kubernetes 升级是高风险变更,涉及控制平面、节点组件、容器运行时、CNI、CSI、Ingress Controller、监控和业务工作负载。生产环境升级前必须完成兼容性检查、备份和回滚预案。

本文以 kubeadm 集群为主线说明升级流程。

Kubernetes kubeadm 升级流程

升级原则

  • 不跳过 Kubernetes minor 版本。
  • 优先升级到目标 minor 的最新 patch 版本。
  • 先升级控制平面,再升级工作节点。
  • 每次只滚动升级一部分节点。
  • 升级前备份 etcd 和关键配置。
  • 升级后验证核心插件和业务链路。

升级顺序

升级前检查
  -> 备份 etcd
  -> 升级第一个控制平面
  -> 升级其他控制平面
  -> 升级 worker 节点
  -> 升级 kubectl
  -> 验证插件和业务

升级前检查

查看版本:

kubectl version
kubectl get nodes -o wide
kubeadm version

检查集群状态:

kubectl get nodes
kubectl get pods -A
kubectl get events -A --sort-by='.lastTimestamp'
kubectl top nodes
kubectl top pods -A

检查 kube-system:

kubectl get pods -n kube-system -o wide
kubectl get daemonset,deployment -n kube-system

检查 API 废弃:

kubectl get apiservice
kubectl api-resources

建议使用工具或平台能力提前扫描废弃 API,例如 Ingress、CronJob、PodSecurityPolicy 等历史版本迁移问题。

组件兼容性

升级前确认:

组件检查内容
CNI是否支持目标 Kubernetes 版本
CSI是否支持目标 Kubernetes 版本和节点系统
Ingress Controller是否支持目标版本 API
Metrics Server是否支持目标版本
Cluster Autoscaler版本通常需要和 Kubernetes minor 对齐
Helm Chart是否使用废弃 API
CRD / Operator是否支持目标 Kubernetes 版本

etcd 备份

在控制平面节点执行,按实际证书路径调整:

ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-$(date +%F-%H%M%S).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_API=3 etcdctl snapshot status /backup/etcd-xxxx.db --write-out=table

同时备份:

cp -a /etc/kubernetes /backup/kubernetes-$(date +%F-%H%M%S)
cp -a /var/lib/kubelet/config.yaml /backup/kubelet-config-$(date +%F-%H%M%S).yaml

升级第一个控制平面

设置目标版本,例如:

export K8S_VERSION=1.28.15-00

升级 kubeadm:

apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=${K8S_VERSION}
apt-mark hold kubeadm

查看升级计划:

kubeadm upgrade plan

执行升级:

kubeadm upgrade apply v1.28.15

升级 kubelet 和 kubectl:

apt-mark unhold kubelet kubectl
apt-get install -y kubelet=${K8S_VERSION} kubectl=${K8S_VERSION}
apt-mark hold kubelet kubectl
systemctl daemon-reload
systemctl restart kubelet

验证:

kubectl get nodes
kubectl get pods -n kube-system

升级其他控制平面

在其他控制平面节点执行:

apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=${K8S_VERSION}
apt-mark hold kubeadm

kubeadm upgrade node

apt-mark unhold kubelet kubectl
apt-get install -y kubelet=${K8S_VERSION} kubectl=${K8S_VERSION}
apt-mark hold kubelet kubectl
systemctl daemon-reload
systemctl restart kubelet

升级 Worker 节点

升级前驱逐业务 Pod:

kubectl drain worker-01 \
  --ignore-daemonsets \
  --delete-emptydir-data \
  --grace-period=60 \
  --timeout=10m

在 worker 节点升级:

apt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=${K8S_VERSION}
apt-mark hold kubeadm

kubeadm upgrade node

apt-mark unhold kubelet kubectl
apt-get install -y kubelet=${K8S_VERSION} kubectl=${K8S_VERSION}
apt-mark hold kubelet kubectl
systemctl daemon-reload
systemctl restart kubelet

恢复调度:

kubectl uncordon worker-01
kubectl get node worker-01 -o wide

升级后验证

集群状态:

kubectl get nodes -o wide
kubectl get pods -A
kubectl get events -A --sort-by='.lastTimestamp'

核心链路:

kubectl run nginx-test --image=nginx:1.27
kubectl expose pod nginx-test --port=80
kubectl run netshoot --image=nicolaka/netshoot -it --rm -- curl nginx-test.default.svc.cluster.local
kubectl delete pod nginx-test
kubectl delete service nginx-test

重点检查:

  • CoreDNS 是否正常解析。
  • CNI 是否正常跨节点通信。
  • CSI 是否能挂载和扩容。
  • Ingress 是否能正常访问。
  • HPA 指标是否正常。
  • 业务 Deployment 是否稳定。

回滚预案

Kubernetes 升级回滚通常不如普通应用简单。升级前必须明确:

  • etcd 快照是否可恢复。
  • 控制平面节点是否有系统盘快照。
  • 旧版本 kubeadm、kubelet、kubectl 包是否可安装。
  • CNI / CSI / Ingress Controller 是否能回退。
  • 业务是否允许短时间只读或停机窗口。

如果升级控制面后出现严重问题,优先根据 kubeadm 和 etcd 备份流程恢复控制平面。不要在没有备份的情况下反复重置控制面。

常见问题

现象排查方向
kubeadm upgrade plan 报错版本跨度、组件健康、配置文件、证书
节点升级后 NotReadykubelet、containerd、CNI、证书、cgroup
Pod 无法驱逐PDB、单副本服务、本地存储、DaemonSet
CoreDNS 异常CoreDNS 版本、ConfigMap、上游 DNS、CNI
HPA 指标异常Metrics Server 和 APIService
Ingress 异常Controller 版本、IngressClass、废弃注解

变更清单

升级前准备:

  • 目标版本和兼容性确认。
  • etcd 备份和恢复演练。
  • 节点批次和维护窗口。
  • 业务方通知和回滚策略。
  • 监控大盘和告警静默策略。

升级中观察:

  • 节点 Ready 状态。
  • kube-system Pod 状态。
  • API Server 延迟和错误率。
  • 业务错误率和延迟。
  • 事件和控制器日志。

升级后收尾:

  • 移除临时变更。
  • 更新运维文档和版本记录。
  • 复盘异常项。
  • 补齐废弃 API 改造计划。