pod-5

分析问题,首先查看各个节点的资源。

这显然不合理,各节点都是1核心,差不多2G的内存。内存够用,核心不够这样调小cpu就行了。
10毫核 (10m) = 0.01 核心1m (毫核) = 0.001 CPU 核心,2g里抽出100Mi绰绰有余。理解requests和limits的区别:requests影响调度。limits影响运行时行为(节流或终止)。
等等,显然这个题不是在考察这个:他考察的是requests资源不能超过limits的资源。这样就不合理了。如下图:

requests 和 limits 设置上的见解
-
设置
requests和limits绝不是随便往小了设置就行,也不是随便往大了设置就行。它需要基于对应用程序行为的理解和对集群资源的规划。 -
设置
requests和limits的最佳实践通常是:
1. 设置 requests 的根据 (用于调度和资源保证)
-
原则:
requests应该设置为应用程序正常运行所需的最低资源量。这个值是调度器用来判断 Pod 能否被调度到某个节点上的标准。如果节点上的可用资源(已分配 - 已请求)不足以满足 Pod 的requests,那么该 Pod 就不会被调度到这个节点上。 -
如何确定:
- 基准测试/压力测试: 这是最准确的方法。在没有负载或轻度负载下运行你的应用程序,并监控其资源使用情况(CPU、内存)。观察其稳定的低水位线。
- 经验值: 对于常见的应用程序(如 Redis、Nginx、Web 应用等),社区或供应商通常会有一些推荐的基准值。
- Redis: 即使是空闲的 Redis 实例,也会占用一定的内存(缓存数据、键值对等)。CPU 在没有操作时很低,但一旦有大量读写,CPU 使用率会上升。
- 业务预期: 考虑应用程序在正常业务负载下的预期资源使用量。
- 少量冗余: 可以在最低需求的基础上稍微增加一点点,以应对微小的波动,避免因资源不足导致频繁重启。
-
目的:
- 保证性能: 确保 Pod 至少能获得这些资源,避免因资源争抢而导致的性能下降。
- 有效调度: 帮助调度器做出明智的决策,将 Pod 放置在有足够资源的节点上。
2. 设置 limits 的根据 (用于限制和防止资源耗尽)
-
原则:
limits应该设置为应用程序可能需要的峰值资源量,同时也要考虑到避免单个容器耗尽节点资源的上限。limits应该大于或等于requests。 -
如何确定:
- 观察峰值: 在高负载或偶发性峰值(如数据批量处理、流量高峰)下运行你的应用程序,并监控其资源使用情况。
- 安全裕度: 在峰值的基础上增加一定的安全裕度,防止突发情况导致 OOM Kill 或 CPU 节流。
- 节点容量: 考虑节点总容量和节点上运行的其他关键 Pod。一个 Pod 的
limits不应该过高,以至于一个 Pod 就能耗尽整个节点的资源(除非它是一个专门的、独占节点的大型应用)。 - 避免资源浪费:
limits也不是越大越好。如果limits设置得过大,而应用程序实际使用很少,那么虽然不会影响调度(因为调度是看requests),但在容器运行时,过大的limits会让运维人员误以为容器需要很多资源,从而可能在节点资源规划时犯错。 - CPU limits 的特殊性:
- 如果 CPU
limits设置得和requests相同,则 Pod 永远只能获得这么多 CPU。 - 如果 CPU
limits>requests,则 Pod 在节点有空闲 CPU 时,可以“突发”使用requests到limits之间的 CPU 资源。这对于那些平时负载低但偶尔有高计算峰值的应用很有用。
- 如果 CPU
-
目的:
- 防止资源耗尽: 阻止一个失控的容器耗尽整个节点上的 CPU 或内存资源,从而影响节点上的其他 Pod 甚至导致节点崩溃。
- 流量整形/QoS: 对 CPU 进行节流,确保其他更重要的 Pod 获得所需的 CPU。
- 故障隔离: 即使一个应用出现内存泄漏,也只会影响到它自己的 Pod,而不会影响整个节点。
3. 具体示例 (以 Redis 为例)
对于一个 CKA 考试用的简单 Redis Pod:
- 节点配置: 1 核,2GB 内存
- Redis 功能: 可能只是简单的键值存储,数据量不大。
分析:
- 内存: Redis 是内存数据库。即使没有存储数据,Redis 进程本身也会占用几十兆内存。如果存储少量键值对,内存使用会随着数据量增加。
- CPU: Redis 是单线程的(主线程处理命令),所以 CPU 使用率通常不会太高,除非有大量并发连接或复杂命令。
合理配置建议:
requests:
memory: "50Mi" # Redis 进程启动和少量数据需要的最小内存
cpu: "5m" # Redis 空闲或低负载时的 CPU 需求
limits:
memory: "150Mi" # 考虑到可能存储少量数据或偶尔的内存峰值
cpu: "50m" # 允许 Redis 在有请求时可以快速处理,但不会占用太多 CPU
解释:
requests.memory: "50Mi": 假设 Redis 启动后,自身进程和少量数据占用约 30-40Mi,留点余量到 50Mi。requests.cpu: "5m": Redis 空闲时 CPU 消耗非常低,5m 足够调度。limits.memory: "150Mi": 允许它存储更多的数据(但不要太大,因为你是在 2GB 的节点上),或者处理一些突发情况,避免 OOM Kill。limits.cpu: "50m": 允许它在有请求时,可以突发使用 0.05 核心的 CPU,这对于单个 Redis 实例处理简单的键值操作通常是足够的,同时也不会占用太多核心。
总结:
- 不能随便往小了设置: 如果
requests太小,应用程序可能因为资源不足而性能低下或频繁重启。如果limits太小,容器可能频繁被 OOM Kill 或 CPU 节流,导致服务不稳定。 - 不能随便往大了设置: 如果
requests太大,会造成集群资源浪费,导致其他 Pod 难以调度,降低集群利用率。如果limits太大,一个失控的 Pod 可能会耗尽整个节点资源,导致集群不稳定。 - 核心是监控和迭代: 最佳实践是先基于经验或初步测试设置一个合理的值,然后部署应用程序并持续监控其资源使用情况。根据实际负载下的监控数据,再逐步调整
requests和limits,使其更符合应用程序的实际需求和集群的资源规划。
对于 CKA 考试,通常不会考你如何精准测算,而是考你对 requests 和 limits 概念的理解和如何避免明显的错误配置(比如 requests > limits 或不设 limits 导致危险)。但理解其背后的原理,能帮助你更好地通过考试和解决实际问题。
浙公网安备 33010602011771号