基础设施即代码:Terraform 与 Crossplane 实践
背景与问题界定 某多云团队的"基础设施仓库"维护着 20 多个 Terraform 模块,覆盖 AWS、阿里云和自建 OpenStack 三个环境。随着服务数量增长到 200+个,Terraform 的状态管理(State)变得极其脆弱——一次错误的 terraform apply 导致跨环境的 S3 Bucket 被意外删除,依赖它的 Redis 集群配置丢失,恢复花了两天时间。更痛苦的是 Terraform 与 Kubernetes 之间的"地幔鸿沟":Terraform 创建 VPC 和 EKS 集群,Kubernetes 上部署应用,但两个世界之间的状态无法互通——Kubernetes 不知道它用了哪些 AWS 资源,Terraform 也感知不到集群内的变化。Crossplane 从 2023 年开始提出了一种新的范式:用 Kubernetes 的 CRD 和控制器模式来管理"任何云资源",让基础设施声明式地成为集群的一部分。 目标拆解与工程约束 状态管理的可靠性:基础设施的状态必须从"单点文件锁"(Terraform State + DynamoDB Lock)演进为"面向控制器的最终一致性"——不需要 state lock、terraform refresh 等手工操作,状态通过 CRD 的 status 自动持久化到 etcd。 平台一致性 API:开发团队不关心底层是 AWS 还是阿里云,他们只需要声明"我需要一个 16C32G 的 PostgreSQL 实例和一个 Redis 7.0 集群",IaC 平台在背后自动映射到对应的云厂商资源。 GitOps 原生集成:基础设施的变更必须通过 Git 提交触发,由 ArgoCD 或 Flux CD 自动调谐,而不是运维人员在终端执行 terraform plan && terraform apply 的手动流程。 多云统一编排:同一套 IaC 模板必须能够适应多个云厂商的差异——比如 AWS 的 RDS 和阿里云的 RDS 参数命名不同,但对外暴露的抽象语义必须一致,实现"写一次,跑遍多云"。 方案设计 架构设计采用"分层抽象"模型。底层是 Crossplane Provider(如 provider-aws、provider-helm),中间层是 Crossplane Composite Resource(XRD),最上层是开发团队直接使用的 Claim(声明式请求): ...