Crossplane: Kubernetes 原生的基础设施即代码
Raj Kumar | 2026-09-02T01:07:28 | DevOps, Cloud
介绍 Crossplane 如何用 Kubernetes CRD 管理云资源,对比 Terraform 的差异,演示 Composition 和 XRD 的实际用法。
# Crossplane: Kubernetes 原生的基础设施即代码 ## Crossplane 是什么 Crossplane 是一个 CNCF 孵化项目,它把基础设施管理变成了 Kubernetes 资源管理。你可以用 kubectl 来创建数据库、对象存储、VPC 等云资源,就像管理 Pod 一样。 ## 与 Terraform 的对比 | 维度 | Crossplane | Terraform | |------|-----------|-----------| | 声明方式 | Kubernetes YAML | HCL | | 状态管理 | etcd(K8s 原生) | tfstate 文件 | | 漂移检测 | 持续自动(控制器循环) | 手动 plan | | 权限模型 | K8s RBAC | 自有体系 | | 组合抽象 | Composition + XRD | Module | | 适合场景 | K8s 为中心的团队 | 通用 IaC | ## 安装 ```bash # 安装 Crossplane helm repo add crossplane-stable https://charts.crossplane.io/stable helm install crossplane crossplane-stable/crossplane \ --namespace crossplane-system --create-namespace # 安装 AWS Provider kubectl apply -f - <<EOF apiVersion: pkg.crossplane.io/v1 kind: Provider metadata: name: provider-aws-s3 spec: package: xpkg.upbound.io/upbound/provider-aws-s3:v1.7.0 EOF ``` ## 配置云凭证 ```yaml apiVersion: v1 kind: Secret metadata: name: aws-secret namespace: crossplane-system type: Opaque stringData: creds: | [default] aws_access_key_id = AKIAXXXXXXXXXX aws_secret_access_key = xxxxxxxxxxxxx --- apiVersion: aws.upbound.io/v1beta1 kind: ProviderConfig metadata: name: default spec: credentials: source: Secret secretRef: namespace: crossplane-system name: aws-secret key: creds ``` ## 创建云资源 创建一个 S3 Bucket: ```yaml apiVersion: s3.aws.upbound.io/v1beta2 kind: Bucket metadata: name: my-app-data spec: forProvider: region: ap-southeast-1 tags: Environment: production Team: backend providerConfigRef: name: default ``` ```bash kubectl apply -f bucket.yaml kubectl get bucket my-app-data # NAME READY SYNCED EXTERNAL-NAME AGE # my-app-data True True my-app-data 2m ``` ## Composition: 组合多个资源 这是 Crossplane 最强大的特性 — 将多个底层资源组合成一个高层抽象: ```yaml # 定义自定义资源类型 (XRD) apiVersion: apiextensions.crossplane.io/v1 kind: CompositeResourceDefinition metadata: name: xdatabases.infra.example.com spec: group: infra.example.com names: kind: XDatabase plural: xdatabases versions: - name: v1alpha1 served: true referenceable: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: size: type: string enum: [small, medium, large] engine: type: string enum: [mysql, postgresql] required: [size, engine] claimNames: kind: Database plural: databases --- # 定义组合规则 apiVersion: apiextensions.crossplane.io/v1 kind: Composition metadata: name: database-aws labels: provider: aws spec: compositeTypeRef: apiVersion: infra.example.com/v1alpha1 kind: XDatabase resources: - name: rds-instance base: apiVersion: rds.aws.upbound.io/v1beta2 kind: Instance spec: forProvider: region: ap-southeast-1 engine: mysql engineVersion: "8.0" instanceClass: db.t3.micro allocatedStorage: 20 skipFinalSnapshot: true patches: - fromFieldPath: spec.engine toFieldPath: spec.forProvider.engine - fromFieldPath: spec.size toFieldPath: spec.forProvider.instanceClass transforms: - type: map map: small: db.t3.micro medium: db.t3.medium large: db.t3.large - name: security-group base: apiVersion: ec2.aws.upbound.io/v1beta1 kind: SecurityGroup spec: forProvider: region: ap-southeast-1 description: Database access ``` 开发者使用时只需: ```yaml apiVersion: infra.example.com/v1alpha1 kind: Database metadata: name: orders-db namespace: production spec: size: medium engine: postgresql ``` ## 自愈能力 Crossplane 控制器持续监控资源状态。如果有人手动在 AWS 控制台修改了配置,Crossplane 会自动检测漂移并修复: ```bash # 查看同步状态 kubectl describe bucket my-app-data # Events: # Type Reason Message # Normal CreatedExternalResource Successfully requested creation # Normal LateInitialized Late-initialized composite resource # Normal ReconciliationSuccess Reconciliation succeeded ``` ## 最佳实践 1. **用 Composition 封装复杂度**,对开发者暴露简单的 Claim 接口 2. **分层管理**:平台团队管理 Composition,开发团队只写 Claim 3. **用 EnvironmentConfig 管理环境差异**(dev/staging/prod) 4. **配合 ArgoCD** 实现 GitOps 方式管理基础设施 ## 总结 Crossplane 将基础设施管理统一到 Kubernetes 的声明式模型中。对于已经重度使用 Kubernetes 的团队,它消除了 Terraform 的额外工具链开销,让基础设施和应用配置在同一个 API 体系下管理。