Docker KubernetesNotes

第 18 章:资源治理

zjc 于 2026-01-18 发布

这是《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 成本治理

  1. 按命名空间和标签归属成本;
  2. 治理超规格 requests;
  3. 清理闲置服务;
  4. 使用 HPA 缩容;
  5. 评估 Spot / 抢占式实例;
  6. 审查日志和监控成本。

本章小结

资源治理通过 QoS、LimitRange、ResourceQuota、监控和成本归属实现稳定共享。关键服务建议 Guaranteed 或明确 requests / limits,避免无边界资源使用。

思考题

  1. 三种 QoS 的驱逐顺序如何理解?
  2. CPU 节流和 OOM 有什么差异?
  3. LimitRange 和 ResourceQuota 如何配合?
  4. Java 应用如何设置容器内存参数?
  5. 如何按团队核算 Kubernetes 成本?