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 提供了一个灵活的资源管理机制,确保容器在集群中的资源使用是可控的,并且能够避免资源过度消耗或浪费。

相关推荐
独立开阀者_FwtCoder4 分钟前
Nginx 部署负载均衡服务全解析
前端·javascript·后端
独立开阀者_FwtCoder8 分钟前
Nginx 通过匹配 Cookie 将请求定向到特定服务器
java·vue.js·后端
自珍JAVA9 分钟前
【RESTful API】API设计 (http治理)
后端
暮雨哀尘13 分钟前
Flask 与 Django:Python Web 开发框架的深度对比分析
后端
noodb软件工作室15 分钟前
thingsboard如何编译出rpm包
后端
林太白1 小时前
Rust-连接数据库
前端·后端·rust
bug菌1 小时前
CAP定理真的是死结?业务系统到底该怎么取舍!
分布式·后端·架构
林太白1 小时前
Rust认识安装
前端·后端·rust
掘金酱1 小时前
🔥 稀土掘金 x Trae 夏日寻宝之旅火热进行ing:做任务赢大疆pocket3、Apple watch等丰富大礼
前端·后端·trae
xiayz1 小时前
引入mapstruct实现类的转换
后端