Crossplane:Kubernetes 上的多云控制平面

FreeGuideOnline 最新 2026-07-01

什么是 Crossplane?

Crossplane 是一个开源的 Kubernetes 插件,它将你的 Kubernetes 集群转变为一个多云控制平面。借助 Crossplane,你可以使用声明式 YAML 来管理和编排来自 AWS、Azure、GCP、阿里云等不同云提供商的资源,就像管理原生的 Pod 和 Deployment 一样。Crossplane 让你无需学习多种云 API 或 Terraform 方言,即可在一套工作流中统一管理基础设施。

Crossplane 的核心思想是 “万物皆资源”。它通过扩展 Kubernetes API,让你通过 CRD(自定义资源)定义数据库、存储桶、虚拟机等云服务,并利用 Kubernetes 的控制器持续协调实际状态与期望状态一致。

Crossplane 的核心概念

理解 Crossplane 的关键在于掌握它的三层资源模型:

1. Provider(提供商)

Provider 是连接云平台的适配器。每个云厂商都有一个对应的 Provider,比如 provider-awsprovider-gcpprovider-azure。安装 Provider 后,Crossplane 就会在你的集群中注册该云平台所支持的所有 CRD。

2. Managed Resource(托管资源)

托管资源代表云平台中的一个具体资源实例,例如一个 RDS 数据库实例或一个 S3 存储桶。每一种托管资源都由 Provider 以 CRD 的形式暴露出来,你通过创建对应的 YAML 来声明该资源的配置。

3. Composite Resource(组合资源)与 Composition

这是 Crossplane 最强大的抽象层。你可以定义一个 Composite Resource (XR),它是一个自定义的、自包含的 API 对象,为你的应用团队屏蔽底层基础设施细节。Composition 则定义了 XR 到底层托管资源的映射模板。这让你能够构建“平台 API”——开发人员只需申明“我需要一个生产级 PostgreSQL”,而不需要关心它在哪个云上、如何配置子网。

环境准备与安装

在安装 Crossplane 之前,请确保你有一个可用的 Kubernetes 集群(v1.22+),例如本地 minikube、kind 或云上的托管集群。

安装 Crossplane 核心组件

使用 Helm 是最快的方式:

helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane crossplane-stable/crossplane --namespace crossplane-system --create-namespace

安装完成后,检查 Pod 状态:

kubectl get pods -n crossplane-system

你应该看到 crossplanecrossplane-rbac-manager 的 Pod 处于 Running 状态。

安装云 Provider

以 AWS 为例,安装 provider-aws

cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws
spec:
  package: "xpkg.upbound.io/crossplane-contrib/provider-aws:v0.47.0"
EOF

稍等片刻,检查 Provider 的健康状态:

kubectl get providers.pkg.crossplane.io

当状态变为 HEALTHY: True 时,Provider 安装成功,它会自动添加数百个 AWS 资源的 CRD。

配置 Provider 凭据

创建一个 Kubernetes Secret 存放 AWS 的访问密钥,并配置 ProviderConfig

kubectl create secret generic aws-secret -n crossplane-system --from-file=creds=./aws-credentials.txt

ProviderConfig 示例:

apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-secret
      key: creds

应用该配置后,所有该 Provider 的托管资源默认使用此配置。

创建你的第一个云资源

让我们创建一个 Amazon S3 存储桶来体验 Crossplane 的工作流程。

直接创建托管资源

这是最底层的方式,直接使用 AWS Provider 提供的 Bucket CRD:

apiVersion: s3.aws.upbound.io/v1beta1
kind: Bucket
metadata:
  name: my-first-crossplane-bucket
spec:
  forProvider:
    region: us-east-1
  providerConfigRef:
    name: default

使用 kubectl apply -f bucket.yaml 创建。查看资源状态:

kubectl get bucket.s3.aws.upbound.io my-first-crossplane-bucket

SYNCEDREADY 列均为 True 时,表示 S3 桶已在 AWS 上成功创建。

使用 Composition 平台抽象

直接暴露底层资源对最终用户不够友好。我们来构建一个简单的平台 API:一个 MyDatabase 复合资源,它背后是一个 RDS 实例。

第一步:定义 CompositeResourceDefinition (XRD)

XRD 定义了一个新的 API 类型 MyDatabase

apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
  name: mydatabases.example.org
spec:
  group: example.org
  names:
    kind: MyDatabase
    plural: mydatabases
  claimNames:
    kind: MyDatabaseClaim
    plural: mydatabaseclaims
  versions:
  - name: v1alpha1
    served: true
    referenceable: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              region:
                type: string
              storageGB:
                type: integer
            required:
              - region
              - storageGB

第二步:编写 Composition

Composition 告诉 Crossplane 如何将 MyDatabase XR 映射到实际的 AWS RDS 实例及其所需的子网组和安全组。

apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: mydatabase.aws.example.org
spec:
  compositeTypeRef:
    apiVersion: example.org/v1alpha1
    kind: MyDatabase
  resources:
    - name: dbinstance
      base:
        apiVersion: rds.aws.upbound.io/v1beta1
        kind: Instance
        spec:
          forProvider:
            region: us-east-1
            allocatedStorage: 20
            engine: postgres
            engineVersion: "15.4"
            instanceClass: db.t3.micro
            masterUsername: adminuser
            skipFinalSnapshotBeforeDeletion: true
      patches:
        - type: FromCompositeFieldPath
          fromFieldPath: spec.region
          toFieldPath: spec.forProvider.region
        - type: FromCompositeFieldPath
          fromFieldPath: spec.storageGB
          toFieldPath: spec.forProvider.allocatedStorage

上面的 Composition 使用 patches 将 XR 的 regionstorageGB 字段传递给 RDS 实例。

第三步:用户使用 Claim

现在,你的开发人员无需接触任何云细节,只需创建一个 MyDatabaseClaim

apiVersion: example.org/v1alpha1
kind: MyDatabaseClaim
metadata:
  name: my-prod-db
spec:
  region: us-east-1
  storageGB: 50

Claim 会触发 Crossplane 创建对应的复合资源,进而根据 Composition 生成 AWS RDS 实例。使用 kubectl get mydatabaseclaim 查看状态。

多集群与多云管理

Crossplane 的架构自然支持跨集群和多云场景:

  • 跨云组合:一个 Composition 中可以包含来自不同 Provider 的资源。例如,你可以创建一个 XR 同时包含 AWS S3 和 Azure CosmosDB,实现多云数据管道。
  • Provider 家族:除了官方 Provider,社区提供了 provider-helm 让你能将 Helm Chart 作为托管资源释放到远端集群,实现基础设施与应用的统一编排。
  • 控制平面集群模式:你可以将 Crossplane 部署在一个独立的“管理集群”上,然后通过 Provider 配置管理多个目标云账号甚至多个 Kubernetes 集群,形成中心化的基础设施即代码控制面板。

最佳实践与进阶技巧

1. 使用 Packages 构建可复用的平台组件

将 Composition 和 XRD 打包成 .xpkg 文件,上传到 OCI 注册表(如 Docker Hub),其他团队可以通过 Configuration 资源一键安装你的平台 API。

2. 安全地管理连接信息

Crossplane 支持将资源生成的连接细节(如数据库地址、密码)写入 Kubernetes Secret。你可以在 Composition 中使用 writeConnectionSecretToRef 自动输出连接信息。

3. 结合 GitOps 工作流

Crossplane 的声明式本质使其能够与 ArgoCD 或 Flux 完美集成。将 XR 和 Composition 定义存储在 Git 仓库中,由 GitOps 工具同步,实现基础设施的持续交付。

4. 即时测试 Provider 资源

使用 kubectl explain 命令快速查看某个 CRD 的字段说明,例如 kubectl explain bucket.s3.aws.upbound.io.spec.forProvider,无需翻阅云厂商文档。

故障排查

  • Provider 安装失败:检查 Provider 包名和版本是否正确,确保网络可以访问 xpkg.upbound.io
  • 托管资源长时间不同步:执行 kubectl describe <resource> 查看 Events,通常是凭据问题或云 API 权限不足。
  • Composition 不生效:确认 XRD 和 Composition 的 apiVersionkind 匹配,且 XR 中有正确的 compositionRef 或 Crossplane 能自动匹配标签。

总结

Crossplane 将 Kubernetes 的声明式管理和控制循环思想带入了基础设施领域,让你以统一的方式管控多云资源。通过 Provider、托管资源和 Composition 三个抽象层,它既能满足基础设施团队的精细控制需求,也能为应用团队提供简洁的自我服务能力。现在你可以在单一集群中实践多云、多环境的统一编排,彻底告别云平台锁定的恐惧。