Ответ
Cluster API (CAPI) — это проект под эгидой CNCF, который расширяет парадигму Kubernetes «желаемого состояния» на управление самими кластерами. Вместо ручных вызовов облачных API или использования kubeadm вручную, вы описываете целевой кластер (его версию, размер нод, сеть) через Kubernetes-манифесты, а CAPI и его провайдеры (для AWS, Azure, vSphere и др.) приводят инфраструктуру к этому состоянию.
С чем я работал на проекте:
- Ключевые Custom Resources:
Cluster,MachineDeployment,KubeadmControlPlane. Они описывают, соответственно, логический кластер, пул рабочих нод и control-plane ноды. - Провайдеры: Использовал
cluster-api-provider-aws(CAPA) для развертывания кластеров EKS-подобной инфраструктуры в AWS. - GitOps-подход: Манифесты кластеров хранились в Git (вместе с манифестами приложений), а FluxCD отслеживал изменения и применял их. Это давало полную историю изменений и возможность отката.
Пример манифеста для создания кластера в AWS:
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: prod-cluster-01
namespace: capi-system
spec:
clusterNetwork:
pods:
cidrBlocks:
- 192.168.0.0/16
services:
cidrBlocks:
- 10.96.0.0/12
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
name: prod-cluster-01-control-plane
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AWSCluster
name: prod-cluster-01
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AWSCluster
metadata:
name: prod-cluster-01
namespace: capi-system
spec:
region: eu-west-1
sshKeyName: prod-ssh-key
controlPlaneEndpoint:
host: "" # CAPI автоматически создаст Network Load Balancer
port: 6443
networkSpec:
vpc:
cidrBlock: 10.0.0.0/16
Преимущества, которые я видел:
- Согласованность: Все кластеры (dev, staging, prod) создаются из одного шаблона, минимизируя дрейф конфигурации.
- Автоматическое исцеление: Если worker-нода в AWS падает,
MachineDeployment(аналогDeploymentдля машин) автоматически создает новую. - Единый инструмент: Управление жизненным циклом сотен кластеров через знакомый интерфейс
kubectlи Git.