
K8s 集群里多个应用共享节点资源,如果不做限制,一个容器吃满内存就能把同一节点上其他服务拖垮。资源限制(Requests/Limits)和服务质量等级(QoS)就是用来解决这个问题的。
K8s 的资源限制围绕三个概念:
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 超限只是变慢。
防止有人忘了写 resources 字段,或者写得离谱:
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多团队共用集群时,限制每个命名空间的资源总额:
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"节点资源不够时,Kubelet 要决定先驱逐谁。QoS 就是这个优先级,根据 Pod 的 requests/limits 配置自动划分。
每个容器都设了 limits,且 limits = requests(或只设 limits 不设 requests,requests 默认等于 limits)。
资源紧张时最后被驱逐,适合数据库、消息队列这类关键服务。
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"至少一个容器设了 requests,但 limits ≠ requests(或没设 limits)。平时保证 requests 的量,流量高峰可以突发到 limits,资源紧张时比 Guaranteed 先被驱逐。
适合大多数 Web 服务和 API 后端:
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"所有容器都没设 requests 和 limits。可以用节点上任何空闲资源,但资源一紧张最先被驱逐。
适合批处理、测试作业这类可中断的任务:
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查看 Pod 的 QoS 等级:kubectl get pod <pod-name> -o jsonpath='{.status.qosClass}'
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!