kubernetes request limit底层是怎么限制的☆

在 Kubernetes 中,Pod 的资源限制(requestlimit)主要是通过 cgroup 来实现的,requestlimit 的值会直接映射到容器的 cgroup 配置中,控制容器使用的资源(CPU 和内存)。这些限制是在容器运行时通过 容器运行时 (如 Docker、containerd 等)和 Linux cgroup 系统实现的。

1. 请求资源(request)与限制资源(limit)的定义

  • request :容器在调度时请求的资源量(CPU 或内存)。它表示 Pod 在集群中调度时需要的最低资源量。如果一个 Pod 没有设置 request,则调度器可能会将 Pod 放置到资源充足的节点上,但不会强制资源保证。
  • limit :容器能够使用的最大资源量。如果容器请求超过 limit 的资源,Linux 内核会限制容器的资源使用(例如,通过 OOM Killer 来终止过度占用内存的容器)。limit 限制的是容器的资源上限,防止单个容器占用过多资源,影响其他容器。

2. 底层原理:cgroup 和容器运行时

容器通过 cgroup(Control Groups)来实现资源的隔离和限制。cgroup 是 Linux 内核的一个特性,用来限制、控制和监视进程的资源使用。

2.1 cgroup 和 Kubernetes 中的资源限制

  • CPU 限制 :容器的 requestlimit 会被转换为 cgroup 中的 CPU 配额。例如,如果容器的 request 设置为 1 CPU,limit 设置为 2 CPU,cgroup 会为该容器分配 1 个 CPU 的请求资源,并且限制它最多只能使用 2 个 CPU 的资源。
  • 内存限制 :容器的内存 requestlimit 会对应到 cgroup 的内存子系统(memory),指定容器可用的最小和最大内存。当容器使用的内存超过了 limit,会触发 OOM(Out of Memory)情况,内核会根据 limit 设置对容器进行杀掉或限制。

2.2 容器运行时如何应用 requestlimit

容器运行时(如 Docker 或 containerd)负责启动容器,并将 requestlimit 转换为 cgroup 的配置。具体实现过程如下:

  1. 容器启动时 :容器运行时读取 Pod 配置中的 requestlimit 值,并将其映射到相应的 cgroup 设置中。比如,对于 CPU 限制,Docker 会使用 cgroup 的 cpu.cfs_quota_uscpu.cfs_period_us 来限制 CPU 使用。

    • CPU 请求 (request):容器的 request 会被转换为 cpu.cfs_quota_us,表示容器在调度时需要的 CPU 资源。
    • CPU 限制 (limit):容器的 limit 会被转换为 cpu.cfs_quota_us,表示容器的最大 CPU 配额。
  2. 资源管理

    • CPU:容器的 CPU 使用会受到 cgroup 的管理,容器的 CPU 使用会被限制在指定的配额范围内。
    • 内存 :内存限制是通过 cgroup 的 memory.limit_in_bytes 来实现的。如果容器请求的内存超过 limit,容器将被杀死(OOM)。
  3. 容器资源超限

    • 当容器超出

      bash 复制代码
      limit

      资源时,Linux 内核会根据资源类型采取不同的策略:

      • CPU 限制 :如果容器使用的 CPU 超过了设置的 limit,容器会被限制只能使用一定量的 CPU 时间,无法进一步占用更多 CPU。
      • 内存限制 :如果容器的内存使用超出了 limit,Linux 内核会通过 OOM(Out Of Memory)机制来终止该容器,以保证系统的稳定性。

2.3 Linux Cgroup 实现方式

在 Linux 内核中,资源限制是通过 cgroup(控制组)实现的。cgroup 用于限制、控制和监控进程的资源使用,包括 CPU、内存、磁盘 I/O 等。

  • CPU 限制 :cgroup 通过 cpu.cfs_quota_uscpu.cfs_period_us 设置 CPU 配额。

    • cpu.cfs_period_us:设置 CPU 周期的总时长(默认是 100ms)。
    • cpu.cfs_quota_us:设置容器在周期内允许使用的最大时间(默认是 -1,表示没有限制)。比如,如果设定为 50000 微秒,容器每个周期只能使用 50ms 的 CPU。
  • 内存限制 :cgroup 使用 memory.limit_in_bytes 来限制容器的最大内存使用量。如果容器的内存超过了 limit,内核会触发 OOM(Out of Memory)机制,杀死进程。

3. 调度器如何使用 request 和 limit

在 Kubernetes 中,调度器 会根据 Pod 的 request 来选择合适的节点进行调度。调度器会确保节点有足够的资源(CPU、内存)来满足 Pod 的 request,同时避免超出节点的资源限制。

  • request :调度时参考 Pod 的 request,确保节点有足够的资源来调度 Pod。request 是保证 Pod 最低可以获得的资源。
  • limitlimit 不会影响调度过程,但会影响容器的资源使用。容器的实际资源使用不能超过 limit,否则会被操作系统限制或杀死。

4. 总结

在 Kubernetes 中,requestlimit 是通过 Linux cgroup 来实现资源控制的:

  • request 表示容器请求的最低资源量,会影响调度时选择节点的过程。
  • limit 表示容器可以使用的最大资源量,超过这个限制会导致容器被限制或杀死。
  • cgroup 是实现这些限制的底层机制,它通过限制 CPU 配额、内存限制等来控制容器的资源使用。

通过 requestlimit,Kubernetes 提供了一个灵活的资源管理机制,确保容器在集群中的资源使用是可控的,并且能够避免资源过度消耗或浪费。

相关推荐
IT_陈寒37 分钟前
SpringBoot实战:这5个隐藏技巧让我开发效率提升200%,90%的人都不知道!
前端·人工智能·后端
catchadmin1 小时前
如何在 PHP 升级不踩坑?学会通过阅读 RFC 提前预知版本变化
开发语言·后端·php
风象南1 小时前
商业化必备:SpringBoot 实现许可证控制
后端
caibixyy9 小时前
Spring Boot 整合 Redisson 实现分布式锁:实战指南
spring boot·分布式·后端
码事漫谈9 小时前
C++编程陷阱:悬空引用检测方法与防范指南
后端
码事漫谈9 小时前
缓存友好的数据结构设计:提升性能的关键技巧
后端
sheji341610 小时前
【开题答辩全过程】以 springboot高校社团管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
聆风吟º11 小时前
远程录制新体验:Bililive-go与cpolar的无缝协作
开发语言·后端·golang
野犬寒鸦11 小时前
从零起步学习Redis || 第四章:Cache Aside Pattern(旁路缓存模式)以及优化策略
java·数据库·redis·后端·spring·缓存
Terio_my11 小时前
Spring Boot 缓存技术详解
spring boot·后端·缓存