大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
资源管理与驱逐
Pod 的 requests/limits 决定 Scheduler 如何装箱;节点资源 不足 时 kubelet 会 驱逐(Eviction) Pod。本课对应路线图 resource-management 与 evictions——在 kubernetes-essentials 入门 requests 之上,理解 QoS、配额、优先级与稳定性。
学习目标
- 区分 requests、limits 对调度与 cgroup 限流的影响
- 说出 Guaranteed / Burstable / BestEffort 三档 QoS 与驱逐顺序
- 为 namespace 设计 ResourceQuota + LimitRange 草案
Requests 与 Limits
| 字段 | 作用 |
|---|---|
| requests | Scheduler 扣减节点 可分配 资源;保证「至少能调度」 |
| limits | 运行时上限;CPU 可 throttle,内存超限可能 OOMKill |
k8s-resources 入门已设 cpu/memory;生产必须为 每个容器 设 requests,limits 与 JVM/Spring 堆配置 对齐(避免 Java 进程 OOM 与 limit 打架)。
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "768Mi"
QoS 等级
Kubernetes 根据 requests/limits 是否相等、是否设置 自动分类:
| QoS | 条件 | 驱逐优先级 |
|---|---|---|
| Guaranteed | 所有容器 limits = requests 且全设 | 最后 |
| Burstable | 至少一个容器设了 request | 中间 |
| BestEffort | 都没设 | 最先 |
prod 核心服务目标 Guaranteed 或 Burstable + 合理 limits;Job 临时任务可用 Burstable。
节点压力驱逐
Node 内存 / 磁盘 / inode 低于 eviction threshold
→ kubelet 按优先级驱逐 Pod
→ 典型顺序:BestEffort → 超 requests 的 Burstable → Guaranteed
与 k8a-taints 的 NoExecute 策略驱逐 不同——这是 资源保护 机制。监控节点 memory.available、node_pressure 告警见 prometheus-essentials 与 k8a-monitor。
ResourceQuota 与 LimitRange
ResourceQuota(namespace 级):限制总 CPU/内存/Pod 数。
LimitRange(namespace 级):默认 requests/limits、单 Pod 上下限。
# LimitRange 片段:防止「零 request」Pod 进 prod namespace
spec:
limits:
- type: Container
defaultRequest:
cpu: 100m
memory: 128Mi
max:
cpu: "2"
memory: 4Gi
多租户集群或 staging 防资源耗尽 常用;GitOps 仓库里 namespace manifest 与 chart 一并管理,见 gitops-repo。
PriorityClass 与 PDB
| 机制 | 作用 |
|---|---|
| PriorityClass | 高优先级 Pod 可 抢占 低优先级 |
| PDB | 限制 自愿 中断(drain、滚动)时可用副本下限 |
与 k8a-topology 的 spread 组合,避免 drain 时违反 minAvailable。
CodeRoadMap 建议
namespace: backend-prod
LimitRange: 默认 request/limit
ResourceQuota: 总 CPU/内存上限
Deployment backend: requests=limits(Guaranteed 或对齐 JVM)
PDB: minAvailable 2
HPA: 基于 CPU + 自定义指标(见 prom 自定义指标)
练习
- 给一个 Spring Boot 容器写 requests/limits,并说明与
-Xmx关系 - 解释为何 BestEffort Pod 在节点压力下最先被驱逐
- 为 staging namespace 写 ResourceQuota 两行关键字段
小结
Request 管调度,Limit 管运行,QoS 管谁先被牺牲。 下一课把视角拉到集群级可观测性。