三工具定位与协作关系
High Contrast
Dark Mode
Light Mode
Sepia
Forest
5 min read1,057 words

三工具定位与协作关系

核心问题:Ansible、Terraform、Kubernetes 都说自己是"基础设施即代码",它们之间有什么区别?什么时候用哪个?

很多工程师第一次接触 IaC 时都有同样的困惑:三个工具看起来都能"部署东西",到底有什么不同?一句话回答:


三工具核心定位

graph TB subgraph "基础设施层(Terraform 负责)" VPC[VPC / 子网 / 安全组] EC2[EC2 / GCE / VM] RDS[RDS / Cloud SQL] S3[S3 / GCS / Blob] end subgraph "配置管理层(Ansible 负责)" PKG[软件包安装] CFG[配置文件生成] SVC[服务启停管理] K8SINIT[Kubernetes 节点初始化] end subgraph "应用编排层(Kubernetes 负责)" POD[Pod / Deployment] SVC2[Service / Ingress] HPA[HPA 自动扩缩容] SEC[Secret / ConfigMap] end VPC --> PKG EC2 --> PKG PKG --> POD CFG --> SEC

类比理解

工具 类比 解决的问题
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 生产环境

sequenceDiagram participant Dev as 工程师 participant TF as Terraform participant AN as Ansible participant K8 as Kubernetes Dev->>TF: terraform apply TF->>TF: 创建 VPC + 子网 + 安全组 TF->>TF: 创建 EKS 集群 + 节点组 TF->>TF: 创建 RDS PostgreSQL TF->>TF: 创建 S3 桶 + CloudFront TF-->>Dev: 输出 EKS endpoint / RDS endpoint Dev->>AN: ansible-playbook node-init.yml AN->>AN: 安装 containerd + kubelet AN->>AN: 加入 EKS 节点池 AN-->>Dev: 节点就绪 Dev->>K8: kubectl apply / helm install K8->>K8: 部署 API Deployment (3 replicas) K8->>K8: 配置 HPA (3-10 replicas) K8->>K8: 创建 Ingress + TLS 证书 K8-->>Dev: 应用上线

常见误区

误区 正确理解
"Terraform 可以替代 Ansible" Terraform 只管云资源声明,不能 SSH 进服务器执行操作系统级配置
"Kubernetes 会自己创建云资源" EKS/GKE/AKS 等托管 K8s 需要先用 Terraform 或控制台创建
"有了 Kubernetes 就不需要 Ansible" K8s 节点的操作系统初始化、混合云中无法容器化的服务仍需 Ansible
"三个都要用,很复杂" 小团队可以从 Ansible 开始;Terraform 在上云时引入;K8s 在需要容器编排时再加

渐进式采纳路径

graph LR A["阶段一
单机 + 手动
(现状)"] --> B["阶段二
Ansible 批量管理
服务器配置"] B --> C["阶段三
+ Terraform
云基础设施代码化"] C --> D["阶段四
+ Kubernetes
容器编排"] D --> E["阶段五
GitOps
ArgoCD 全自动化"] style A fill:#ffebee,stroke:#c62828 style E fill:#c8e6c9,stroke:#388e3c

下一节典型工作流:从零到生产