CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

IaC 与 GitOps:Terraform、Pulumi、Argo CD 与 drift 检测

分类:工程技术 · 路径:docs/topics/iac-and-gitops/README.md

#iac#terraform#pulumi#argocd#gitops

从 Terraform / Pulumi / Ansible 的 IaC 基础,到 Argo CD / Flux 的 GitOps、drift 检测与多环境多云落地。

父主题

CI/CD 与发布:从流水线到灰度与回滚

子主题(0)

IaC 与 GitOps:Terraform、Pulumi、Argo CD 与 drift 检测

0. 元信息

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. 九阶段表

阶段核心知识实践产出可观察学会标准
1HCL、provider、resource、output、variable一份最小 main.tf 创建 S3 bucketterraform apply 跑通,state list 可见
2state、remote backend、lock、import、moved blocks3 + DynamoDB lock backend并发 plan 不会损坏 state
3module、registry、版本、source、ref一个 vpc module + 应用 module拆 module 后 plan 输出稳定
4Pulumi 概念:stack、config、output、TS/Go/Python一份 Pulumi TypeScript 程序pulumi up 创建资源,stack 区分 env
5Ansible:playbook、inventory、role、module配置 5 台 VM 时间同步ansible-playbook 幂等执行
6GitOps:声明式期望状态、controller 收敛、drift一份 Argo CD Applicationargocd app diff 检测 drift
7Argo CD:AppProject、Sync Policy、Self-Heal、Prune三环境 dev/stage/prod Application改 Git 自动 sync,手动 kubectl edit 被 self-heal
8Flux:GitRepository、Kustomization、HelmRelease、NotificationFlux kustomize + helm 部署flux get kustomizations 健康
9ApplicationSet、cluster generator、PR generator多集群 GitOps demo100 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 项)

  1. 用 HCL 写 Terraform module、按业务边界拆(不按资源类型),配 s3 + DynamoDB remote backend lock,能解释为什么 state 禁入 Git、为什么 ~> 5.0 锁 provider major、为什么 moved block 优于 import、为什么 Pulumi 用通用语言写 stack 区分环境;
  2. 写 ArgoCD Application(destination.namespacesyncPolicy.automated.prune=trueselfHeal=true)与 AppProject(管多 Application 的 RBAC),能解释期望状态 vs 实际的差异、argocd app diff 检测 drift、kubectl edit 被 Self-Heal 覆盖;
  3. 配 Flux GitRepository + Kustomization + HelmRelease 串联 Helm chart 与 Kustomize overlay,能解释 GitRepository → Kustomization → HelmRelease 依赖链、flux get kustomizations 健康判定、为什么 ApplicationSet generator 能 100 集群自动生成 Application。

交付物(4 项)

  1. Terraform module(vpc / 应用各一)+ remote state backend(S3 + DynamoDB lock)+ terraform plan 输出稳定;
  2. ArgoCD Application manifest(dev/stage/prod 三环境)+ Self-Heal 配置 + drift 演练记录(手动改集群后 argocd app diff 检测 → Self-Heal 收敛);
  3. Flux GitRepository + Kustomization + HelmRelease YAML,flux get kustomizations / flux get helmreleases 健康;
  4. ApplicationSet(cluster generator 跨多集群)+ PR generator + cluster secret 清单,100 cluster 自动生成 Application。

指标(3 项)

  1. drift 检测到收敛时长 ≤ 5 分钟(argocd app diff + Self-Heal);
  2. state lock 冲突率 = 0(并发 plan 不损坏 state,CI 串行 + lock table 监控);
  3. 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 v6provider 通信协议
GitOps Working GroupCNCF TAG App Delivery 文档
Argo CD Application CRDApplication / AppProject schema
Flux GitOps ToolkitSource / Kustomize / Helm / Notification
HashiCorp Configuration Language (HCL) specHCL 语法

9.3.2 书

资料用法
Brikman, Terraform: Up & Running(3rd ed., 2022)主线
Burns, Designing Distributed SystemsIaC 与分布式系统模式
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 HightowerKubernetes / GitOps 布道
Yevgeniy BrikmanTerraform: Up & Running
Joe Beda(Heptio / VMware)Kubernetes、GitOps 实践
Kelsey Evans(FluxCD)Flux 维护者
Mitchel HashimotoTerraform 创始人

9.3.5 方法

方法动作
State as artifactstate 必须 remote + lock,禁入 Git
Module by domainmodule 按业务边界拆,不按资源类型
Pin providerprovider 版本锁到 ~>,避免 major 升级爆炸
Drift detectionCI 跑 terraform planargocd app diff
Self-healArgo CD Sync Policy 配 automated.prune=true, selfHeal=true
Multi-env via directoryenvs/dev envs/stage envs/prod 不同 backend
ApplicationSet多集群用 generator,避免手工写 N 个 Application
Audit logk8s audit log + Argo CD audit + Terraform Cloud audit

9.4 经典问题与经典案例

#问题最简答案
1state 损坏 / 并发 plan配 remote backend + DynamoDB lock
2provider 版本漂移~> 5.0,CI 检查
3module 升级破坏version 字段固定,CHANGELOG 看 breaking
4drift 后 argocd sync 失败看 OutOfSync 状态、diff 输出、sync wave
5Self-Heal 把人改动覆盖了配 notification + audit,先知会后 heal
6ApplicationSet 跨集群cluster generator + cluster secret
7Pulumi stack 误删state backend 用 S3 + 版本化
8Ansible playbook 不幂等用 module 而非 raw command
9Terraform import 难写moved block 重构而非 import
10GitOps 多人冲突强制 PR review + branch protection
11云资源敏感数据secret 进 Vault / AWS Secrets Manager,TFN 用 data source
12Argo CD 删 Application 把 k8s 资源一起删deletionPolicyprune=false

9.5 学习难点

概念难点

难点为什么会卡突破路径
期望 vs 实际写完代码≠已生效controller 视角 + drift
state vs sourcestate 是当前实际,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

名称发布组织角色状态 / 可访问性
TerraformHashiCorpIaCMPL-2.0,活跃
OpenTofuLinux FoundationTerraform forkMPL-2.0,活跃
PulumiPulumiIaC(通用语言)Apache-2.0,活跃
Ansible CoreRed Hat配置管理GPL-3.0,活跃
CrossplaneCNCFk8s-native IaCApache-2.0,活跃
Argo CDCNCFGitOps controllerApache-2.0,活跃
Flux CDCNCF / WeaveworksGitOps controllerApache-2.0,活跃
HelmCNCFk8s 包管理Apache-2.0,活跃
KustomizeKubernetes SIGk8s 配置工具Apache-2.0,活跃
Hashicorp VaultHashiCorpsecret 管理BUSL,活跃
External Secrets OperatorCNCFsecret 同步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

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言;2. 数据结构与算法;3. 计算机基础;4. 工程技术;5. Web 与后端;6. 前端与客户端;7. 数据与人工智能;8. 项目与职业能力;9. 安全与可靠性。

本计划归属:工程技术 主 + 安全与可靠性 辅。

直接依赖(1)

查看知识图谱