Skip to content

Cluster API — Provider 模型

Provider 概念

CAPI 的核心設計哲學是「核心框架 + Provider 插件」:Core 控制器只了解合約(Contract),不直接依賴任何特定基礎設施實作。這使得相同的 CAPI Core 能在 AWS、Azure、vSphere、裸機等環境上運作。

CAPI Core                    Provider
┌─────────────────┐          ┌────────────────────────────┐
│ Cluster CRD     │ ─ref──►  │ AWSCluster / VSphereCluster│
│ Machine CRD     │ ─ref──►  │ AWSMachine / VSphereMachine│
│ KubeadmConfig   │ ─ref──►  │ KubeadmConfig(內建)       │
│ KCP             │ ─ref──►  │ KubeadmControlPlane(內建) │
└─────────────────┘          └────────────────────────────┘

Infrastructure Provider

Infrastructure Provider 負責在目標平台上佈建計算資源(VM、裸機等)。

合約介面

每個 Infrastructure Provider 必須實作以下合約:

合約欄位位置說明
spec.providerIDInfraMachine節點的 Provider ID(如 aws:///us-east-1a/i-xxx
status.readyInfraMachine資源是否佈建完成
status.addressesInfraMachine節點 IP 位址列表
status.readyInfraCluster叢集基礎設施是否就緒

範例 Provider 列表

Provider平台程式庫
CAPD(Docker)Docker(本地開發)sigs.k8s.io/cluster-api 內建
CAPAAmazon Web Servicessigs.k8s.io/cluster-api-provider-aws
CAPZAzuresigs.k8s.io/cluster-api-provider-azure
CAPVVMware vSpheresigs.k8s.io/cluster-api-provider-vsphere
CAPM3Bare Metal(Metal3)sigs.k8s.io/cluster-api-provider-metal3
CAPMAASMAASgithub.com/spectrocloud/cluster-api-provider-maas

引用方式

yaml
# 檔案: config/samples/cluster-with-infra.yaml
apiVersion: cluster.x-k8s.io/v1beta2
kind: Cluster
metadata:
  name: my-cluster
spec:
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: DockerCluster    # Infrastructure Provider 提供的 CRD
    name: my-cluster
    namespace: default

Bootstrap Provider

Bootstrap Provider 負責為每台 Machine 產生節點初始化資料(通常是 cloud-init 或 ignition 格式)。

合約介面

合約欄位位置說明
status.readyBootstrapConfigBootstrap 資料是否已準備好
status.dataSecretNameBootstrapConfig存放初始化腳本的 Secret 名稱

KubeadmConfig(內建 Bootstrap Provider)

CAPI 內建的 Bootstrap Provider,使用 kubeadm 初始化節點:

go
// 檔案: api/bootstrap/kubeadm/v1beta2/kubeadmconfig_types.go
type KubeadmConfigSpec struct {
    // InitConfiguration 用於第一個控制平面節點
    InitConfiguration *bootstrapv1.InitConfiguration `json:"initConfiguration,omitempty"`
    // JoinConfiguration 用於後續節點加入叢集
    JoinConfiguration *bootstrapv1.JoinConfiguration `json:"joinConfiguration,omitempty"`
    // ClusterConfiguration 定義叢集層級的 kubeadm 設定
    ClusterConfiguration *bootstrapv1.ClusterConfiguration `json:"clusterConfiguration,omitempty"`
    // Files 在初始化前寫入的檔案清單
    Files []File `json:"files,omitempty"`
    // PreKubeadmCommands 在 kubeadm 執行前運行的命令
    PreKubeadmCommands []string `json:"preKubeadmCommands,omitempty"`
    // PostKubeadmCommands 在 kubeadm 執行後運行的命令
    PostKubeadmCommands []string `json:"postKubeadmCommands,omitempty"`
}

Machine 引用 Bootstrap Config

yaml
# 檔案: config/samples/machine-with-bootstrap.yaml
apiVersion: cluster.x-k8s.io/v1beta2
kind: Machine
metadata:
  name: worker-1
spec:
  clusterName: my-cluster
  version: "v1.31.0"
  bootstrap:
    configRef:
      apiVersion: bootstrap.cluster.x-k8s.io/v1beta2
      kind: KubeadmConfig
      name: worker-1-bootstrap
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: DockerMachine
    name: worker-1

ControlPlane Provider

ControlPlane Provider 負責管理控制平面節點群組,包含高可用設定與 etcd 管理。

合約介面

合約欄位位置說明
spec.replicasControlPlane控制平面副本數
spec.versionControlPlaneKubernetes 版本
status.readyControlPlane控制平面是否就緒
status.initializedControlPlane第一個控制平面是否初始化完成
status.versionControlPlane實際運行版本

KubeadmControlPlane(內建 ControlPlane Provider)

go
// 檔案: api/controlplane/kubeadm/v1beta2/kubeadm_control_plane_types.go
const (
    KubeadmControlPlaneFinalizer = "kubeadm.controlplane.cluster.x-k8s.io"

    // SkipCoreDNSAnnotation 跳過 CoreDNS reconciliation
    SkipCoreDNSAnnotation = "controlplane.cluster.x-k8s.io/skip-coredns"

    // RemediationInProgressAnnotation 追蹤 KCP 修復進度
    RemediationInProgressAnnotation = "controlplane.cluster.x-k8s.io/remediation-in-progress"
)

IPAM Provider(IP 位址管理)

CAPI 內建 IPAM 支援,透過 IPAddressClaimIPAddress 資源管理 IP 位址分配:

go
// 檔案: api/ipam/v1beta2
// IPAddressClaim 由 Infrastructure Provider 建立,請求分配一個 IP
// IPAddress 由 IPAM Provider 建立,回應 IP 分配結果

// 相關 API 群組:ipam.cluster.x-k8s.io

Runtime Extension(執行期擴展)

CAPI v1.2 引入 Runtime Extension,允許在叢集生命週期的特定時機點注入自定義邏輯(Webhook 形式):

go
// 檔案: api/runtime/hooks/v1alpha1
// 支援的 Hook 點:
// - BeforeClusterCreate  - 叢集建立前
// - AfterControlPlaneInitialized - 控制平面初始化後
// - BeforeClusterUpgrade - 叢集升級前
// - AfterControlPlaneUpgrade - 控制平面升級後
// - BeforeClusterDelete - 叢集刪除前

如何選擇 Provider

對於生產環境,建議根據基礎設施平台選擇官方維護的 Provider(CAPA/CAPZ/CAPV)。對於開發測試,CAPD(Docker Provider)是最快的選擇,無需任何雲端帳號。

Provider 版本相容性

每個 Provider 有對應支援的 CAPI 版本範圍。升級時請先確認 Provider 是否支援目標 CAPI 版本,可透過 clusterctl upgrade plan 查看。

基於 Apache 2.0 授權