Crossplane 实战:用 Kubernetes 声明式管理云基础设施

当你在多个云厂商之间反复粘贴 Terraform 脚本、为开通一个数据库工单等上三天时,Crossplane 提供了一种更贴近云原生团队习惯的思路:用 Kubernetes 声明式 API 来管理底层 云基础设施。它把 AWS、GCP、阿里云的资源抽象成 CRD,让“开通一个 RDS”和“创建一个 Pod”走同一套 GitOps 流程。本文从概念到落地,带你跑通一条可复用的基础设施自助开通链路。

一、Crossplane 是什么

Crossplane 是一个运行在 Kubernetes 里的开源控制平面,核心使命是“用 K8s 的方式管云”。它本身不替代云厂商控制台,而是在集群内安装一个个 Provider(供应商控制器),由这些控制器把你在 YAML 里声明的资源,翻译成对应云厂商的 API 调用。最终效果:基础设施和应用都变成集群里的“一等公民”,统一由 kubectl、Argo CD、Helm 来管理。

和传统的 IaC 工具相比,Crossplane 最大的差异是“状态自愈”——它持续 reconcile,云上资源被误删或漂移,控制器会自动把状态拉回你声明的样子,这一点在 Terraform 的 apply-once 模型里很难天然获得。

设想一个典型痛点:运维在控制台手动改了一个安全组规则,三个月后没人记得这处“漂移”,直到一次故障才暴露。Crossplane 把资源定义固化在 Git 里,任何偏离声明的变更都会被控制器持续纠正,相当于给云资源装上了“期望状态守护进程”。对已经用 Kubernetes 管理应用的团队来说,这几乎零额外认知成本。

二、Crossplane vs Terraform:不是替代,是补充

很多团队担心“又要学一个工具”。其实二者定位不同:Terraform 擅长一次性、过程式的资源编排;Crossplane 擅长把资源长期托管在集群里、并向上层提供自助服务。实践中两者常共存——用 Terraform 把 Crossplane 的托管集群先铺好,再让业务团队在集群内用 Crossplane 自助开通。下面这张对照表能帮你快速判断该用哪个:

维度TerraformCrossplane
执行模型命令式 apply(一次性)声明式 reconcile(持续生效)
状态存放本地/远端 state 文件etcd 内 CR 状态
自助服务需封装模块+CI原生 CRD + Composition
漂移修复靠 plan 人工发现控制器自动拉回
学习曲线HCL 语法独立复用 K8s YAML 习惯

三、核心概念速览

动手前先记住四个关键词:Provider(云厂商适配器)、Managed Resource(MR)(云资源映射,如一个 S3 Bucket)、Composition(把多个 MR 组合成一个“套餐”)、Claim(业务方提交的自助申请)。Provider 决定“能管什么云”,Composition 决定“给业务方多简单的入口”,Claim 则是业务方唯一需要关心的 YAML。

四、动手:从零装好 Crossplane

Crossplane 官方提供 Helm Chart,三行命令即可在现有 K8s 集群里跑起来。若你还没有可用的集群,可以先参考 Kubernetes Pod/Deployment/Service 入门 把基础环境搭好。

# 添加官方仓库
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update

# 安装 Crossplane 到独立命名空间
helm install crossplane \
  crossplane-stable/crossplane \
  --namespace crossplane-system \
  --create-namespace

# 确认控制器就绪
kubectl get pods -n crossplane-system

五、配置云厂商凭证与 Provider

以 AWS 为例,先把访问密钥写进 Secret,再用 ProviderConfig 绑定给 Provider。Provider 安装后会在集群里注册一批新 CRD(如 bucket.s3.aws.upbound.io),之后你就能像写 Deployment 一样写云资源。

# 1. 写入云厂商凭证
kubectl create secret generic aws-creds \
  -n crossplane-system \
  --from-file=credentials=/path/to/aws-key.json

# 2. 安装 provider(用 upbound 官方家族)
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.0.0
EOF

# 3. 绑定凭证
kubectl apply -f - <<EOF
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds
      key: credentials
EOF

六、用 Composition 封装“数据库即服务”

直接让业务方写底层 MR 既危险又啰嗦。更好的做法是定义一个 CompositeResourceDefinition(XR),再用 Composition 把“一个带备份策略的 RDS 套餐”打包好。业务方最终只提交一个极简的 Claim,背后的实例、子网、备份全部由 Crossplane 自动拼装。

# 定义组合资源 XR
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
  name: xdatabases.example.org
spec:
  group: example.org
  names:
    kind: XDatabase
    plural: xdatabases
  claimNames:
    kind: Database
    plural: databases
  versions:
    - name: v1alpha1
      served: true
      referenceable: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                size:
                  type: string
                  default: "small"

上面的 XR 暴露了一个 size 参数,Composition 根据它选择不同的云资源规格。这种“上层简单、底层灵活”的封装,正是 Crossplane 区别于裸 Terraform 的核心价值。

七、提交 Claim 完成自助开通

业务方完全不需要知道背后是 AWS 还是阿里云,只需要提交一个 Claim。配合 GitHub Actions 流水线,这个 YAML 可以直接进 Git 仓库走 PR 评审,再由 Argo CD 同步到集群——一条标准的 GitOps 基础设施交付链路就串起来了。

# 业务方只需关心这一个极简对象
apiVersion: example.org/v1alpha1
kind: Database
metadata:
  name: orders-db
spec:
  size: small
  compositionRef:
    name: rds-with-backup
---
# 查看开通进度
kubectl get database.orders-db -o wide
kubectl get managed  # 观察底层 MR 是否 Ready

当 STATUS 变为 READY,云上的数据库实例就已经按套餐创建完成,连接信息会写回 Claim 的 status 字段,应用直接读取即可,无需任何人工介入。

八、生产落地清单

把 Crossplane 引入生产前,建议逐项核对下面这份清单,避免“能跑起来”和“敢用”之间出现落差:

检查项要点
Provider 版本锁定固定 xpkg 版本,避免自动升级击穿兼容
凭证最小化用子账号/角色限定 Provider 仅能操作所需资源
Composition 评审套餐变更走 Git PR,禁止随意改 XR schema
删除保护对关键 MR 加 finalizer 与 deletionPolicy 防误删
状态可观测把 Crossplane 指标接入 集群监控体系
灾备演练定期演练 etcd 备份恢复(参考 K8s 准入控制 加固边界)

九、接入 GitOps:让基础设施变更可评审

Crossplane 的 YAML 天然适合放进 Git 仓库。配合 Argo CD 这类 GitOps 工具,所有基础设施变更都走 Pull Request:评审通过才同步到集群,谁在什么时候改了什么,Git 历史一目了然。这比在云控制台点来点去、事后凭记忆复盘要可靠得多,也天然满足了合规审计对“变更可追溯”的要求。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: crossplane-infra
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/infra.git
    path: clusters/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: crossplane-system
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

上面这份 Application 把整个基础设施目录纳入自动同步并开启 selfHeal——这正是 Crossplane 声明式理念的延伸:不仅云资源会自愈,连“集群应该有哪些资源”本身也会被持续拉回期望状态。把 集群备份 与 Argo CD 的 Git 仓库一并纳入灾备,整条链路就具备了可恢复性。

十、小结

Crossplane 把“基础设施即代码”升级成了“基础设施即 Kubernetes 对象”:统一的控制平面、持续的漂移自愈、面向业务的自助 Claim,以及可评审的 GitOps 交付,让它特别适合已经深度使用 K8s 的团队。如果你正在用 Docker 和 Kubernetes 构建交付体系,又苦于多云资源散落、工单流转缓慢,Crossplane 值得作为下一块拼图纳入技术栈。下一步可以从一个非核心的存储桶或测试库试点,跑通后再逐步把数据库、网络纳入托管,循序渐进地收获声明式基础设施的红利。

上一篇 Falco 实战:Kubernetes 运行时入侵检测与告警
下一篇 系统化调试思维:从 print 到有序定位 Bug
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]