云其它

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > 云其它 > k8s pod resources:{}设置的含义

k8s pod resources:{}设置的含义及说明

作者:岳来

Pod的资源请求和限制决定了其在Kubernetes集群中的优先级和调度行为,未设置资源请求和限制的Pod会被归类为BestEffort,优先级最低,资源不足时可能被驱逐,合理设置requests和limits可以避免资源争抢和意外驱逐,提高系统的稳定性和资源利用率

一、resources: {} 含义

未声明资源请求和限制:

当 Pod 的 resources 字段设置为 {},表示该 Pod 未声明任何 CPU 和内存的请求(requests)或限制(limits)。

QoS 级别为 BestEffort:

根据 Kubernetes 的服务质量(QoS)分类,未设置 requests 的 Pod 被归类为 BestEffort(最低优先级)。

二、不设置是可以无限使用机器资源吗?

并不是。Pod 的资源使用仍受以下约束:

那么,pod 资源使用有什么优先级吗?当然有!

三、资源分配的优先级规则

当节点资源紧张时,Kubernetes 根据 QoS 级别 决定资源分配顺序:

QoS级别定义资源保障优先级
Guaranteedrequests == limits 且所有资源均被声明系统强制保障其 requests最高(优先保护)
Burstablerequests < limits 或仅声明 requests保障 requests,超出部分需竞争中等(剩余资源可使用)
BestEffort未声明任何资源(resources: {})无保障最低(可能被驱逐)

具体分配逻辑:

优先保障高 QoS Pod:

资源不足时的驱逐顺序:

当节点资源耗尽时,Kubernetes 会优先终止 BestEffort Pod(QoS 最低),以保障高优先级 Pod 的资源需求。

四、如何设置尽可能避免被驱逐

首先言明,任何一种QoS都有可能被驱逐。

QoS 级别驱逐顺序是否可能被驱逐
BestEffort最先被驱逐是(资源不足时优先被终止)
Burstable在 BestEffort 之后驱逐,但 可能在极端情况下被驱逐是(资源极度紧张时)
Guaranteed最后被驱逐,但并非绝对安全是(极端情况下,如节点崩溃)

具体逻辑如下:

BestEffort Pod:

Burstable Pod:

在资源极度紧张(如节点内存耗尽)时,可能因超出 limits 或系统强制回收资源而被驱逐。例如:

Guaranteed Pod:

通常不会被驱逐,因为其 requests == limits,系统会尽力保障其资源。但以下极端情况下仍可能被驱逐:

如上,Guaranteed最安全,只有节点崩溃情况下才会被驱逐,其次是Burstable,最不安全的是BestEffort,故要避免被驱逐,最好不要设置成BestEffort。

五、limits 和requests 的含义

5.1、含义

requests(资源请求):

定义 Pod 运行所需的最小资源保障

limits(资源限制):

定义 Pod 允许使用的最大资源量

5.2、不同设置的含义及影响

设置组合QoS 级别含义与影响
requests 和 limits 均设置Guaranteed资源保障:requests 和 limits 相等或 requests ≤ limits。 优先级最高:资源不足时最后被驱逐。 示例:requests.cpu=1, limits.cpu=1 → 确保始终获得 1 核 CPU。
仅设置 requestsBurstable-资源保障:requests 定义最小资源,limits 未设置则默认为节点最大资源。- 优先级中等:资源不足时在 BestEffort 后驱逐。 示例:requests.memory=512Mi → 保证 512 MiB 内存,但可使用剩余资源。
仅设置 limitsBurstable- 不推荐:requests 未设置时,requests 默认为 0。 - 与未设置资源类似,QoS 级别为 Burstable,但资源保障不足。
均不设置BestEffort- 无资源保障:仅在节点资源充足时使用剩余资源。 - 优先级最低:资源不足时最先被驱逐。

5.3、哪些设置是有风险或者错误的

未设置 requests:

Pod 可能因资源不足被调度到无法运行的节点(例如节点内存不足但未声明 requests)。

limits < requests:

配置无效,Kubernetes 会以 requests 为准,limits 被忽略。

过度设置 requests:

可能导致节点资源碎片化,其他 Pod 无法调度。

未设置 limits:

Pod 可能占用过多资源,影响其他高优先级应用(如 Burstable Pod 的内存无上限)。

5.4、 资源调度与驱逐规则

调度规则:

资源使用与限制:

CPU:

内存:

驱逐顺序:

5.5、典型场景

场景配置建议说明
关键服务(如数据库)requests == limits(Guaranteed)确保资源隔离,避免因资源波动导致服务不稳定。
普通应用(如 Web 服务)设置 requests,并适当设置 limits(Burstable)允许短暂超限,但防止资源滥用。
测试 Podresources: {}(BestEffort)仅用于低优先级任务,资源不足时可容忍终止。

5.6、最佳实践

始终设置 requests:

合理设置 limits:

监控资源使用:

避免过度声明:

5.7、常见问题

Q1 :设置 requests 但未设置 limits 会怎样?

Q2: limits 是否能超过节点资源?

Q3: 如何避免 Pod 被驱逐?

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文