CAPI 工作流:CAPI 创建集群的完整生命周期、Provider 机制与基础设施管理

Cluster API (CAPI) 的核心价值在于将 Kubernetes 集群的生命周期管理从“脚本驱动”转变为“声明式驱动”。本章深入剖析 CAPI 创建集群的完整工作流,解析 Provider 机制如何实现基础设施解耦,并阐述基础设施管理的核心原则。

3.1 CAPI 集群创建完整生命周期

CAPI 通过一组自定义资源(CRDs)和控制器,将集群的创建、扩缩容、升级、销毁等操作标准化。一个典型的集群创建流程包含以下阶段:

  1. 提交 Cluster 与 ClusterClass 资源:用户定义集群的规格、版本、拓扑结构。
  2. Infrastructure Provider 响应:CAPI 控制器调用基础设施 Provider,创建虚拟机、网络、负载均衡器等资源。
  3. Bootstrap Provider 生成配置:生成 Kubernetes 节点的初始化配置(如 cloud-init、kubeadm 配置)。
  4. Control Plane Provider 部署:部署并初始化控制平面节点,形成 etcd 集群和 API Server。
  5. MachineDeployment 与 Worker 节点:根据 MachineDeployment 定义,创建并加入 Worker 节点。
  6. 集群就绪:所有组件健康检查通过,集群状态变为 Ready。
关键指标:从提交 Cluster 资源到集群 Ready,典型耗时在 5-15 分钟(取决于云提供商和节点数量)。CAPI 控制器通过 status.phase 字段跟踪每个阶段的进展。
CAPI 集群创建完整生命周期 1. 提交 Cluster ClusterClass 定义 2. Infra Provider 创建 VM / 网络 3. Bootstrap 生成初始化配置 4. Control Plane 部署 etcd + API Server 5. MachineDeploy 创建 Worker 节点 6. 集群就绪 状态 = Ready 阶段说明 • 每个阶段由独立 Controller 负责 • 阶段间通过 OwnerReference 关联 • 失败可自动回滚 • 支持拓扑与 ClusterClass 模板

3.2 Provider 机制:基础设施解耦的核心

CAPI 的 Provider 机制是其可扩展性的基石。Provider 将 CAPI 与具体的基础设施、发行版、引导方式解耦,使得同一套 CAPI 控制平面可以管理跨云、跨环境的集群。

3.2.1 Provider 类型与职责

Provider 类型 核心职责 典型实现 关键 CRD
Infrastructure Provider 管理虚拟机、网络、存储、负载均衡器等基础设施资源 AWS, Azure, GCP, vSphere, OpenStack AWSCluster, AzureCluster
Bootstrap Provider 生成节点初始化脚本、证书、kubeadm 配置 Kubeadm, EKS, AKS KubeadmConfig
Control Plane Provider 管理控制平面节点的生命周期与高可用 Kubeadm, Talos, EKS KubeadmControlPlane
最佳实践:选择 Provider 时,优先考虑 CNCF 认证的官方 Provider。它们通常有更完善的测试覆盖、更快的 bug 修复周期,并且与 CAPI 核心版本的兼容性更好。

3.2.2 Provider 注册与加载

Provider 以 Deployment 形式运行在管理集群中,通过 corev1.Service 暴露 Webhook 和 API。CAPI 控制器通过 Provider 资源对象发现并加载 Provider:

apiVersion: v1
kind: Namespace
metadata:
  name: capi-provider-system
---
apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3
kind: Provider
metadata:
  name: infrastructure-aws
  namespace: capi-provider-system
spec:
  type: InfrastructureProvider
  version: v2.3.0
  configSecret:
    name: aws-credentials
    namespace: capi-provider-system

3.3 基础设施管理:声明式与幂等性

CAPI 的基础设施管理遵循“声明式 API + 控制器调和”模式。用户通过 CRD 描述期望状态,Provider 控制器持续调和,确保实际状态与期望状态一致。

3.3.1 基础设施即代码(IaC)原则

  • 声明式:用户只描述“要什么”,不描述“怎么做”。例如,指定 instanceType: t3.large,而非编写创建 VM 的脚本。
  • 幂等性:多次应用同一份资源定义,结果相同。控制器会检测资源是否存在,避免重复创建。
  • 状态持久化:基础设施状态存储在 Kubernetes 的 status 字段中,支持故障恢复和审计。
  • 资源回收:删除 Cluster 资源时,CAPI 自动级联删除所有关联的基础设施资源,避免资源泄漏。

3.3.2 基础设施管理流程示例(AWS)

以下是一个使用 AWS Infrastructure Provider 创建集群的简化流程:

  1. 用户创建 AWSCluster 资源,指定 VPC、子网、安全组等网络配置。
  2. AWS Provider 控制器调用 AWS SDK,创建 VPC、Internet Gateway、子网、路由表。
  3. 用户创建 AWSMachineTemplate,指定 AMI、实例类型、SSH 密钥。
  4. 当 Machine 资源被创建时,Provider 调用 EC2 API 启动实例,并打上 CAPI 标签。
  5. 实例启动后,Bootstrap Provider 注入初始化脚本,节点自动加入集群。
Provider 机制与基础设施管理架构 管理集群 CAPI Controller Provider Manager Webhook Infra Provider AWS / Azure / vSphere Bootstrap Provider Kubeadm / EKS Control Plane Provider Kubeadm / Talos 目标集群 Control Plane + Worker 节点 VM / 网络 / 存储 Provider 交互 • 管理集群协调 所有 Provider • Provider 通过 CRD 与 API 通信 • 基础设施资源 由 Provider 直接管理 • 支持多 Provider 混合部署

3.4 实战:使用 CAPI 创建集群的完整 YAML 示例

以下是一个使用 AWS Provider 创建 Kubernetes 集群的完整 YAML 示例。该示例展示了 Cluster、AWSCluster、KubeadmControlPlane、AWSMachineTemplate 之间的关联关系。

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: my-cluster
  namespace: default
spec:
  clusterNetwork:
    pods:
      cidrBlocks: ["192.168.0.0/16"]
    services:
      cidrBlocks: ["10.96.0.0/12"]
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
    kind: AWSCluster
    name: my-cluster
  controlPlaneRef:
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    name: my-cluster-control-plane
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSCluster
metadata:
  name: my-cluster
  namespace: default
spec:
  region: us-west-2
  sshKeyName: my-key
  vpc:
    cidrBlock: 10.0.0.0/16
---
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
  name: my-cluster-control-plane
  namespace: default
spec:
  replicas: 3
  version: v1.28.0
  machineTemplate:
    infrastructureRef:
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
      kind: AWSMachineTemplate
      name: my-cluster-control-plane
  kubeadmConfigSpec:
    clusterConfiguration:
      apiServer:
        extraArgs:
          cloud-provider: aws
      controllerManager:
        extraArgs:
          cloud-provider: aws
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSMachineTemplate
metadata:
  name: my-cluster-control-plane
  namespace: default
spec:
  template:
    spec:
      instanceType: t3.large
      iamInstanceProfile: "control-plane.cluster-api-provider-aws.sigs.k8s.io"
      sshKeyName: my-key
注意:在生产环境中,请确保所有敏感信息(如 SSH 密钥、IAM 角色)通过 Secret 或外部密钥管理服务注入,避免明文写在 YAML 中。CAPI 支持通过 configSecret 字段引用外部凭证。

3.5 基础设施管理最佳实践

  • 使用 ClusterClass:通过 ClusterClass 定义可复用的集群拓扑模板,减少重复配置,提升一致性。
  • 标签与注解:为所有基础设施资源添加 CAPI 标准标签(如 cluster.x-k8s.io/cluster-name),便于资源追踪和故障排查。
  • 资源配额:在云提供商侧设置资源配额,防止 CAPI 意外创建过多资源导致成本失控。
  • 状态监控:定期检查 Cluster.status.phase 和 Machine.status.phase,及时发现调和失败。
  • 版本兼容性:确保 CAPI 核心版本与 Provider 版本兼容,参考 clusterctl 的版本矩阵。