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 链保证:
- Cluster 控制器删除所有 Machine 对象。
- Machine 控制器排空节点并删除基础设施实例。
- 控制平面与基础设施模板被清理。
- Cluster 对象最终被移除。
生产警告:删除 Cluster 前务必确认工作负载已迁移或备份。CAPI 不会自动备份 etcd 或 PV 数据。建议在 CI/CD 门禁中增加“销毁前确认”步骤。
4.6 生命周期状态机
下图展示了 CAPI 集群从创建到销毁的完整状态转换:
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 分钟。