3. CAPI 安装与配置:使用 clusterctl 初始化管理集群、安装 AWS/Azure/vSphere Provider

本章将指导你完成 Cluster API(CAPI)管理集群的初始化,并安装主流基础设施 Provider(AWS、Azure、vSphere)。clusterctl 是 CAPI 官方 CLI 工具,负责管理集群生命周期、Provider 安装与版本控制。正确初始化管理集群是后续多集群变更门禁流水线的基础。

3.1 前置条件与环境准备

在安装 CAPI 之前,请确保管理集群满足以下条件:

组件 版本要求 说明
Kubernetes 集群 v1.22+ 作为管理集群,推荐使用 kind、k3d 或现有生产集群
kubectl v1.22+ 与集群版本偏差不超过一个次要版本
clusterctl 最新稳定版 从 GitHub Releases 下载二进制
对象存储(可选) S3/MinIO 用于存储集群模板和状态,生产环境推荐
推荐实践:使用 kind 创建本地管理集群进行测试,生产环境建议使用高可用 Kubernetes 集群(3 节点以上)。

3.2 安装 clusterctl CLI

下载并安装 clusterctl 二进制文件:

# Linux / macOS
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.7.0/clusterctl-linux-amd64 -o clusterctl
chmod +x clusterctl
sudo mv clusterctl /usr/local/bin/

# 验证安装
clusterctl version

3.3 初始化管理集群

使用 clusterctl init 命令初始化管理集群,安装核心组件和基础设施 Provider。核心组件包括 Cluster API 控制器管理器、Cluster API Bootstrap Provider(CABPK)和 Cluster API Control Plane Provider(KCP)。

# 初始化管理集群,安装 AWS Provider
clusterctl init --infrastructure aws

# 初始化管理集群,安装 Azure Provider
clusterctl init --infrastructure azure

# 初始化管理集群,安装 vSphere Provider
clusterctl init --infrastructure vsphere
注意:初始化命令会修改管理集群的 kubeconfig 上下文。确保当前 kubeconfig 指向正确的管理集群,且具有 cluster-admin 权限。

3.4 Provider 配置与凭证管理

每个基础设施 Provider 需要对应的云凭证才能创建和管理资源。下表总结了三种 Provider 的凭证配置方式:

Provider 凭证变量 配置方式
AWS AWS_B64ENCODED_CREDENTIALS base64 编码的 AWS 凭证文件,通过环境变量注入
Azure AZURE_SUBSCRIPTION_ID, AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET 服务主体凭证,通过环境变量或 Secret 注入
vSphere VSPHERE_SERVER, VSPHERE_USER, VSPHERE_PASSWORD vCenter 凭证,通过环境变量或 Secret 注入

AWS Provider 凭证配置示例

# 创建 IAM 用户并获取 Access Key
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_REGION=us-west-2

# 生成 base64 编码的凭证
clusterctl generate cluster my-cluster --infrastructure aws \
  --target-namespace default \
  --flavor default > cluster.yaml

Azure Provider 凭证配置示例

# 创建服务主体并分配 Contributor 角色
az ad sp create-for-rbac --name "capi-sp" --role Contributor --scopes /subscriptions/{subscription-id}

# 设置环境变量
export AZURE_SUBSCRIPTION_ID="your-subscription-id"
export AZURE_TENANT_ID="your-tenant-id"
export AZURE_CLIENT_ID="your-client-id"
export AZURE_CLIENT_SECRET="your-client-secret"

vSphere Provider 凭证配置示例

# 设置 vCenter 连接信息
export VSPHERE_SERVER="vcenter.example.com"
export VSPHERE_USER="administrator@vsphere.local"
export VSPHERE_PASSWORD="your-password"
export VSPHERE_DATACENTER="Datacenter"
export VSPHERE_DATASTORE="datastore1"
export VSPHERE_NETWORK="VM Network"
export VSPHERE_RESOURCE_POOL="Resources"
export VSPHERE_FOLDER="vm"

3.5 验证初始化状态

初始化完成后,使用以下命令验证组件状态:

# 查看 CAPI 相关 Pod
kubectl get pods -n capi-system
kubectl get pods -n capi-webhook-system

# 查看 Provider 部署
kubectl get deployment -n capi-system
kubectl get deployment -n capi-webhook-system

# 查看 Provider 资源
kubectl get clusterclasses
kubectl get infrastructureproviders
验证要点:
  • 所有 Pod 处于 Running 状态
  • Webhook 服务正常响应
  • Provider 资源已注册(如 AWSCluster、AzureCluster、VSphereCluster)

3.6 CAPI 初始化架构图

下图展示了 clusterctl 初始化管理集群后的组件架构:

CAPI 管理集群初始化架构 Kubernetes 管理集群 CAPI 控制器管理器 CABPK (Bootstrap) KCP (Control Plane) AWS Provider Azure Provider vSphere Provider AWS EC2 / VPC Azure VM / VNet vSphere VM / Network 说明: • clusterctl init 安装核心组件(CAPI、CABPK、KCP)和指定基础设施 Provider。 • 每个 Provider 负责与对应云 API 交互,创建和管理工作负载集群资源。 • 管理集群通过 Provider 的 CRD(如 AWSCluster、AzureCluster)驱动基础设施创建。

3.7 常见问题与排错

问题 可能原因 解决方案
Pod 处于 CrashLoopBackOff 凭证错误或网络不通 检查 Secret 和环境变量,确认云 API 可达
Webhook 证书错误 cert-manager 未安装 安装 cert-manager:kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
Provider 资源未注册 初始化命令未正确执行 重新运行 clusterctl init 并检查日志
版本不兼容 clusterctl 与 Provider 版本不匹配 使用 clusterctl upgrade plan 检查兼容版本
排错命令:
# 查看 CAPI 控制器日志
kubectl logs -n capi-system deployment/capi-controller-manager manager

# 查看 Provider 日志
kubectl logs -n capi-system deployment/capv-controller-manager manager

# 检查 Provider 版本
clusterctl describe provider

3.8 多 Provider 共存配置

在实际生产环境中,管理集群可能需要同时管理多个基础设施 Provider。使用 clusterctl init 可以一次性安装多个 Provider:

# 同时安装 AWS、Azure、vSphere Provider
clusterctl init --infrastructure aws,azure,vsphere

多 Provider 共存时,需要注意以下事项:

  • 凭证隔离:每个 Provider 使用独立的 Secret 或环境变量,避免混淆。
  • 资源命名:不同 Provider 的 CRD 资源名称不同(如 AWSCluster vs AzureCluster),不会冲突。
  • 资源配额:确保管理集群有足够的资源运行多个 Provider 控制器。
  • 网络策略:如果管理集群部署在受限网络,需要为每个 Provider 配置网络出口规则。

3.9 初始化后验证清单

完成初始化后,使用以下清单确认所有组件正常运行:

  1. 核心组件:capi-controller-manager、capi-kubeadm-bootstrap-controller-manager、capi-kubeadm-control-plane-controller-manager 均处于 Running 状态。
  2. Provider 组件:对应 Provider 控制器(如 capa-controller-manager、capz-controller-manager、capv-controller-manager)已部署并运行。
  3. Webhook 服务:capi-webhook-service 和 Provider Webhook 服务正常响应。
  4. CRD 注册:执行 kubectl get crd | grep cluster.x-k8s.io 确认核心 CRD 已注册。
  5. Provider CRD:执行 kubectl get crd | grep infrastructure.cluster.x-k8s.io 确认 Provider CRD 已注册。
  6. 集群模板:执行 clusterctl config cluster 测试能否生成集群模板。
最佳实践:将初始化命令和凭证配置写入自动化脚本(如 Makefile 或 Shell 脚本),确保环境可重复构建。推荐使用 GitOps 方式管理管理集群的初始化配置。