2. 基础概念:容器运行时(Runtime)与容器编排(Orchestration)的核心区别

在深入配置漂移检测之前,必须厘清两个最常被混淆的基础概念:容器运行时(Container Runtime)与容器编排(Container Orchestration)。它们是容器化基础设施中职责完全不同的两个层次,理解其边界是设计自动化流水线的前提。

2.1 职责边界:单机执行 vs. 集群调度

维度 容器运行时(Runtime) 容器编排(Orchestration)
核心职责 在单台主机上创建、启动、停止容器进程 在集群中调度、部署、伸缩、管理容器生命周期
操作对象 容器(Container)、镜像(Image)、挂载点 Pod、Service、Deployment、Namespace
网络模型 单机网络栈(veth pair、bridge) 跨主机覆盖网络(CNI 插件)
存储视角 本地层、卷挂载 持久卷声明(PVC)、分布式存储
配置漂移范围 主机级:runc 配置、cgroup 参数、seccomp 策略 集群级:资源配额、调度策略、网络策略、RBAC
典型组件 containerd、CRI-O、Docker Engine Kubernetes、Nomad、Docker Swarm
关键认知:运行时负责“能不能跑”,编排负责“跑在哪、跑多少、怎么恢复”。配置漂移检测必须同时覆盖这两个层面,但检测手段和恢复策略完全不同。

2.2 架构分层:从 OCI 到 K8s 的调用链

下图展示了从编排层到运行时层的标准调用链路,以及各层可能发生的配置漂移点。

容器运行时与编排架构分层及漂移点 容器运行时与编排架构分层及配置漂移点 容器编排层(Orchestration Layer) Kubernetes / Nomad / Swarm 漂移点:资源配额、调度策略、网络策略、RBAC 配置 CRI 接口(Container Runtime Interface) gRPC 协议:ImageService / RuntimeService 容器运行时层(Runtime Layer) containerd / CRI-O / Docker Engine 漂移点:runc 配置、cgroup 参数、seccomp 策略、挂载选项 Linux 内核(cgroups / namespaces) 说明:编排层通过 CRI 调用运行时,运行时再通过 OCI 规范与内核交互。每一层都有独立的配置域和漂移风险。

2.3 配置漂移视角下的核心差异

从自动化流水线检测与恢复的角度,运行时与编排的差异体现在以下三个关键维度:

  1. 配置作用域
    • 运行时配置:作用于单台主机,例如 /etc/containerd/config.toml、/etc/docker/daemon.json。
    • 编排配置:作用于整个集群,例如 kube-system 命名空间下的 ConfigMap、Deployment 的 spec.template.spec.containers[].securityContext。
  2. 变更频率
    • 运行时配置:相对稳定,通常在节点初始化或版本升级时变更。
    • 编排配置:高频动态变更,应用发布、扩缩容、策略更新都会触发。
  3. 恢复难度
    • 运行时配置漂移:需要节点级修复,可能涉及重启 containerd 或 kubelet,影响节点上所有 Pod。
    • 编排配置漂移:可以通过声明式回滚(kubectl rollout undo)或 GitOps 自动同步恢复,影响范围可控。
⚠️ 常见误区:很多团队只关注编排层的配置漂移(如 Deployment 副本数变化),却忽略了运行时层的配置漂移(如 seccomp 策略被篡改、cgroup 驱动被切换)。后者往往更隐蔽,且可能导致安全逃逸或性能退化。

2.4 典型场景对比:谁在管什么?

场景 运行时负责 编排负责
容器启动失败 检查 OCI 运行时配置、镜像拉取策略 检查资源限制、调度约束、重启策略
网络不通 检查 CNI 插件是否加载、端口映射 检查 Service/Ingress 配置、网络策略
安全策略失效 检查 seccomp/AppArmor 配置文件 检查 PodSecurityPolicy / OPA 策略
资源争抢 检查 cgroup 参数、CPU 管理器策略 检查 LimitRange、ResourceQuota、QoS 等级

2.5 自动化流水线中的关注点

在设计配置漂移检测与恢复流水线时,必须为运行时和编排分别建立检测基线:

  • 运行时基线:使用 containerd config dump、docker info --format '{{json .}}' 等命令定期采集节点级配置,与黄金镜像中的基准配置进行 diff。
  • 编排基线:通过 Kubernetes 的 kubectl diff 或 GitOps 工具(Argo CD、Flux)对比集群实际状态与 Git 仓库中的声明式配置。
💡 实践建议:在流水线中为运行时和编排分别设置独立的检测阶段。运行时检测放在节点初始化或升级后,编排检测放在每次部署前。两者不可互相替代。