集群升级 #
一、升级概述 #
Kubernetes集群升级是维护工作的重要部分,需要谨慎规划和执行。
1.1 升级原则 #
text
升级原则
│
├── 版本兼容性
│ └── 次版本号差不超过1
│
├── 备份优先
│ └── 升级前备份etcd
│
├── 逐个升级
│ └── 一次升级一个节点
│
└── 验证测试
└── 升级后验证功能
1.2 版本策略 #
| 当前版本 | 可升级版本 |
|---|---|
| 1.26.x | 1.27.x |
| 1.27.x | 1.28.x |
| 1.28.x | 1.29.x |
二、升级准备 #
2.1 检查当前版本 #
bash
# 查看集群版本
kubectl version
# 查看节点版本
kubectl get nodes
# 查看组件版本
kubectl get componentstatuses
2.2 检查集群状态 #
bash
# 检查节点状态
kubectl get nodes
# 检查Pod状态
kubectl get pods -A
# 检查资源使用
kubectl top nodes
# 检查证书有效期
kubeadm certs check-expiration
2.3 备份集群 #
bash
# 备份etcd
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-pre-upgrade.db \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# 备份资源清单
kubectl get all -A -o yaml > /backup/all-resources.yaml
kubectl get configmaps -A -o yaml > /backup/configmaps.yaml
kubectl get secrets -A -o yaml > /backup/secrets.yaml
三、升级控制平面 #
3.1 升级kubeadm #
bash
# 升级kubeadm(Ubuntu/Debian)
apt-get update
apt-get install -y kubeadm=1.28.0-00
# 验证版本
kubeadm version
3.2 检查升级计划 #
bash
# 检查可升级版本
kubeadm upgrade plan
# 输出示例
Components that must be upgraded manually after you have upgraded the control plane:
COMPONENT CURRENT TARGET
kubelet 1.27.0 1.28.0
Upgrade to the latest version in the v1.27 series:
COMPONENT CURRENT TARGET
kube-apiserver 1.27.0 1.28.0
kube-controller-manager 1.27.0 1.28.0
kube-scheduler 1.27.0 1.28.0
kube-proxy 1.27.0 1.28.0
CoreDNS 1.10.1 1.11.1
etcd 3.5.7 3.5.9
3.3 升级控制平面 #
bash
# 升级第一个控制平面节点
kubeadm upgrade apply v1.28.0
# 升级其他控制平面节点
kubeadm upgrade node
3.4 升级kubelet和kubectl #
bash
# 升级kubelet和kubectl
apt-get install -y kubelet=1.28.0-00 kubectl=1.28.0-00
# 重启kubelet
systemctl daemon-reload
systemctl restart kubelet
四、升级工作节点 #
4.1 驱逐节点 #
bash
# 标记节点不可调度
kubectl cordon <node-name>
# 驱逐Pod
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
4.2 升级节点 #
bash
# 升级kubeadm
apt-get update
apt-get install -y kubeadm=1.28.0-00
# 升级节点配置
kubeadm upgrade node
# 升级kubelet和kubectl
apt-get install -y kubelet=1.28.0-00 kubectl=1.28.0-00
# 重启kubelet
systemctl daemon-reload
systemctl restart kubelet
4.3 恢复节点 #
bash
# 恢复节点调度
kubectl uncordon <node-name>
# 验证节点状态
kubectl get nodes
五、升级后验证 #
5.1 验证集群状态 #
bash
# 查看节点状态
kubectl get nodes
# 查看组件状态
kubectl get componentstatuses
# 查看Pod状态
kubectl get pods -A
# 验证版本
kubectl version
5.2 验证功能 #
bash
# 测试应用部署
kubectl create deployment nginx --image=nginx
# 测试服务暴露
kubectl expose deployment nginx --port=80 --type=NodePort
# 测试DNS解析
kubectl run test --image=busybox --rm -it -- nslookup kubernetes
# 清理测试资源
kubectl delete deployment nginx
kubectl delete svc nginx
5.3 验证证书 #
bash
# 检查证书有效期
kubeadm certs check-expiration
六、回滚策略 #
6.1 回滚准备 #
bash
# 回滚前确认
# 1. 有etcd备份
# 2. 有资源清单备份
# 3. 记录当前配置
6.2 回滚步骤 #
bash
# 1. 恢复etcd
systemctl stop kube-apiserver
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-pre-upgrade.db \
--data-dir=/var/lib/etcd-restore
mv /var/lib/etcd /var/lib/etcd-old
mv /var/lib/etcd-restore /var/lib/etcd
systemctl start etcd
systemctl start kube-apiserver
# 2. 降级kubeadm
apt-get install -y kubeadm=1.27.0-00
# 3. 降级kubelet和kubectl
apt-get install -y kubelet=1.27.0-00 kubectl=1.27.0-00
systemctl restart kubelet
七、升级注意事项 #
7.1 升级前检查 #
text
升级前检查清单
│
├── 备份etcd
│
├── 备份资源清单
│
├── 检查应用兼容性
│
├── 确认资源充足
│
└── 准备回滚方案
7.2 升级中注意 #
text
升级中注意事项
│
├── 逐个节点升级
│
├── 监控集群状态
│
├── 验证每个节点
│
└── 记录升级过程
7.3 升级后验证 #
text
升级后验证清单
│
├── 节点状态正常
│
├── Pod运行正常
│
├── 服务访问正常
│
├── 证书有效期正常
│
└── 应用功能正常
八、自动化升级 #
8.1 升级脚本 #
bash
#!/bin/bash
VERSION="1.28.0"
NODES=$(kubectl get nodes -o jsonpath='{.items[*].metadata.name}')
# 升级控制平面
echo "Upgrading control plane..."
apt-get update
apt-get install -y kubeadm=${VERSION}-00
kubeadm upgrade apply ${VERSION}
apt-get install -y kubelet=${VERSION}-00 kubectl=${VERSION}-00
systemctl restart kubelet
# 升级工作节点
for NODE in $NODES; do
echo "Upgrading node ${NODE}..."
kubectl cordon ${NODE}
kubectl drain ${NODE} --ignore-daemonsets --delete-emptydir-data
# SSH到节点执行升级
ssh ${NODE} "apt-get update && apt-get install -y kubeadm=${VERSION}-00 kubelet=${VERSION}-00 kubectl=${VERSION}-00 && systemctl restart kubelet"
kubectl uncordon ${NODE}
done
echo "Upgrade completed!"
8.2 使用kubeadm配置 #
yaml
# kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.0
controlPlaneEndpoint: "control-plane.example.com:6443"
九、最佳实践 #
9.1 升级策略 #
text
升级策略建议
│
├── 测试环境先升级
│ └── 验证兼容性
│
├── 选择低峰期
│ └── 减少业务影响
│
├── 逐版本升级
│ └── 不跳过版本
│
└── 保留回滚能力
└── 备份和回滚方案
9.2 版本选择 #
text
版本选择建议
│
├── 选择稳定版本
│ └── 避免使用最新版本
│
├── 关注版本生命周期
│ └── 选择长期支持版本
│
└── 统一集群版本
└── 避免版本不一致
十、总结 #
10.1 核心要点 #
| 步骤 | 说明 |
|---|---|
| 准备 | 备份、检查状态 |
| 升级控制平面 | kubeadm upgrade apply |
| 升级工作节点 | 逐个升级 |
| 验证 | 检查集群状态 |
10.2 下一步 #
掌握了集群升级后,让我们学习 部署Web应用,开始实战案例学习。
最后更新:2026-03-28