Что такое Cluster API в Kubernetes?

«Что такое Cluster API в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Преимущества, которые я видел:

  1. Согласованность: Все кластеры (dev, staging, prod) создаются из одного шаблона, минимизируя дрейф конфигурации.
  2. Автоматическое исцеление: Если worker-нода в AWS падает, MachineDeployment (аналог Deployment для машин) автоматически создает новую.
  3. Единый инструмент: Управление жизненным циклом сотен кластеров через знакомый интерфейс kubectl и Git.