2. 核心概念:容器运行时(Docker/containerd)、Kubernetes Deployment、Pod、Node、集群资源池

在开始集群升级调优之前,必须统一团队对底层核心概念的认知。本章将逐一拆解容器运行时、Deployment、Pod、Node 与集群资源池这五个关键实体,并阐明它们在升级流程中的角色与约束。

2.1 容器运行时:Docker 与 containerd

容器运行时是负责拉取镜像、创建容器、管理容器生命周期的底层组件。Kubernetes 通过 CRI(Container Runtime Interface)与运行时解耦。当前主流运行时为 containerd(自 Kubernetes v1.24 起弃用 Docker Shim)和 Docker(通过 cri-dockerd 适配器)。

特性 Docker + cri-dockerd containerd(原生 CRI)
CRI 兼容性 需额外适配层 原生内置
镜像管理 Docker CLI / API ctr / crictl
资源开销 较高(含完整 Docker 引擎) 较低(仅运行时核心)
升级影响面 需同时升级 Docker 与 cri-dockerd 仅升级 containerd 二进制
社区支持 维护模式(上游已弃用) 活跃,CNCF 毕业项目
升级建议: 若集群仍使用 Docker 运行时,建议在升级 Kubernetes 版本前先迁移至 containerd。迁移过程可借助 cri-dockerd 作为过渡,但长期应统一为 containerd 以降低升级复杂度。

2.2 Pod:最小的调度与升级单元

Pod 是 Kubernetes 中可创建和部署的最小计算单元。一个 Pod 包含一个或多个容器(共享网络栈、存储卷)。在升级场景中,Pod 是 滚动更新 的直接操作对象。

  • 不可变基础设施: 升级时不原地修改 Pod,而是创建新 Pod 替换旧 Pod。
  • 生命周期钩子: preStop 与 postStart 可用于优雅排空与就绪检查。
  • Pod 安全策略: 升级期间需确保新 Pod 通过 PSS(Pod Security Standards)校验。

2.3 Deployment:声明式更新引擎

Deployment 是管理 Pod 副本集的控制器,提供声明式更新、回滚、扩缩容能力。在集群升级中,Deployment 的 滚动更新策略 直接决定升级速度与业务连续性。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1          # 允许超出期望副本数的最大 Pod 数
      maxUnavailable: 0    # 升级期间允许不可用的最大 Pod 数
  template:
    spec:
      containers:
      - name: app
        image: myapp:2.0.0
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "1"
            memory: "1Gi"
关键参数: maxSurge 与 maxUnavailable 的取值直接影响升级速度与资源占用。在容量规划中,需确保集群有足够的空闲资源容纳 maxSurge 创建的额外 Pod。

2.4 Node:承载 Pod 的物理/虚拟节点

Node 是集群中的工作节点,运行 kubelet、kube-proxy 及容器运行时。Node 的状态(Ready/NotReady)与资源水位(CPU、内存、磁盘、PID)直接决定 Pod 能否被调度。

  • 节点排空(drain): 升级 Node 前需执行 kubectl drain 驱逐 Pod,确保业务无感。
  • 节点标签与污点: 通过 nodeSelector 或 taints/tolerations 控制 Pod 分布,避免升级期间关键 Pod 被调度到待升级节点。
  • 系统预留资源: --system-reserved 与 --kube-reserved 参数为系统组件预留资源,防止 Pod 挤占导致节点不稳定。

2.5 集群资源池:容量规划的数学基础

集群资源池是所有 Node 可分配资源的总和。升级期间,由于节点排空与滚动更新,实际可用资源会动态变化。容量规划的核心是确保资源池在升级过程中始终满足业务 SLO。

资源维度 计算公式 升级影响
可分配 CPU ∑(Node CPU allocatable) 排空节点后减少,滚动更新时因 maxSurge 临时增加
可分配内存 ∑(Node Memory allocatable) 同上,需关注内存超卖比例
Pod IP 池 CNI 插件分配的 IP 范围 滚动更新期间 IP 消耗峰值 = replicas + maxSurge
节点数量 集群中 Ready 节点数 升级窗口内 N 个节点同时不可用
常见陷阱: 仅关注 CPU/内存而忽略 Pod IP 池与节点数量,可能导致滚动更新中途因 IP 耗尽或节点不足而卡住。建议在升级前使用 cluster-autoscaler 或预留缓冲节点。

2.6 概念关系总览

下图展示了容器运行时、Pod、Deployment、Node 与集群资源池之间的层级关系与升级交互路径。

容器运行时集群升级核心概念关系图 核心概念关系与升级交互路径 集群资源池(Cluster Resource Pool) Node 1 kubelet + kube-proxy Pod A 容器: app:v1 Pod B 容器: app:v1 Node 2 kubelet + kube-proxy Pod C 容器: app:v1 Pod D 容器: app:v2 Deployment 控制器 滚动更新策略 | 副本管理 | 回滚 容器运行时(containerd / Docker) CRI 接口 | 镜像拉取 | 容器生命周期 升级路径 Deployment → Pod → 运行时

2.7 升级视角下的概念协同

在集群升级过程中,五个核心概念形成以下协同链条:

  1. 资源池评估: 计算当前集群可分配资源总量,确定升级窗口内可同时排空的节点数。
  2. Node 排空: 逐节点执行 kubectl drain,将 Pod 迁移至其他 Node。
  3. Deployment 滚动更新: 利用 maxSurge 与 maxUnavailable 控制 Pod 替换节奏,确保业务不降级。
  4. Pod 重建: 新 Pod 调度到可用 Node,使用新版本容器镜像与运行时配置。
  5. 运行时升级: 在 Node 层面升级 containerd/Docker 版本,重启 kubelet 使配置生效。
容量规划公式: 升级期间所需最小空闲资源 = (maxSurge × 单 Pod 资源请求) + (同时排空节点数 × 节点系统预留资源)。建议在升级前使用 kubectl describe node 获取各节点 allocatable 值,代入公式验证。