← 中文资源

简体中文版本

加命名空间资源配额制止吵闹邻居

用 ResourceQuota 按命名空间限制 CPU、内存与对象数,强制每个 Pod 声明 requests,并用压测验证约束生效。

阅读英文原文

目标

没有配额时每个 Pod 都在与整个集群竞争,嗓门最大的负载获胜。ResourceQuota 把每个命名空间变成有界的牧场:requests、limits 与对象数的硬上限由 API 服务器在准入时强制执行。吵闹的分析任务现在会在调度第 51 个 Pod 时被拒,而不是 OOM 掉支付服务。

步骤要点

  1. 在 analytics 命名空间创建 ResourceQuota:requests.cpu 8、requests.memory 16Gi、limits.memory 24Gi、pods 40。
  2. 配 LimitRange 为省略 requests 的容器兜底默认值(100m/128Mi),杜绝零成本占位调度。
  3. kubectl describe resourcequota 核对 used 与 hard 的实时计数,确认执行已生效。
  4. 故意提交超配额的 Job:应收到 quota exceeded 准入失败而非吃掉集群。
  5. 压力期间 kubectl top 观察 payments 命名空间内存与重启数不受影响,验证隔离真实有效。

排错提示

部署被配额卡住是滚动更新的 surge 顶到上限,按 surge 余量上调配额或调低 maxSurge;Pod 被限流致死是 limits 远低于真实需求,按负载单独调 limits 而不是放宽命名空间总帽;团队用极小 requests 钻空子时配额只数 requests 不管公平,需再配 PriorityClass 让可让路的批任务在压力下给关键服务让路。

适用边界

配额按命名空间不按用户,多服务共用一个命名空间需要更细的内部治理;对象数配额可能破坏会创建大量小资源的 Operator,上计数限制前先验证其行为。

代码示例

spec:
  hard:
    requests.cpu: "8"
    requests.memory: 16Gi
    limits.memory: 24Gi
    pods: "40"

# And defaults so nothing schedules as zero-cost
spec:
  limits:
    - type: Container
      defaultRequest: { cpu: 100m, memory: 128Mi }