首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes 资源限制与服务质量等级(QoS)

Kubernetes 资源限制与服务质量等级(QoS)

作者头像
用户11081884
发布2026-07-20 20:18:47
发布2026-07-20 20:18:47
100
举报

K8s 集群里多个应用共享节点资源,如果不做限制,一个容器吃满内存就能把同一节点上其他服务拖垮。资源限制(Requests/Limits)和服务质量等级(QoS)就是用来解决这个问题的。

资源限制

K8s 的资源限制围绕三个概念:

  • Requests — 容器启动需要保证的最小资源量。调度器按 requests 总和来决定把 Pod 放到哪个节点。
  • Limits — 容器能使用的最大资源量。CPU 超限会被节流(变慢),内存超限会被 OOM Kill 直接杀掉。
  • Quotas — 命名空间级别的总量上限,防止某个团队占太多。
Pod 级配置
代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: web-application
spec:
  containers:
  - name: app
    image: myapp:latest
    resources:
      requests:  # 调度和保障的基线
        memory: "128Mi"
        cpu: "250m"  # 0.25 个 CPU 核心
      limits:    # 使用的硬性天花板
        memory: "256Mi"
        cpu: "500m"  # 0.5 个 CPU 核心

单位说明:内存用 Mi/Gi,CPU 用 m(千分之一核)或小数(0.5 = 500m)。

调度器会找至少有 128Mi 内存和 0.25 核 CPU 空闲的节点。运行时容器最多用 256Mi 内存和 0.5 核 CPU,内存超限会被杀,CPU 超限只是变慢。

LimitRange:命名空间默认值

防止有人忘了写 resources 字段,或者写得离谱:

代码语言:javascript
复制
apiVersion: v1
kind: LimitRange
metadata:
  name: resource-constraints
spec:
  limits:
  - type: Container
    max:          # 容器资源上限
      cpu: "2"
      memory: "2Gi"
    min:          # 容器资源下限
      cpu: "100m"
      memory: "64Mi"
    default:      # 未指定 limits 时的默认值
      cpu: "500m"
      memory: "512Mi"
    defaultRequest: # 未指定 requests 时的默认值
      cpu: "250m"
      memory: "256Mi"
    maxLimitRequestRatio: # limits 与 requests 的最大比值
      cpu: 4
      memory: 2
ResourceQuota:命名空间总量限制

多团队共用集群时,限制每个命名空间的资源总额:

代码语言:javascript
复制
apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-quota
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    pods: "50"

服务质量等级(QoS)

节点资源不够时,Kubelet 要决定先驱逐谁。QoS 就是这个优先级,根据 Pod 的 requests/limits 配置自动划分。

Guaranteed(最高优先级)

每个容器都设了 limits,且 limits = requests(或只设 limits 不设 requests,requests 默认等于 limits)。

资源紧张时最后被驱逐,适合数据库、消息队列这类关键服务。

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: mysql-primary
spec:
  containers:
  - name: mysql
    image: mysql:8.0
    resources:
      limits:
        memory: "2Gi"
        cpu: "1"
      requests:  # 与 limits 相同 → Guaranteed
        memory: "2Gi"
        cpu: "1"
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "your-secure-password"
Burstable(中等优先级)

至少一个容器设了 requests,但 limits ≠ requests(或没设 limits)。平时保证 requests 的量,流量高峰可以突发到 limits,资源紧张时比 Guaranteed 先被驱逐。

适合大多数 Web 服务和 API 后端:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: api-service
spec:
  containers:
  - name: api
    image: my-api:v1.2
    resources:
      requests: # 保证基线
        memory: "256Mi"
        cpu: "100m"
      limits:   # 允许突发
        memory: "1Gi"
        cpu: "500m"
BestEffort(最低优先级)

所有容器都没设 requests 和 limits。可以用节点上任何空闲资源,但资源一紧张最先被驱逐。

适合批处理、测试作业这类可中断的任务:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: data-cleanup-job
spec:
  containers:
  - name: cleaner
    image: busybox
    command: ["sh","-c","sleep 300 && echo 'Cleanup done'"]
    # 没有 resources 字段 → BestEffort

配置建议

  • 数据库 / 消息队列 / 核心中间件 → Guaranteed,资源独占,不设 limits 等于没配。
  • Web 服务 / API 后端 → Burstable,requests 保底,limits 留弹性空间应对突发流量。
  • 批处理 / 测试 / 临时任务 → BestEffort,不配资源限制,跑完就释放。
  • 多团队集群 → 加上 LimitRange + ResourceQuota,防有人写死整个节点。

查看 Pod 的 QoS 等级:kubectl get pod <pod-name> -o jsonpath='{.status.qosClass}'

“无他,惟手熟尔”!有需要的用起来!

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 资源限制
    • Pod 级配置
    • LimitRange:命名空间默认值
    • ResourceQuota:命名空间总量限制
  • 服务质量等级(QoS)
    • Guaranteed(最高优先级)
    • Burstable(中等优先级)
    • BestEffort(最低优先级)
  • 配置建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档