对于 CPU,如果 pod 中服务使用 CPU 超过设置的limits,pod 不会被 kill 掉但会被限制

chatgpt回答

  • 在 Kubernetes 中,当容器中的服务使用的 CPU 超过设置的 limits 时,Pod 不会被直接杀掉,而是会被限制(throttling)。
  • Kubernetes 使用 CPU throttling(CPU 限制)机制来处理超出限制的 CPU 使用情况。当容器使用的 CPU 超过其设置的 limits 时,Kubernetes 会限制容器的 CPU 使用,以确保其他容器和系统的正常运行。这种限制是通过在容器中引入 CPU throttling 周期来实现的。
  • CPU throttling 会将容器的 CPU 使用限制在设置的 limits 范围内。当容器使用的 CPU 超过 limits 时,Kubernetes 会限制容器的 CPU 时间片,使其在一段时间内只能使用一部分 CPU 资源。这样可以防止容器过度占用 CPU 资源,影响其他容器和系统的性能。
  • 通过 CPU throttling,Kubernetes 在超出 CPU limits 的情况下仍然保持了容器的运行,但限制了其 CPU 使用,以避免对整个集群造成不利影响。这种机制可以帮助确保集群中的各个容器能够公平共享 CPU 资源,并提供一定程度的容错能力。
  • 需要注意的是,虽然 CPU throttling 可以帮助限制容器的 CPU 使用,但过度的 CPU 使用可能会导致应用程序性能下降。因此,在设计和部署应用程序时,建议合理设置 CPU limits,以确保应用程序能够在适当的 CPU 资源范围内运行,并避免过度占用 CPU 资源。

网上回答

所有的资源类型,可以被划分为两大类:可压缩和不可压缩的。

  • 可压缩: 如果系统限制或者缩小容器对可压缩资源的使用的话,只会影响服务对外的服务性能,比如 CPU 就是一种非常典型的可压缩资源。 如果容器的 CPU 使用超过申请的上限, linux 会通过公平调度算法和 cgroups 对这个容器进行限速。 限速行为并不会影响容器的运行, 只是申请不到更多的 CPU 会让服务性能跟不上去。
  • 对于不可压缩资源来说,资源的紧缺是有可能导致服务对外不可用的,比如内存就是一种非常典型的不可压缩资源。 如果内存的使用超过了限制, 就会触发 OOMKilled。 因为它是不可压缩的资源,申请不到新的内存就会直接跪掉。

  • request:可以理解为 k8s 为容器预留的资源量。 即便容器没有实际使用到这些资源, k8s 也会为容器预留好这些资源, 也就是说其他容器是无法申请这些资源的。
  • limit:可理解为 k8s 限制容器使用的资源上限。 也就是限制容器在实际运行的时候不能超过的资源数值。 如果容器使用的资源超过了这个值, 就会触发后续对应的操作。 对于 CPU 来说, 由于 CPU 是可压缩资源, 所以如果容器使用的 CPU 超过了 limit 设置的值, 操作系统只会对其进行限速,不让容器的 cpu 使用量超过 limit。 但对于内存这种不可压缩资源来说, 如果内存的使用量超过了 limit 的值, 则会触发 OOMKilled(我们在 k8s 中容器状态里有时候会看到容器的 last state 是 OOMKilled,表明上次重启是因为内存用超了)。