IaC 与 GitOps:Terraform、Pulumi、Argo CD 与 drift 检测
0. 元信息
- 主题路径:
docs/topics/ci-cd-and-release/subtopics/iac-and-gitops/README.md - 主分类:工程技术
- 辅助分类:安全与可靠性
- 适合对象:已经能跑通 CI + canary,想把云资源与集群期望状态纳入版本控制的开发者
- 建议周期:5~8 天,每天 1.5~2 小时
- 前置知识:release-strategies-and-rollout
- 最终目标:能用 Terraform/Pulumi 管云资源,用 Argo CD/Flux 管集群期望状态,配 drift 检测与多环境/多云
1. 学习路线
Terraform 基础:HCL、provider、state、module
→ remote state + lock(s3 + DynamoDB / Terraform Cloud)
→ Pulumi:用通用语言写 IaC
→ Ansible:配置管理与轻量 provisioner
→ GitOps 理念:声明式期望状态、controller 收敛
→ Argo CD:Application、AppProject、Sync、Drift
→ Flux:GitRepository、Kustomize、HelmRelease
→ 多环境/多集群:ApplicationSet、cluster generator
2. 阶段周数分配
精简子主题不固定周数。按概念、正常路径、失败路径、综合实验四段推进,共 5~8 天。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1 | HCL、provider、resource、output、variable | 一份最小 main.tf 创建 S3 bucket | terraform apply 跑通,state list 可见 |
| 2 | state、remote backend、lock、import、moved block | s3 + DynamoDB lock backend | 并发 plan 不会损坏 state |
| 3 | module、registry、版本、source、ref | 一个 vpc module + 应用 module | 拆 module 后 plan 输出稳定 |
| 4 | Pulumi 概念:stack、config、output、TS/Go/Python | 一份 Pulumi TypeScript 程序 | pulumi up 创建资源,stack 区分 env |
| 5 | Ansible:playbook、inventory、role、module | 配置 5 台 VM 时间同步 | ansible-playbook 幂等执行 |
| 6 | GitOps:声明式期望状态、controller 收敛、drift | 一份 Argo CD Application | argocd app diff 检测 drift |
| 7 | Argo CD:AppProject、Sync Policy、Self-Heal、Prune | 三环境 dev/stage/prod Application | 改 Git 自动 sync,手动 kubectl edit 被 self-heal |
| 8 | Flux:GitRepository、Kustomization、HelmRelease、Notification | Flux kustomize + helm 部署 | flux get kustomizations 健康 |
| 9 | ApplicationSet、cluster generator、PR generator | 多集群 GitOps demo | 100 cluster 自动生成 Application |
4. 第一周任务
精简子主题省略逐日表。每天只引入一个变量;先跑正常路径,再做四类失败实验。Day 1 必须明确 state 后端与 lock 机制。
5. 阶段通用验收
采用父主题 §5;本页额外要求保存 HCL、Argo CD manifest、drift 报告、清理命令与回滚路径。
6. 最终验收
完成 1 份 Terraform module(带 remote state + lock)、1 段 Argo CD Application(带 Self-Heal)、1 个 Flux GitRepository、至少 4 类失败实验(drift、state 损坏、lock 死锁、provider 版本漂移),并用 10 分钟解释期望状态与收敛。
7. 综合项目
把本页产出合入父主题首选项目:GitHub Actions → GHCR → k8s Argo Rollouts 金丝雀发布全链路。单独交付时,提供 Terraform repo、Argo CD repo、ApplicationSet、drift 演练记录、notes/retrospective.md。
本主题贡献
本主题把云资源与集群期望状态纳入 Git:Terraform / Pulumi IaC 描述期望、remote state + lock 防并发、ArgoCD / Flux GitOps controller 持续收敛、Helm chart 与 Kustomize overlay 模板化、drift 检测到 Self-Heal 自动化。
职责(3 项)
- 用 HCL 写 Terraform module、按业务边界拆(不按资源类型),配 s3 + DynamoDB remote backend lock,能解释为什么 state 禁入 Git、为什么
~> 5.0锁 provider major、为什么movedblock 优于import、为什么 Pulumi 用通用语言写 stack 区分环境; - 写 ArgoCD Application(
destination.namespace、syncPolicy.automated.prune=true、selfHeal=true)与 AppProject(管多 Application 的 RBAC),能解释期望状态 vs 实际的差异、argocd app diff检测 drift、kubectl edit被 Self-Heal 覆盖; - 配 Flux GitRepository + Kustomization + HelmRelease 串联 Helm chart 与 Kustomize overlay,能解释 GitRepository → Kustomization → HelmRelease 依赖链、
flux get kustomizations健康判定、为什么 ApplicationSet generator 能 100 集群自动生成 Application。
交付物(4 项)
- Terraform module(vpc / 应用各一)+ remote state backend(S3 + DynamoDB lock)+
terraform plan输出稳定; - ArgoCD Application manifest(dev/stage/prod 三环境)+ Self-Heal 配置 + drift 演练记录(手动改集群后
argocd app diff检测 → Self-Heal 收敛); - Flux GitRepository + Kustomization + HelmRelease YAML,
flux get kustomizations/flux get helmreleases健康; - ApplicationSet(cluster generator 跨多集群)+ PR generator + cluster secret 清单,100 cluster 自动生成 Application。
指标(3 项)
- drift 检测到收敛时长 ≤ 5 分钟(
argocd app diff+ Self-Heal); - state lock 冲突率 = 0(并发 plan 不损坏 state,CI 串行 + lock table 监控);
- Self-Heal 覆盖率 ≥ 99%(手动 kubectl edit / console 改动被 controller 收敛)。
8. 推荐开源资料
Terraform(HashiCorp,MPL-2.0)作主线;Pulumi(Apache-2.0)作通用语言对照;OpenTofu(Linux Foundation,MPL-2.0)作 Terraform fork;Argo CD(CNCF,Apache-2.0)作 GitOps controller;Flux CD(CNCF,Apache-2.0)作对照;Ansible Core(GPL-3.0)作配置管理;Crossplane(Apache-2.0)作 k8s-native IaC。复制前核对当前 LICENSE。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
IaC 把云资源变成可版本化、可复现、可审计的代码。Terraform 用 HCL 描述期望状态;Pulumi 用通用语言;Ansible 用 YAML 描述 task。GitOps 把同样的理念搬到 Kubernetes:期望状态在 Git,controller 持续收敛。
Argo CD 与 Flux 是事实上的 GitOps controller 标准。Weaveworks 的 Alexis Richardson 在 2017 年提出 GitOps 一词。Kubernetes 生态让 GitOps 成为可能:声明式 API + controller pattern + CRD。
这一节要解决一个具体问题:怎么把「人改 kubectl」、「人登 console」、「脚本乱改」变成「Git 是 single source of truth,controller 自动收敛」。答案靠 IaC + GitOps + drift 检测 + audit log。
9.2 概念地图
flowchart LR
HCL[HCL / Terraform] --> State[remote state + lock]
Pulumi[Pulumi TS/Go/Py] --> State
Ansible[YAML / Ansible] --> State
State --> Cloud[cloud resources]
Git[Git repo] --> Controller[Argo CD / Flux]
Controller --> K8s[cluster actual state]
Controller -.drift.-> Diff[argocd app diff / flux detect]
Diff --> Sync[re-sync / self-heal]
Sync --> K8s
Audit[audit log] -.反馈.-> Git
核心关系:声明式期望状态在 Git;controller 持续比较期望与实际;diff 触发 sync;IaC 管云资源;audit log 反馈到 Git。
9.3 基础知识讲解
9.3.1 论文 / 规范
| 资料 | 用法 |
|---|---|
| Open Application Model (OAM) | 对照 KubeVela / Crossplane |
| Terraform Protocol v6 | provider 通信协议 |
| GitOps Working Group | CNCF TAG App Delivery 文档 |
| Argo CD Application CRD | Application / AppProject schema |
| Flux GitOps Toolkit | Source / Kustomize / Helm / Notification |
| HashiCorp Configuration Language (HCL) spec | HCL 语法 |
9.3.2 书
| 资料 | 用法 |
|---|---|
| Brikman, Terraform: Up & Running(3rd ed., 2022) | 主线 |
| Burns, Designing Distributed Systems | IaC 与分布式系统模式 |
| Ford, Building Evolutionary Architectures | 适应度函数 + drift 检测 |
9.3.3 博客 / 文档
| 资料 | 用法 |
|---|---|
| Terraform 文档 | 主线 |
| Terraform Learn | 入门 |
| OpenTofu 文档 | fork 对照 |
| Pulumi 文档 | 通用语言对照 |
| Ansible 文档 | 配置管理 |
| Argo CD 文档 | 主线 |
| Flux 文档 | 主线 |
| Weaveworks GitOps 指南 | 理念入门 |
| Crossplane 文档 | k8s-native IaC 对照 |
9.3.4 人物
| 人物 | 关注点 |
|---|---|
| Alexis Richardson(Weaveworks) | GitOps 一词提出者 |
| Kelsey Hightower | Kubernetes / GitOps 布道 |
| Yevgeniy Brikman | Terraform: Up & Running |
| Joe Beda(Heptio / VMware) | Kubernetes、GitOps 实践 |
| Kelsey Evans(FluxCD) | Flux 维护者 |
| Mitchel Hashimoto | Terraform 创始人 |
9.3.5 方法
| 方法 | 动作 |
|---|---|
| State as artifact | state 必须 remote + lock,禁入 Git |
| Module by domain | module 按业务边界拆,不按资源类型 |
| Pin provider | provider 版本锁到 ~>,避免 major 升级爆炸 |
| Drift detection | CI 跑 terraform plan、argocd app diff |
| Self-heal | Argo CD Sync Policy 配 automated.prune=true, selfHeal=true |
| Multi-env via directory | envs/dev envs/stage envs/prod 不同 backend |
| ApplicationSet | 多集群用 generator,避免手工写 N 个 Application |
| Audit log | k8s audit log + Argo CD audit + Terraform Cloud audit |
9.4 经典问题与经典案例
| # | 问题 | 最简答案 |
|---|---|---|
| 1 | state 损坏 / 并发 plan | 配 remote backend + DynamoDB lock |
| 2 | provider 版本漂移 | 锁 ~> 5.0,CI 检查 |
| 3 | module 升级破坏 | 用 version 字段固定,CHANGELOG 看 breaking |
| 4 | drift 后 argocd sync 失败 | 看 OutOfSync 状态、diff 输出、sync wave |
| 5 | Self-Heal 把人改动覆盖了 | 配 notification + audit,先知会后 heal |
| 6 | ApplicationSet 跨集群 | cluster generator + cluster secret |
| 7 | Pulumi stack 误删 | state backend 用 S3 + 版本化 |
| 8 | Ansible playbook 不幂等 | 用 module 而非 raw command |
| 9 | Terraform import 难写 | 用 moved block 重构而非 import |
| 10 | GitOps 多人冲突 | 强制 PR review + branch protection |
| 11 | 云资源敏感数据 | secret 进 Vault / AWS Secrets Manager,TFN 用 data source |
| 12 | Argo CD 删 Application 把 k8s 资源一起删 | 配 deletionPolicy 或 prune=false |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 期望 vs 实际 | 写完代码≠已生效 | controller 视角 + drift |
| state vs source | state 是当前实际,code 是期望 | terraform plan 永远看实际 |
| Application vs AppProject | 单 app vs 项目边界 | AppProject 管多 Application 的 RBAC |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 多环境策略 | 一份代码多环境 | workspace / dir / cluster |
| module 边界 | 拆太细复用难,拆太粗耦合 | 按业务能力拆,不按资源类型 |
| drift 处理 | 自动 heal 还是先 review | 区分 prod 与 dev 策略 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| remote state 配错 | lock 不生效 | 配 DynamoDB table + key |
| provider 升级 | major 升级 breaking | 锁版本,分阶段升级 |
| ApplicationSet 复杂 | generator + template 难调 | 先跑通单一 generator |
| Crossplane 抽象 | composition 难写 | 先跑通 XRD,再写 composition |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 发布组织 | 角色 | 状态 / 可访问性 |
|---|---|---|---|
| Terraform | HashiCorp | IaC | MPL-2.0,活跃 |
| OpenTofu | Linux Foundation | Terraform fork | MPL-2.0,活跃 |
| Pulumi | Pulumi | IaC(通用语言) | Apache-2.0,活跃 |
| Ansible Core | Red Hat | 配置管理 | GPL-3.0,活跃 |
| Crossplane | CNCF | k8s-native IaC | Apache-2.0,活跃 |
| Argo CD | CNCF | GitOps controller | Apache-2.0,活跃 |
| Flux CD | CNCF / Weaveworks | GitOps controller | Apache-2.0,活跃 |
| Helm | CNCF | k8s 包管理 | Apache-2.0,活跃 |
| Kustomize | Kubernetes SIG | k8s 配置工具 | Apache-2.0,活跃 |
| Hashicorp Vault | HashiCorp | secret 管理 | BUSL,活跃 |
| External Secrets Operator | CNCF | secret 同步 | Apache-2.0 |
9.6.2 Scope
Terraform / Pulumi 管云资源;Ansible 管配置;Argo CD / Flux 管集群期望状态;Helm / Kustomize 管 k8s manifest;Crossplane 把云资源暴露为 k8s CRD;External Secrets 把 secret 同步进集群。
9.6.3 Structure
Terraform:HCL(resource / data / variable / output / module / provider)。Argo CD:Application、AppProject、ApplicationSet、Cluster、Repo。Flux:GitRepository、Kustomization、HelmRelease、HelmRepository、Source。Pulumi:stack、config、output、component。Ansible:playbook、inventory、role、task、handler。
9.6.4 Ecosystem
Terraform 有 registry、Terraform Cloud、Terraform Enterprise;Pulumi 有 Pulumi Cloud;Argo CD 有 ApplicationSet、Notifications、Argo Workflows;Flux 有 Flux GitOps Toolkit。Crossplane 提供 AWS / Azure / GCP provider;External Secrets 支持 Vault / AWS SM / GCP SM / Azure KV。
9.6.5 Depth Tiers
| 层级 | 可观察能力 |
|---|---|
| L0 | 知道 Terraform、Pulumi、Argo CD、Flux 是什么 |
| L1 | 能读 HCL、Application CRD、Kustomization |
| L2 | 能写 Terraform module、Argo CD Application,跑 apply / sync |
| L3 | 能从 drift diff、plan 输出、sync 状态解释失败,设计 multi-env / multi-cluster |
| L4 | 能设计 controller、custom resource、cross-cloud IaC 抽象 |
本子主题目标是 L3。
9.6.6 Source
- Terraform 文档
- Pulumi 文档
- Argo CD 文档
- Flux 文档
- Crossplane 文档
- 引用版本快照日期:2026-07-30;实作前运行
terraform version、argocd version、flux version。
10. 常见误区
- 把 state 文件 commit 进 Git;
- provider 不锁版本;
- module 边界按资源类型拆;
- 多环境共用同一 backend;
- drift 不报警,全靠人看;
- Self-Heal 全开,没人 review;
- ApplicationSet 写了但不验证 cluster secret;
- Pulumi stack 直接用 default,不区分环境;
- Ansible playbook 用 raw command,不幂等;
- Helm chart 升级失败 rollback 没验证;
- External Secrets 没配刷新间隔,secret 长期过期;
- Terraform Cloud / Spacelift audit log 没接;
- 集群 RBAC 配太宽,Argo CD 拿到 cluster-admin;
- Argo CD 删 Application 把生产资源一起删。
11. 所有知识点分类(统一规则)
- 编程语言;2. 数据结构与算法;3. 计算机基础;4. 工程技术;5. Web 与后端;6. 前端与客户端;7. 数据与人工智能;8. 项目与职业能力;9. 安全与可靠性。
本计划归属:工程技术 主 + 安全与可靠性 辅。