Crossplane:Kubernetes 上的多云控制平面
什么是 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-aws、provider-gcp、provider-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
你应该看到 crossplane 和 crossplane-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
当 SYNCED 和 READY 列均为 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 的 region 和 storageGB 字段传递给 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 的
apiVersion与kind匹配,且 XR 中有正确的compositionRef或 Crossplane 能自动匹配标签。
总结
Crossplane 将 Kubernetes 的声明式管理和控制循环思想带入了基础设施领域,让你以统一的方式管控多云资源。通过 Provider、托管资源和 Composition 三个抽象层,它既能满足基础设施团队的精细控制需求,也能为应用团队提供简洁的自我服务能力。现在你可以在单一集群中实践多云、多环境的统一编排,彻底告别云平台锁定的恐惧。