用Kubernetes资源声明式管理集群生命周期的官方子项目
Cluster API(简称 CAPI)是 Kubernetes SIG Cluster Lifecycle 维护的子项目。它把「创建、升级、伸缩、销毁一个 Kubernetes 集群」这件事本身变成了 Kubernetes 资源:用一个集群(management cluster)去声明式地管理一批集群(workload cluster)。
它要解决的问题是:集群本身也该有 GitOps。手工跑 kubeadm init 建出来的集群,版本、节点数、网络参数散落在各台机器上;而用 CAPI 描述之后,集群的定义就是一份 YAML,可以进 Git、可以 review、可以 diff,扩缩容和升级都变成改字段。
CAPI 并不是「装 Kubernetes 的工具」,而是一套编排框架。真正去调云 API 创建虚拟机的,是各个厂商自己实现的 provider。
management cluster 管理集群:跑 CAPI 控制器的地方,通常是一个长期存在的小集群
workload cluster 工作负载集群:被管理集群,CAPI 负责它的创建与生命周期
bootstrap cluster 引导集群:一次性的临时集群,用来生成 management cluster 自身
provider 提供者,分四类:
Core 核心控制器,由 sigs.k8s.io/cluster-api 提供
Bootstrap 生成节点加入集群所需的 cloud-init,官方实现是 Kubeadm
Control Plane 管理控制平面节点,官方实现是 KubeadmControlPlane(KCP)
Infrastructure 真正创建机器,由各家厂商实现(AWS/Azure/vSphere/Docker/Metal3…)
对应的资源对象:
Cluster 一个集群的整体描述
Machine 一台机器(一台虚拟机或裸金属)
MachineSet 一组同构机器,类似 ReplicaSet
MachineDeployment 声明式管理 MachineSet,类似 Deployment
MachineHealthCheck 节点健康检查,不健康自动重建
ClusterClass 集群模板,把「怎么建」固化下来,实现一份 YAML 建任意多集群
一个关键约定:CAPI 的控制器都运行在 management cluster 上,而 workload cluster 里只有一个 agent(cluster-api-agent)负责接收指令。因此 workload cluster 的 API Server 挂掉时,依然可以通过管理集群来修复它。
# macOS / Linux (Homebrew)
brew install clusterctl
# 官方二进制
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.14.1/clusterctl-linux-amd64 \
-o clusterctl
sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl
# macOS (Apple Silicon)
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.14.1/clusterctl-darwin-arm64 \
-o clusterctl && chmod +x clusterctl && sudo mv clusterctl /usr/local/bin/
clusterctl version
clusterctl 应始终使用最新的补丁版本,它会用自身的版本去驱动其他组件的升级。
# 准备一个已有的 Kubernetes 集群作为 management cluster
export KUBECONFIG=~/.kube/management.kubeconfig
# 启用 ClusterClass 所需的实验特性(拓扑管理)
export CLUSTER_TOPOLOGY=true
# 安装核心组件 + Docker 基础设施 provider(仅用于本地验证)
clusterctl init --infrastructure docker
# 安装到真实云环境
clusterctl init --infrastructure aws
clusterctl init --infrastructure azure
clusterctl init --infrastructure vsphere
clusterctl init --infrastructure openstack
也可以锁定每个组件的版本:
clusterctl init \
--core cluster-api:v1.14.1 \
--bootstrap kubeadm:v1.14.1 \
--control-plane kubeadm:v1.14.1 \
--infrastructure aws:v2.9.0
查看当前已安装的 provider:
clusterctl config repositories
kubectl get pods -A | grep -E 'capi|cap[a-z]'
kubectl get providers -A
# 生成集群清单(模板由 infrastructure provider 提供)
clusterctl generate cluster capi-quickstart \
--flavor development \
--kubernetes-version v1.37.0 \
--control-plane-machine-count=3 \
--worker-machine-count=3 \
> capi-quickstart.yaml
# 查看模板里有哪些可填变量
clusterctl generate cluster capi-quickstart \
--infrastructure docker --list-variables
# 应用清单
kubectl apply -f capi-quickstart.yaml
生成的清单里会包含 Cluster、MachineDeployment、KubeadmControlPlane 等对象。控制平面会一直处于 NotReady 状态,直到你安装 CNI 插件 —— 这与 kubeadm 的行为一致。
# 观察创建进度
clusterctl describe cluster capi-quickstart
kubectl get cluster,machine -A
kubectl get kubeadmcontrolplane
# 取出 workload cluster 的 kubeconfig
clusterctl get kubeconfig capi-quickstart > capi-quickstart.kubeconfig
export KUBECONFIG=./capi-quickstart.kubeconfig
kubectl get nodes
ClusterClass 把集群的定义拆成「模板」与「实例」,适合一个平台统一交付多种规格的集群:
apiVersion: cluster.x-k8s.io/v1beta2
kind: Cluster
metadata:
name: prod-01
spec:
topology:
class: quick-start
version: v1.37.0
controlPlane:
replicas: 3
workers:
machineDeployments:
- class: default-worker
name: md-0
replicas: 5
集群实例只需要写「要什么」,不再关心「怎么建」。版本升级也只需改一个字段:
kubectl patch cluster prod-01 --type=merge \
-p '{"spec":{"topology":{"version":"v1.38.0"}}}'
# 升级管理集群上的 provider 组件
clusterctl upgrade plan
clusterctl upgrade apply --management-group capi-system
# 把 CAPI 管理的对象从一个管理集群搬到另一个(灾难恢复、迁移)
clusterctl move --to-kubeconfig=~/.kube/new-management.kubeconfig
# 查看某类 provider 的可用版本
clusterctl config repositories
Cluster 这类资源是通用的,但 AWSMachineTemplate、VSphereMachineTemplate 是厂商专属的。选型时要想清楚是否会跨云,跨云意味着资源清单要重写。v1beta1 已废弃。自 CAPI v1.11 起 v1beta1 进入废弃状态,并计划在 v1.16(约 2027 年 4 月)停止服务。所有清单都应迁移到 v1beta2,provider 也必须实现新契约版本。provider 的版本号不需要与 CAPI 版本号一致,但契约版本必须匹配。kubectl apply 网络插件。Cluster 对象,而不是删除 YAML 文件。kubectl delete -f capi-quickstart.yaml 可能因为顺序问题留下未被清理的云资源,正确做法是 kubectl delete cluster capi-quickstart,让控制器按依赖顺序回收。kubectl — Kubernetes集群管理工具kubeadm — CAPI 的 Kubeadm provider 底层调用的工具rancher — 内置 CAPI 集成的多集群管理平台karmada — 面向多集群应用调度的方案kind — 常用于搭建 CAPI 的本地管理集群