CAPI 工作流:CAPI 创建集群的完整生命周期、Provider 机制与基础设施管理
Cluster API (CAPI) 的核心价值在于将 Kubernetes 集群的生命周期管理从“脚本驱动”转变为“声明式驱动”。本章深入剖析 CAPI 创建集群的完整工作流,解析 Provider 机制如何实现基础设施解耦,并阐述基础设施管理的核心原则。
3.1 CAPI 集群创建完整生命周期
CAPI 通过一组自定义资源(CRDs)和控制器,将集群的创建、扩缩容、升级、销毁等操作标准化。一个典型的集群创建流程包含以下阶段:
- 提交 Cluster 与 ClusterClass 资源:用户定义集群的规格、版本、拓扑结构。
- Infrastructure Provider 响应:CAPI 控制器调用基础设施 Provider,创建虚拟机、网络、负载均衡器等资源。
- Bootstrap Provider 生成配置:生成 Kubernetes 节点的初始化配置(如 cloud-init、kubeadm 配置)。
- Control Plane Provider 部署:部署并初始化控制平面节点,形成 etcd 集群和 API Server。
- MachineDeployment 与 Worker 节点:根据 MachineDeployment 定义,创建并加入 Worker 节点。
- 集群就绪:所有组件健康检查通过,集群状态变为 Ready。
关键指标:从提交 Cluster 资源到集群 Ready,典型耗时在 5-15 分钟(取决于云提供商和节点数量)。CAPI 控制器通过
status.phase 字段跟踪每个阶段的进展。
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 创建集群的简化流程:
- 用户创建
AWSCluster资源,指定 VPC、子网、安全组等网络配置。 - AWS Provider 控制器调用 AWS SDK,创建 VPC、Internet Gateway、子网、路由表。
- 用户创建
AWSMachineTemplate,指定 AMI、实例类型、SSH 密钥。 - 当
Machine资源被创建时,Provider 调用 EC2 API 启动实例,并打上 CAPI 标签。 - 实例启动后,Bootstrap 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的版本矩阵。