以下是从 Kubernetes 1.24 升级到 1.27 的完整方案,重点解决 CRD 兼容性和平滑过渡问题:


一、升级前关键检查

  1. 版本路径规划

    1.24 → 1.25 → 1.26 → 1.27  # 禁止跨版本升级
    

    • 需按顺序逐版本升级,每个版本停留至少 24 小时观察
  2. CRD 兼容性审查

    • 检查所有 CRD 的 API 版本:
      kubectl get crd -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.versions[*].name}{"\n"}{end}'
      

    • 关键变更
      • 1.25+ 移除 apiextensions.k8s.io/v1beta1
      • 若 CRD 使用 v1beta1,需先转换为 v1
        apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        

  3. 废弃 API 检测
    使用官方工具扫描:

    kubectl-convert -f ./manifests/ --output-version v1
    


二、升级操作流程

步骤 1:控制平面升级
# 1. 排空控制节点
kubectl drain <control-plane-node> --ignore-daemonsets

# 2. 升级 kubeadm
sudo apt update && sudo apt install kubeadm=1.27.x-00

# 3. 验证升级计划
sudo kubeadm upgrade plan

# 4. 应用升级 (示例:1.24→1.25)
sudo kubeadm upgrade apply v1.25.x

# 5. 解除节点保护
kubectl uncordon <control-plane-node>

重复以上步骤直至完成 1.25→1.26→1.27

步骤 2:Worker 节点升级
# 1. 排空节点
kubectl drain <worker-node> --ignore-daemonsets

# 2. 升级组件
sudo apt install kubelet=1.27.x-00 kubectl=1.27.x-00

# 3. 重启服务
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 4. 解除节点保护
kubectl uncordon <worker-node>


三、CRD 兼容性处理方案

场景 1:存储版本迁移
# 在 CRD 中指定存储版本
spec:
  versions:
  - name: v1alpha1
    served: true   # 可提供服务
    storage: false # 非存储版本
  - name: v1
    served: true
    storage: true  # 设置为首选存储版本

场景 2:Webhook 转换
spec:
  conversion:
    strategy: Webhook
    webhook:
      clientConfig:
        url: https://crd-converter.example.com/convert


四、验证与回滚

验证清单
  1. 核心功能检查:
    kubectl get nodes -o wide
    kubectl get pods --all-namespaces
    

  2. CRD 操作测试:
    kubectl apply -f custom-resource.yaml
    kubectl get <crd-name>
    

  3. 监控指标验证:
    kubectl top pods
    

回滚机制
  1. etcd 快照恢复
    ETCDCTL_API=3 etcdctl snapshot restore snapshot.db --data-dir=/var/lib/etcd-new
    

  2. 节点降级
    sudo apt install kubeadm=1.24.x-00 kubelet=1.24.x-00
    sudo kubeadm downgrade apply v1.24.x
    


五、注意事项

  1. 关键版本变更

    版本 重大变更
    1.25 移除 PodSecurityPolicy
    1.26 废弃 k8s.gcr.io 转向 registry.k8s.io
    1.27 默认启用 CEL 校验规则
  2. 推荐工具

升级后观察日志:journalctl -u kubelet -f 持续监控 48 小时


执行建议

  • 生产环境先在非核心业务集群验证
  • 每次升级间隔 ≥72 小时
  • 确保 etcd 备份可用性:ETCDCTL_API=3 etcdctl snapshot save backup.db

更多推荐