三工具定位与协作关系
核心问题:Ansible、Terraform、Kubernetes 都说自己是"基础设施即代码",它们之间有什么区别?什么时候用哪个?
很多工程师第一次接触 IaC 时都有同样的困惑:三个工具看起来都能"部署东西",到底有什么不同?一句话回答:
- Terraform:管"有什么"——在云上声明你需要哪些资源(服务器、网络、数据库)
- Ansible:管"装什么"——连进服务器安装软件、写配置文件、启动服务
- Kubernetes:管"跑什么"——在容器层面调度和运行你的应用,处理扩缩容、故障恢复
三工具核心定位
类比理解
| 工具 | 类比 | 解决的问题 |
|---|---|---|
| Terraform | 建筑开发商 | 买地、打地基、建楼,确定有哪些"物理资源" |
| Ansible | 装修公司 | 进入房间安装水电、铺地板、摆家具 |
| Kubernetes | 物业管理公司 | 管理楼里的住户(容器),自动处理入住离开、维修故障 |
三工具技术对比
| 维度 | Terraform | Ansible | Kubernetes |
|---|---|---|---|
| 核心概念 | 声明式资源图 | 幂等任务列表 | 控制循环(Reconcile) |
| 管理对象 | 云资源(IaaS 层) | 操作系统 + 应用软件 | 容器化应用 |
| 状态管理 | 有明确 State 文件 | 幂等(无 State 文件) | etcd 存储期望状态 |
| 语言 | HCL(HashiCorp) | YAML(Jinja2 模板) | YAML(Go template) |
| 执行方式 | 计划 → 应用 | Push(SSH)或 Pull | Operator 持续 Reconcile |
| 典型场景 | 建 VPC / EC2 / RDS | 安装 Nginx、部署 App | 运行微服务、滚动更新 |
| 幂等性 | 原生支持 | 模块层面支持 | 原生支持 |
各工具的能力边界
Terraform 能做 / 不能做
✅ 能做:
- 在 AWS / GCP / Azure / Alicloud 声明并创建任意云资源
- 计算依赖顺序(先建 VPC 再建 EC2)
- 跟踪资源变更(terraform plan 显示 diff)
- 销毁整个环境(terraform destroy)
❌ 不擅长: - 在服务器内部安装软件(交给 Ansible 或 cloud-init) - 管理容器化应用的生命周期(交给 Kubernetes) - 频繁执行(Terraform 设计用于慢速变更,不适合每次代码部署都跑)
Ansible 能做 / 不能做
✅ 能做: - 批量配置多台 Linux 服务器(SSH + Python) - 幂等安装软件包、生成配置文件、管理系统服务 - 编排多步骤部署(先数据库迁移,再应用重启) - 一次性脚本替代品(但更结构化、更可复用)
❌ 不擅长: - 创建云基础设施资源(交给 Terraform) - 管理容器的扩缩容和故障恢复(交给 Kubernetes) - 高并发实时调度(它是推模型,不是持续运行的控制器)
Kubernetes 能做 / 不能做
✅ 能做: - 确保指定数量的 Pod 副本始终运行(自愈) - 滚动更新应用版本,回滚失败版本 - 基于 CPU / 内存 / 自定义指标自动扩缩容 - 服务发现、负载均衡、DNS 解析
❌ 不擅长: - 创建 Kubernetes 集群本身(交给 Terraform 或托管服务) - 安装和配置 Kubernetes 节点操作系统(交给 Ansible 或 kubeadm) - 管理不容器化的传统应用(虽然可以,但很别扭)
真实场景:从零搭建一套生产环境
目标:为一个 Node.js API 服务搭建 AWS 生产环境
常见误区
| 误区 | 正确理解 |
|---|---|
| "Terraform 可以替代 Ansible" | Terraform 只管云资源声明,不能 SSH 进服务器执行操作系统级配置 |
| "Kubernetes 会自己创建云资源" | EKS/GKE/AKS 等托管 K8s 需要先用 Terraform 或控制台创建 |
| "有了 Kubernetes 就不需要 Ansible" | K8s 节点的操作系统初始化、混合云中无法容器化的服务仍需 Ansible |
| "三个都要用,很复杂" | 小团队可以从 Ansible 开始;Terraform 在上云时引入;K8s 在需要容器编排时再加 |
渐进式采纳路径
单机 + 手动
(现状)"] --> B["阶段二
Ansible 批量管理
服务器配置"] B --> C["阶段三
+ Terraform
云基础设施代码化"] C --> D["阶段四
+ Kubernetes
容器编排"] D --> E["阶段五
GitOps
ArgoCD 全自动化"] style A fill:#ffebee,stroke:#c62828 style E fill:#c8e6c9,stroke:#388e3c
下一节:典型工作流:从零到生产