在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
在 Kubernetes 中,资源限制(针对 CPU 和内存)通过容器的 resources
字段配置,主要包括 requests
(资源请求)和 limits
(资源限制)。而 QoS(服务质量等级,Quality of Service) 是 Kubernetes 根据 Pod 中容器的 requests
和 limits
配置自动划分的类别,用于在资源紧张时决定 Pod 的调度优先级和驱逐策略。
一、资源限制的配置方式
资源限制通过 Pod 规格中容器的 resources
字段定义,支持对 CPU 和 内存 两种资源进行配置,核心参数为 requests
和 limits
:
1. 关键参数说明
-
requests
:容器运行所需的 最小资源量,Kubernetes 调度器(kube-scheduler)会确保节点有足够的空闲资源满足requests
后,才会将 Pod 调度到该节点。- CPU 单位:核心(
cores
),支持小数(如0.5
表示 500m,即 0.5 核)。 - 内存单位:字节(如
128Mi
、1Gi
,1Mi = 1024×1024 字节)。
- CPU 单位:核心(
-
limits
:容器允许使用的 最大资源量,Kubernetes 通过 cgroups 强制执行此限制。- 若容器内存使用超过
limits
,会被 OOM(内存溢出)杀死(触发OOMKilled
事件)。 - 若 CPU 使用超过
limits
,会被限流(throttled),但不会被杀死。
- 若容器内存使用超过
2. 配置示例
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: resource-demo-container
image: nginx
resources:
requests: # 最小资源请求
cpu: "100m" # 100 毫核(0.1 核)
memory: "64Mi" # 64MB
limits: # 最大资源限制
cpu: "500m" # 最多使用 0.5 核
memory: "256Mi"# 最多使用 256MB
- 若未配置
requests
,默认与limits
相等(若limits
存在);若两者都未配置,则不做资源请求和限制。 - 每个容器需单独配置资源(Pod 级别的资源配置由所有容器的配置汇总决定)。
二、QoS 分类及与资源配置的关系
Kubernetes 根据 Pod 中所有容器的 requests
和 limits
配置,自动将 Pod 划分为 3 类 QoS 等级,用于在节点资源不足时决定 Pod 的处理优先级(驱逐或保留)。
1. Guaranteed(保证级)
- 触发条件:Pod 中 所有容器 对 CPU 和内存 都设置了
requests
和limits
,且requests
与limits
相等。
示例:resources: requests: cpu: "500m" memory: "1Gi" limits: cpu: "500m" # 与 requests 相等 memory: "1Gi" # 与 requests 相等
- 特性:资源优先级最高,节点资源不足时最后被驱逐,适合核心服务(如数据库、关键 API)。
2. Burstable(突发级)
- 触发条件:Pod 中 至少一个容器 设置了
requests
(CPU 或内存),但不满足Guaranteed
的条件(即requests
与limits
不相等,或部分资源未设置)。
示例:
或# 仅设置 requests,未设置 limits resources: requests: cpu: "100m"
# requests 与 limits 不相等 resources: requests: cpu: "100m" limits: cpu: "500m" # 大于 requests
- 特性:资源优先级中等,节点资源不足时,会在
BestEffort
之后、Guaranteed
之前被驱逐,适合可容忍短暂中断的服务(如非核心业务逻辑)。
3. BestEffort(尽力而为级)
- 触发条件:Pod 中 所有容器 均未设置
requests
和limits
(完全不限制资源)。
示例:resources: {} # 无任何配置
- 特性:资源优先级最低,节点资源不足时最先被驱逐,适合非关键服务(如日志采集、临时任务)。
三、QoS 的核心作用
QoS 的核心目的是在节点资源(尤其是内存)紧张时,指导 kubelet 进行 Pod 驱逐,确保集群稳定性:
- 驱逐顺序:
BestEffort
→Burstable
(资源使用超过requests
的)→Burstable
(资源使用未超过requests
的)→Guaranteed
(几乎不被驱逐,除非节点内存耗尽)。 - 资源充足时,QoS 不影响 Pod 运行;资源紧张时,QoS 决定“牺牲”哪些 Pod 以保证核心服务可用。
总结
- 资源限制配置:通过容器的
resources.requests
(最小需求)和resources.limits
(最大上限)定义,控制 CPU 和内存使用。 - QoS 与资源配置的关系:QoS 是 Kubernetes 根据资源配置自动划分的等级(
Guaranteed
、Burstable
、BestEffort
),无需手动指定。 - 实际意义:合理配置资源限制可避免单个 Pod 滥用资源,而 QoS 确保资源紧张时优先保护核心服务,是 Kubernetes 资源管理的核心机制。