3. CAPI 安装与配置:管理集群的搭建与 Provider 部署

本章是 CAPI 实践的基础。在部署工作负载集群之前,必须先搭建一个 管理集群(Management Cluster),并在其上安装 CAPI 核心组件及所需的 Provider。管理集群负责存储集群状态、协调资源并驱动工作负载集群的创建、升级与销毁。

3.1 管理集群(Management Cluster)概述

管理集群是一个标准的 Kubernetes 集群,它运行 CAPI 的控制器和 Provider。它可以是单节点集群(如 Kind、K3s),也可以是多节点生产集群。管理集群本身不运行用户业务负载,而是作为“集群的集群”存在。

角色 说明 典型实现
管理集群 运行 CAPI 控制器、Provider 和存储集群资源(Cluster、Machine、MachineDeployment 等 CRD) Kind、K3s、EKS、AKS、GKE
工作负载集群 由管理集群通过 CAPI 声明式创建和管理的目标集群 任意 Kubernetes 发行版
推荐实践: 在开发/测试环境中,使用 Kind 作为管理集群是最快的方式。Kind 集群运行在 Docker 容器中,启动快、资源占用低,且与 CAPI 的兼容性最好。

3.2 管理集群的搭建(以 Kind 为例)

以下步骤演示如何快速搭建一个 Kind 管理集群,并验证其可用性。

  1. 安装 Kind(如果尚未安装)
# 使用 brew(macOS)
brew install kind

# 使用 curl(Linux)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
  1. 创建 Kind 集群配置文件(可选,用于自定义端口映射和节点数)
# kind-cluster.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 6443
    hostPort: 6443
    protocol: TCP
  1. 启动管理集群
kind create cluster --name capi-mgmt --config kind-cluster.yaml
  1. 验证集群状态
kubectl cluster-info --context kind-capi-mgmt
kubectl get nodes
输出示例: 应看到 capi-mgmt-control-plane 节点处于 Ready 状态。

3.3 CAPI 命令行工具:clusterctl

clusterctl 是 CAPI 的官方 CLI 工具,用于安装、升级和管理 CAPI 组件。它封装了 Provider 的发现、下载和部署逻辑。

3.3.1 安装 clusterctl

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

# 验证安装
clusterctl version

3.3.2 clusterctl 常用命令

命令 功能 示例
clusterctl init 初始化管理集群,安装核心 CAPI 组件和指定 Provider clusterctl init --infrastructure docker
clusterctl generate cluster 生成工作负载集群的 YAML 模板 clusterctl generate cluster my-cluster --infrastructure docker > cluster.yaml
clusterctl describe cluster 查看集群的详细状态和资源拓扑 clusterctl describe cluster my-cluster
clusterctl upgrade plan 检查可用的 CAPI 版本升级路径 clusterctl upgrade plan
clusterctl delete 从管理集群中移除 CAPI 组件 clusterctl delete --infrastructure docker

3.4 Provider 的安装与配置

Provider 是 CAPI 的可插拔组件,负责与底层基础设施(如 AWS、vSphere、Docker)或特定功能(如 Kubeadm 引导)交互。安装 Provider 是 clusterctl init 的核心步骤。

3.4.1 Provider 类型

Provider 类型 作用 常见实现
Infrastructure Provider 管理计算、网络、存储等基础设施资源 AWS (CAPA), Azure (CAPZ), GCP (CAPG), vSphere (CAPV), Docker (CAPD)
Bootstrap Provider 生成节点加入集群所需的引导令牌和配置 Kubeadm (CABPK)
Control Plane Provider 管理控制平面节点的生命周期 Kubeadm (KCP), Talos (Sidero)

3.4.2 安装 Docker Infrastructure Provider(CAPD)

CAPD 是 CAPI 的 Docker 基础设施 Provider,允许在本地 Docker 容器中创建工作负载集群,非常适合开发和测试。

# 初始化管理集群,安装核心 CAPI + Docker Provider
clusterctl init --infrastructure docker

# 查看安装的 Pod
kubectl get pods -n capi-system
kubectl get pods -n capd-system
注意: 安装 Provider 时,clusterctl 会自动从 GitHub Release 下载对应的 Provider 镜像和 YAML 清单。确保管理集群可以访问 ghcr.io 和 registry.k8s.io。

3.4.3 配置 Provider 变量

某些 Provider 需要环境变量或 ConfigMap 来配置认证信息(如云厂商的 Access Key)。以 AWS 为例:

# 设置 AWS 凭证环境变量
export AWS_REGION=us-west-2
export AWS_ACCESS_KEY_ID=your-access-key
export AWS_SECRET_ACCESS_KEY=your-secret-key

# 初始化 AWS Provider
clusterctl init --infrastructure aws

对于 Docker Provider,通常无需额外配置,但可以通过环境变量调整容器网络和镜像仓库:

export CAPI_DOCKER_IMAGE_TAG=v1.6.0
export CAPI_DOCKER_NETWORK=kind

3.5 CAPI 组件架构图

下图展示了管理集群中 CAPI 核心组件与 Provider 的关系:

CAPI 管理集群组件架构 CAPI 管理集群组件架构 管理集群(Kind / K3s / EKS) CAPI 核心控制器 Cluster / Machine / MachineDeployment Bootstrap Provider Kubeadm (CABPK) Control Plane Provider Kubeadm (KCP) Infrastructure Provider Docker / AWS / vSphere 说明: • 核心控制器管理 CRD 和协调逻辑 • Provider 实现具体基础设施/引导逻辑 • clusterctl 负责组件的安装和升级

3.6 验证安装

安装完成后,通过以下命令验证 CAPI 组件是否正常运行:

# 查看 CAPI 相关的 CRD
kubectl get crd | grep cluster.x-k8s.io

# 查看 Provider 的 Deployment
kubectl get deployments -n capi-system
kubectl get deployments -n capd-system

# 查看 CAPI 版本
clusterctl version
快速验证: 运行 clusterctl init --infrastructure docker 后,如果所有 Pod 处于 Running 状态,说明管理集群和 Provider 安装成功。此时即可进入下一章:创建工作负载集群。

3.7 常见问题与排错

问题 可能原因 解决方案
clusterctl init 超时 网络无法访问 GitHub Release 或容器镜像仓库 配置代理或使用国内镜像源;检查 DNS 解析
Provider Pod 处于 CrashLoopBackOff 缺少必要的环境变量或凭证 检查 Provider 文档,设置正确的环境变量(如 AWS_ACCESS_KEY_ID)
Kind 集群无法创建 Docker 未运行或端口冲突 确保 Docker 服务运行;检查 6443 端口是否被占用

3.8 本章小结