Terraform / Kubernetes / Docker:三层关系与工作原理(纯概念版)
本文不讨论任何具体仓库,只解释三者本身的分层、运作方式与体系化理解框架。
1. 三者的系统分工
- Docker:应用封装与容器运行时。解决“软件如何被一致地打包并运行”。
- Kubernetes(K8s):容器集群编排与治理。解决“大量容器如何在集群里持续稳定运行”。
- Terraform:声明式基础设施控制器。解决“跨系统资源如何以 IaC 方式被统一声明、审计和变更”。
可把它视为三个不同控制面:
- Docker 控制单机容器生命周期;
- K8s 控制集群工作负载生命周期;
- Terraform 控制基础设施与平台资源生命周期。
2. 它们是上下级吗?
不是强制上下级,而是常见协作层次:
- 用 Docker 产出镜像;
- K8s 消费镜像并调度运行;
- Terraform 管理 K8s 资源或更广泛资源。
但每层都可独立存在:
- Docker 可独立于 K8s;
- K8s 可独立于 Terraform;
- Terraform 可独立于 K8s(管理云资源、DNS、DB、本地系统等)。
3. Docker 工作原理(高密度)
3.1 核心对象
- Image:只读分层模板,包含文件系统与元数据(Entrypoint/Cmd/Env)。
- Container:镜像实例化后的运行态进程集合。
- Registry:镜像分发系统(pull/push)。
- Volume:容器外持久化数据。
- Network:容器互联与服务发现边界。
3.2 内核机制抽象
- 隔离:Linux namespaces(pid/net/mount/uts/ipc/user)。
- 资源限制:cgroups(cpu/memory/io)。
- 分层文件系统:overlay2 等存储驱动。
- 进程模型:容器本质是受隔离与限额约束的普通进程。
3.3 生命周期
build -> tag -> push/pull -> create -> start -> stop -> rm
关键工程点:
- 镜像不可变,配置外置(env/volume);
- 数据不应写在容器层,持久化应进 volume/外部存储。
4. Kubernetes 工作原理(高密度)
4.1 架构组件
- API Server:唯一控制面入口。
- etcd:集群状态存储。
- Scheduler:为 Pod 选择节点。
- Controller Manager:运行各类控制器(Deployment/Job/Node 等)。
- Kubelet:节点代理,执行 Pod 生命周期。
- kube-proxy / CNI:服务转发与网络实现。
4.2 对象模型
- 工作负载:Pod / Deployment / StatefulSet / DaemonSet / Job / CronJob。
- 访问层:Service / Ingress / Gateway API。
- 配置与身份:ConfigMap / Secret / ServiceAccount / RBAC。
- 隔离:Namespace / NetworkPolicy / ResourceQuota。
4.3 核心机制:Reconciliation
- 用户提交期望态(spec)。
- 控制器观察当前态(status)。
- 控制器循环收敛当前态至期望态。
这意味着 K8s 是“持续控制系统”,不是“一次执行脚本”。
4.4 运行治理关键点
- 健康探针:readiness / liveness / startup。
- 资源治理:requests / limits 与调度/稳定性直接耦合。
- 发布策略:滚动更新、回滚、金丝雀(通过更高层策略实现)。
5. Terraform 工作原理(高密度)
5.1 核心对象
- Provider:外部系统适配层。
- Resource/Data Source:受管对象与只读对象。
- Module:配置复用边界。
- Variable/Local/Output:输入、派生、输出接口。
- State:Terraform 对现实资源映射的权威记录。
5.2 执行模型
- 解析 HCL,构建依赖图(DAG)。
- 刷新 state 并计算差异(plan)。
- 按依赖顺序并行执行 provider API 调用(apply)。
- 更新 state。
5.3 关键机制
- Idempotency(幂等):重复 apply 应收敛到同一目标态。
- Drift Detection:检测现实资源偏离声明。
- Lifecycle 控制:
create_before_destroy、ignore_changes等变更语义。 - Workspace/目录边界:状态隔离与环境拆分策略。
6. 三者协同时的标准链路
常见交付链路:
- 应用代码 -> Docker 镜像;
- 镜像发布到 registry;
- K8s 拉取镜像并运行;
- Terraform 负责声明和变更 K8s 资源/平台依赖;
- 监控与日志系统闭环观测;
- CI/CD 驱动 plan/apply 与回滚策略。
本质是三个“状态机”协作:
- Docker:镜像/容器状态机;
- K8s:集群资源收敛状态机;
- Terraform:跨系统 IaC 状态机。
7. 体系里还必须理解的内容
7.1 配置与密钥分层
- 非敏感配置:ConfigMap / 普通变量;
- 敏感配置:Secret / Secret Manager / KMS;
- 原则:密钥不进镜像、不进明文仓库、不进不可控日志。
7.2 网络与流量治理
- 南北向(Ingress/Gateway)与东西向(Service mesh 或内部 Service)分离;
- TLS 终止位置、证书轮换、零信任策略;
- 超时、重试、熔断是可用性关键参数。
7.3 可观测性三件套
- Metrics(指标):容量、延迟、错误率;
- Logs(日志):事件重建与根因定位;
- Traces(链路):跨服务时延归因。
7.4 发布与回滚策略
- 镜像 tag 策略(不可变 tag / digest pinning);
- 蓝绿/金丝雀发布;
- 基于健康阈值自动回滚。
7.5 状态与数据边界
- 容器无状态优先;
- 有状态组件(DB/队列)独立治理;
- 备份、恢复、迁移演练必须制度化。
7.6 安全基线
- 镜像扫描与 SBOM;
- 最小权限(RBAC/IAM);
- 供应链签名与准入控制(admission policy)。
8. 常见误区(纯概念)
- “Docker 就是轻量虚拟机”:错误。容器是进程隔离模型,不是硬件虚拟化。
- “K8s 只是部署工具”:错误。它是持续收敛控制平面。
- “Terraform 是脚本替代品”:不准确。它是状态驱动的声明式变更系统。
- “用了 Terraform 就不需要理解底层平台”:错误。IaC 不能替代平台语义认知。
9. 心智模型总结
从控制论视角看:
- Docker 提供运行单元标准化;
- K8s 提供运行单元集群化收敛;
- Terraform 提供跨系统资源声明化治理。
三者共同构成现代云原生交付栈的核心骨架,但各自边界清晰、可独立演进。