3、资源分配核心概念:CPU与内存资源模型、资源请求与限制、服务质量QoS等级
在 Serverless 事件驱动场景下,集群升级的核心挑战在于:如何在保证存量函数稳定运行的同时,为升级组件(如 kubelet、CNI 插件、Sidecar 注入器)预留足够的计算资源。理解 Kubernetes 的资源模型是制定分配策略的基础。
3.1 CPU 与内存资源模型
Kubernetes 将物理节点资源抽象为可调度的“资源池”。CPU 和内存是两种最核心的可压缩与不可压缩资源,其模型差异直接影响升级时的资源预留策略。
| 资源类型 | 单位 | 可压缩性 | 回收机制 | 升级影响 |
|---|---|---|---|---|
| CPU | m(毫核,1 核 = 1000m) | 可压缩 | 通过 CFS 配额限流,不杀死 Pod | 升级时 CPU 争抢导致函数延迟增加 |
| 内存 | Mi / Gi(字节) | 不可压缩 | 超出 Limit 触发 OOM Kill | 升级时内存不足导致函数 Pod 被驱逐 |
关键认知: CPU 是可压缩资源,过载时只会变慢,不会崩溃;内存是不可压缩资源,过载时直接杀死进程。在集群升级期间,内存资源的预留比 CPU 更敏感,必须设置严格的 Buffer。
3.2 资源请求(Requests)与限制(Limits)
Requests 和 Limits 是 Kubernetes 调度与执行阶段的两种约束。Requests 用于调度决策,Limits 用于运行时压制。理解两者的差异是避免升级期间资源碎片的关键。
3.2.1 核心定义
- Requests(请求): Pod 启动时向集群“声明”的最小资源保证。调度器依据节点剩余可分配资源(Allocatable)是否满足所有 Pod 的 Requests 之和来决定调度位置。
- Limits(限制): Pod 在运行时允许使用的资源上限。对于 CPU,超过 Limits 会被限流;对于内存,超过 Limits 会触发 OOM Kill。
3.2.2 典型配置模式
| 模式 | Requests | Limits | 适用场景 | 升级风险 |
|---|---|---|---|---|
| Guaranteed | 等于 Limits | 等于 Requests | 延迟敏感型函数 | 资源预留充足,升级安全 |
| Burstable | 小于 Limits | 大于 Requests | 允许突发流量函数 | 升级时可能超卖,需预留 Buffer |
| BestEffort | 不设置 | 不设置 | 批处理/非关键任务 | 升级时极易被驱逐 |
升级避坑: 在 Serverless 场景下,函数 Pod 通常使用 Burstable 模式(Requests 较低,Limits 较高)。集群升级时,如果节点上所有 Pod 的 Requests 之和已经接近节点容量,升级组件(如 DaemonSet 类型的 Sidecar)将无法获得调度资源,导致升级阻塞。建议在升级前将关键函数的 Requests 临时提升至 Limits 的 80%,转为 Guaranteed 模式。
3.3 服务质量 QoS 等级
Kubernetes 根据 Pod 的 Requests 和 Limits 配置,自动将 Pod 划分为三个 QoS 等级。当节点资源紧张时,kubelet 按照 QoS 等级从低到高驱逐 Pod。
3.3.1 驱逐顺序与升级策略
- BestEffort Pod: 节点内存压力达到阈值时,kubelet 首先驱逐 BestEffort Pod。在升级前,应确保所有非关键 BestEffort Pod 已迁移或删除。
- Burstable Pod: 当 BestEffort Pod 全部驱逐后仍无法缓解压力,kubelet 开始驱逐 Burstable Pod。Serverless 函数 Pod 多属此类,升级时需通过 PDB(PodDisruptionBudget)保护核心函数。
- Guaranteed Pod: 只有系统级组件(如 kube-system 命名空间下的 Pod)才应设置为 Guaranteed。升级期间,Guaranteed Pod 几乎不会被驱逐。
升级资源分配最佳实践:
- 将集群升级相关的 DaemonSet(如节点代理、监控采集器)设置为 Guaranteed QoS,确保升级过程中这些组件不被驱逐。
- 对核心 Serverless 函数设置 PDB,允许最多 10% 的 Pod 同时不可用,避免升级时大规模驱逐。
- 在升级窗口前,通过 Vertical Pod Autoscaler 临时提升函数 Pod 的 Requests,使其进入 Burstable 高优先级区间。
3.4 资源分配与升级的关联模型
综合以上概念,集群升级时的资源分配可以抽象为以下公式:
节点可分配资源 = 节点容量 - 系统预留 - kubelet 预留
升级可用资源 = 节点可分配资源 - 所有 Pod Requests 之和
升级组件所需资源 = 升级 DaemonSet Requests + 临时 Buffer
只有当 升级可用资源 >= 升级组件所需资源 时,升级才能顺利进行。否则,需要执行以下操作之一:
- 驱逐部分低 QoS Pod(BestEffort 优先)
- 临时提升节点容量(如弹性节点池)
- 分批升级,每次只升级少量节点