4、声明式集群生命周期:通过YAML创建、扩缩容、升级、销毁集群

声明式管理是 Kubernetes 生态的核心设计哲学,CAPI 将其延伸至集群维度。本章聚焦如何通过 YAML 清单驱动集群的完整生命周期——从创建、扩缩容、升级到最终销毁,实现“集群即代码”的运维范式。

4.1 核心资源模型

CAPI 使用分层资源模型描述集群及其关联基础设施。一个典型的工作负载集群由以下核心 CRD 组成:

资源类型 作用域 职责
Cluster 命名空间 集群顶层定义,关联基础设施模板与控制平面
InfrastructureCluster 命名空间 云/本地基础设施资源(VPC、网络、负载均衡)
KubeadmControlPlane 命名空间 控制平面节点组,管理 etcd 与 API Server 版本
MachineDeployment 命名空间 工作节点组,支持滚动更新与扩缩容
Machine 命名空间 单台计算实例,由 MachineDeployment 或 KCP 管理
关键原则:所有变更均通过修改 YAML 并提交至 Git 仓库触发,CAPI 控制器负责调和实际状态与期望状态。

4.2 创建集群:从 YAML 到运行

以下是一个最小化集群定义示例,使用 AWS 基础设施与 Kubeadm 控制平面:

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: prod-cluster-01
  namespace: default
spec:
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
    kind: AWSCluster
    name: prod-cluster-01
  controlPlaneRef:
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    name: prod-cluster-01-control-plane
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSCluster
metadata:
  name: prod-cluster-01
  namespace: default
spec:
  region: ap-northeast-1
  sshKeyName: capi-key
---
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
  name: prod-cluster-01-control-plane
  namespace: default
spec:
  replicas: 3
  version: v1.28.5
  machineTemplate:
    infrastructureRef:
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
      kind: AWSMachineTemplate
      name: prod-cluster-01-cp-template
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSMachineTemplate
metadata:
  name: prod-cluster-01-cp-template
  namespace: default
spec:
  template:
    spec:
      instanceType: t3.medium
      iamInstanceProfile: "control-plane.cluster-api-provider-aws.sigs.k8s.io"
实践建议:将上述 YAML 拆分为独立文件并按目录组织(clusters/prod/cluster.yaml, clusters/prod/controlplane.yaml),便于 GitOps 工具(如 ArgoCD)按目录同步。

4.3 扩缩容:修改副本数

扩缩容只需修改 KubeadmControlPlane 或 MachineDeployment 中的 replicas 字段。CAPI 控制器会自动创建或删除对应的 Machine 对象。

# 将工作节点从 5 扩容到 10
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  name: prod-cluster-01-workers
  namespace: default
spec:
  replicas: 10  # 原值为 5
  template:
    spec:
      version: v1.28.5
      bootstrap:
        configRef:
          apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
          kind: KubeadmConfigTemplate
          name: prod-cluster-01-worker-config
操作 修改字段 控制器行为
扩容 replicas 增大 创建新 Machine → 基础设施提供商创建实例 → 加入集群
缩容 replicas 减小 标记待删除 Machine → 排空节点 → 删除实例 → 清理资源
注意:缩容时 CAPI 默认使用 machinedeployment.cluster.x-k8s.io/remediation-in-progress 注解保护正在修复的节点,避免误删。生产环境建议设置 maxSurge 和 maxUnavailable 控制滚动速率。

4.4 升级:控制平面与工作节点

升级集群版本通过修改 version 字段触发。CAPI 支持两种升级策略:

  • 滚动升级(默认):逐台替换节点,保持集群可用性。
  • 原地升级:部分提供商支持(如 OpenStack),直接更新实例镜像。
# 控制平面升级:v1.28.5 → v1.29.2
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
  name: prod-cluster-01-control-plane
  namespace: default
spec:
  version: v1.29.2  # 升级目标版本
  replicas: 3
  rolloutStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
升级顺序:先升级控制平面(KCP),再升级工作节点(MachineDeployment)。控制平面升级完成后,kube-apiserver 版本应不低于所有工作节点的 kubelet 版本。

4.5 销毁集群:声明式清理

销毁集群只需删除 Cluster 对象。CAPI 的垃圾回收机制会级联删除所有关联资源:

kubectl delete cluster prod-cluster-01 -n default

删除顺序由 OwnerReference 链保证:

  1. Cluster 控制器删除所有 Machine 对象。
  2. Machine 控制器排空节点并删除基础设施实例。
  3. 控制平面与基础设施模板被清理。
  4. Cluster 对象最终被移除。
生产警告:删除 Cluster 前务必确认工作负载已迁移或备份。CAPI 不会自动备份 etcd 或 PV 数据。建议在 CI/CD 门禁中增加“销毁前确认”步骤。

4.6 生命周期状态机

下图展示了 CAPI 集群从创建到销毁的完整状态转换:

CAPI 集群生命周期状态机 CAPI 集群生命周期状态机 Pending Provisioning Running Upgrading Scaling Deleting Deleted (终态) 创建基础设施 控制平面就绪 修改 version 升级完成 修改 replicas 扩缩完成 删除 Cluster 资源清理完成 说明:所有状态转换均由 YAML 清单变更触发,CAPI 控制器自动调和。Upgrading 和 Scaling 为 Running 的子状态。

4.7 生命周期操作对比

操作 修改对象 关键字段 集群可用性 回滚方式
创建 Cluster + 关联资源 spec.infrastructureRef 创建完成后可用 删除 Cluster
扩容 MachineDeployment spec.replicas 持续可用 恢复 replicas 原值
缩容 MachineDeployment spec.replicas 持续可用(需保证 PDB) 恢复 replicas 原值
升级 KubeadmControlPlane / MachineDeployment spec.version 滚动升级期间部分可用 恢复 version 原值
销毁 Cluster 删除操作 立即不可用 不可回滚,需重新创建

4.8 声明式生命周期最佳实践

  • 版本锁定:所有 YAML 清单应存储在 Git 仓库,使用版本标签(如 v1.0.0)标记集群基线。
  • 预检门禁:在 CI 流水线中增加 clusterctl validate 步骤,确保 YAML 语法与资源引用正确。
  • 变更审批:升级和销毁操作需要人工审批,通过 Git MR/PR 流程控制。
  • 状态监控:使用 kubectl get cluster -w 或 CAPI 提供的 Cluster.status.phase 字段跟踪生命周期进度。
  • 灾备恢复:定期导出 Cluster 资源清单(clusterctl get kubeconfig + 资源备份),用于故障重建。
生产案例:某金融科技团队将 200+ 集群的 YAML 清单托管在 GitLab,通过 MR 触发 GitLab CI 执行 clusterctl generate cluster 预览变更,再自动应用到目标管理集群。升级操作需两位高级工程师审批,平均变更交付时间从 45 分钟缩短至 8 分钟。