Skip to content

Commit c8a3a00

Browse files
committed
add new post 'Infrastructure as Data 初探:Terraform 与 Crossplane'
1 parent 4a2286a commit c8a3a00

1 file changed

Lines changed: 109 additions & 0 deletions

File tree

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
---
2+
title: Infrastructure as Data 初探:Terraform 与 Crossplane
3+
date: 2026-09-09 17:31:23
4+
cover_image:
5+
cover_image_alt:
6+
thumbnail:
7+
tags:
8+
- Terraform
9+
- Crossplane
10+
- IaC
11+
categories:
12+
- Code
13+
---
14+
15+
# 1. 从 Infrastructure as Code 到 Infrastructure as Data
16+
17+
过去十年,我们习惯了用「代码」来描述基础设施——Infrastructure as Code(IaC)。
18+
你写一段声明式配置,工具帮你把云上的资源拉成你描述的样子。但当团队和资源规模变大后,
19+
一个更进一步的理念开始流行:**Infrastructure as Data(IaD,基础设施即数据)**。
20+
21+
两者的区别,一句话概括:
22+
23+
- **IaC**:基础设施的期望状态写在「配置文件/代码」里,由一个外部工具(如 Terraform)读取并执行。
24+
- **IaD**:基础设施的期望状态本身就是一份「数据」,存在于一个持续运行的控制平面里,
25+
由控制器不断地把现实「调谐(reconcile)」到这份数据描述的状态。
26+
27+
关键差异在于「谁来持续保证状态」。IaC 通常是「你跑一次命令,它对齐一次」;
28+
IaD 则是「一个控制器永远盯着,一旦漂移就自动拉回」。
29+
30+
# 2. Terraform:IaC 的代表
31+
32+
Terraform 是目前最主流的 IaC 工具,用自己的声明式语言 HCL 描述资源:
33+
34+
```hcl
35+
resource "aws_s3_bucket" "blog" {
36+
bucket = "lightedcode-blog-assets"
37+
tags = {
38+
Project = "blog"
39+
}
40+
}
41+
```
42+
43+
它的工作模型很直观:
44+
45+
1. 你写 `.tf` 文件,描述期望状态。
46+
2. `terraform plan` 对比「期望状态」和「当前状态」(记录在 state 文件里),算出差异。
47+
3. `terraform apply` 执行差异,把云资源变成你要的样子。
48+
49+
**优点**:生态成熟、provider 覆盖几乎所有云、心智模型简单。
50+
51+
**痛点**:
52+
53+
- **state 文件**是核心也是负担——它记录了 Terraform 眼中的世界,一旦和现实不一致(比如有人手动改了云控制台),就会漂移。
54+
- 它是「一次性」的:你不 `apply`,它就不会主动纠正漂移。
55+
- 大团队协作时,state 锁、模块拆分、CI 编排都会变复杂。
56+
57+
# 3. Crossplane:把基础设施变成 Kubernetes 里的数据
58+
59+
Crossplane 换了个思路:**把云资源变成 Kubernetes 的自定义资源(CRD)**,
60+
让 Kubernetes 的控制器循环来持续管理它们。
61+
62+
同样是建一个 S3 桶,在 Crossplane 里长这样:
63+
64+
```yaml
65+
apiVersion: s3.aws.crossplane.io/v1beta1
66+
kind: Bucket
67+
metadata:
68+
name: lightedcode-blog-assets
69+
spec:
70+
forProvider:
71+
region: ap-east-1
72+
providerConfigRef:
73+
name: aws-provider
74+
```
75+
76+
你把这段 YAML `kubectl apply` 到集群里,它就成了集群里的一条「数据」。
77+
之后 Crossplane 的控制器会**持续地**保证这个桶存在、且配置符合描述——
78+
这就是 IaD 的精髓:**期望状态是集群里的数据,调谐是持续进行的**。
79+
80+
这带来几个 Terraform 不具备的特性:
81+
82+
- **持续调谐**:有人手动删了桶,控制器会自动把它建回来,无需你重新 `apply`。
83+
- **无独立 state 文件**:期望状态和实际状态都由 Kubernetes API + 控制器管理,不再有单独的 state 要维护。
84+
- **可组合与抽象**:通过 Composition,平台团队可以把「一个数据库 + 一个桶 + 一套网络」打包成一个高层抽象(XRD),
85+
暴露给业务团队一个简单接口,隐藏底层细节。
86+
87+
# 4. 该怎么选
88+
89+
它们并不是非此即彼,很多团队会混用。给一个粗略的判断:
90+
91+
| 维度 | Terraform | Crossplane |
92+
|---|---|---|
93+
| 心智模型 | 命令行「一次性对齐」 | 控制器「持续调谐」 |
94+
| 状态管理 | 独立 state 文件 | Kubernetes API,无独立 state |
95+
| 漂移处理 | 需重新 apply | 自动纠正 |
96+
| 前置成本 | 低,装个 CLI 即可 | 高,需要一个 Kubernetes 集群 |
97+
| 适合场景 | 中小团队、一次性供给、混合环境 | 平台工程、大规模自服务、已重度使用 K8s |
98+
99+
- 如果你只是想快速、可复现地供给一批云资源,又没有现成的 Kubernetes 平台,**Terraform 依然是最省事的选择**。
100+
- 如果你在做**平台工程(Platform Engineering)**,想给业务团队提供「自助申请基础设施」的能力,
101+
且已经全面拥抱 Kubernetes,**Crossplane 的 IaD 模型会更契合**。
102+
103+
# 5. 小结
104+
105+
Infrastructure as Data 不是要取代 Infrastructure as Code,而是把「声明式」推得更彻底:
106+
从「声明一份配置,然后跑工具去对齐」,进化到「声明的数据本身就活在一个持续调谐的控制平面里」。
107+
108+
Terraform 教会我们用代码描述基础设施;Crossplane 则让这份描述变成系统里持续生效的数据。
109+
理解这层区别,比记住某个工具的语法更重要。

0 commit comments

Comments
 (0)