Hang Zhengyang
English ↗

Terraform / Kubernetes / Docker:三层关系与工作原理(纯概念版)

本文不讨论任何具体仓库,只解释三者本身的分层、运作方式与体系化理解框架。

1. 三者的系统分工

  • Docker:应用封装与容器运行时。解决“软件如何被一致地打包并运行”。
  • Kubernetes(K8s):容器集群编排与治理。解决“大量容器如何在集群里持续稳定运行”。
  • Terraform:声明式基础设施控制器。解决“跨系统资源如何以 IaC 方式被统一声明、审计和变更”。

可把它视为三个不同控制面:

  • Docker 控制单机容器生命周期;
  • K8s 控制集群工作负载生命周期;
  • Terraform 控制基础设施与平台资源生命周期。

2. 它们是上下级吗?

不是强制上下级,而是常见协作层次:

  1. 用 Docker 产出镜像;
  2. K8s 消费镜像并调度运行;
  3. 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

  1. 用户提交期望态(spec)。
  2. 控制器观察当前态(status)。
  3. 控制器循环收敛当前态至期望态。

这意味着 K8s 是“持续控制系统”,不是“一次执行脚本”。

4.4 运行治理关键点

  • 健康探针:readiness / liveness / startup。
  • 资源治理:requests / limits 与调度/稳定性直接耦合。
  • 发布策略:滚动更新、回滚、金丝雀(通过更高层策略实现)。

5. Terraform 工作原理(高密度)

5.1 核心对象

  • Provider:外部系统适配层。
  • Resource/Data Source:受管对象与只读对象。
  • Module:配置复用边界。
  • Variable/Local/Output:输入、派生、输出接口。
  • State:Terraform 对现实资源映射的权威记录。

5.2 执行模型

  1. 解析 HCL,构建依赖图(DAG)。
  2. 刷新 state 并计算差异(plan)。
  3. 按依赖顺序并行执行 provider API 调用(apply)。
  4. 更新 state。

5.3 关键机制

  • Idempotency(幂等):重复 apply 应收敛到同一目标态。
  • Drift Detection:检测现实资源偏离声明。
  • Lifecycle 控制:create_before_destroy、ignore_changes 等变更语义。
  • Workspace/目录边界:状态隔离与环境拆分策略。

6. 三者协同时的标准链路

常见交付链路:

  1. 应用代码 -> Docker 镜像;
  2. 镜像发布到 registry;
  3. K8s 拉取镜像并运行;
  4. Terraform 负责声明和变更 K8s 资源/平台依赖;
  5. 监控与日志系统闭环观测;
  6. 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 提供跨系统资源声明化治理。

三者共同构成现代云原生交付栈的核心骨架,但各自边界清晰、可独立演进。