这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 资源治理的目标是让节点稳定、应用性能可预期、成本可解释,而不是简单追求高利用率。
18.1 QoS
| QoS | 条件 |
|---|---|
| Guaranteed | requests = limits |
| Burstable | requests < limits |
| BestEffort | 无 requests / limits |
节点压力驱逐时,BestEffort 通常最先被回收,Guaranteed 更稳定。
18.2 LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: app-limits
spec:
limits:
- type: Container
defaultRequest:
cpu: 100m
memory: 128Mi
default:
cpu: 500m
memory: 512Mi
为未声明资源的对象提供默认值。
18.3 ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-quota
spec:
hard:
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
pods: "200"
限制命名空间总资源,防止团队之间相互影响。
18.4 CPU 行为
CPU limit 通过周期配额实现,超过后会节流:
100m = 每 100ms 周期使用 10ms CPU
CPU 节流表现为延迟上升,不一定是 CPU 使用率持续 100%。
18.5 内存行为
内存 limit 超过后可能 OOM Kill:
OOMKilled
Java 等运行时要感知容器内存限制,例如:
-XX:MaxRAMPercentage=70
18.6 成本治理
- 按命名空间和标签归属成本;
- 治理超规格 requests;
- 清理闲置服务;
- 使用 HPA 缩容;
- 评估 Spot / 抢占式实例;
- 审查日志和监控成本。
本章小结
资源治理通过 QoS、LimitRange、ResourceQuota、监控和成本归属实现稳定共享。关键服务建议 Guaranteed 或明确 requests / limits,避免无边界资源使用。
思考题
- 三种 QoS 的驱逐顺序如何理解?
- CPU 节流和 OOM 有什么差异?
- LimitRange 和 ResourceQuota 如何配合?
- Java 应用如何设置容器内存参数?
- 如何按团队核算 Kubernetes 成本?