集群升级 #

一、升级概述 #

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