【问题标题】:Kube behavior when more memory is required?需要更多内存时的 Kube 行为?
【发布时间】:2020-05-13 12:59:39
【问题描述】:

这个问题是关于当请求需要比分配给包含 php app 的 Pod 更多的内存时 Kubernetes 的行为。如果 GC 无法释放内存,并且由于 pod 无响应或请求超时而请求需要更多内存,kube 会自行重启 pod 吗?

如果给定了交换内存,kube 会在重新启动 pod 之前尝试使用它。

【问题讨论】:

标签: php memory kubernetes


【解决方案1】:

Kubernetes 不支持 Swap,如果处于活动状态,它将拒绝启动。 pod 资源的请求值不能被过度使用,因此如果 pod 请求 1GB 并且没有节点有 1GB 可用(与总 RAM 减去调度到该节点的所有 pod 上的请求相比),那么 pod 将保持未调度状态,直到发生变化。可以过度使用限制,但 Kubernetes 不参与该过程。它只是在进程 cgroup 中设置内存限制。内存不足的处理就像在 Linux 上一样,如果内核确定它内存不足,那么它会触发一个名为 oomkiller 的东西,它会对进程进行排名并杀死最差的进程。

【讨论】:

  • 不推荐使用swap,使用kubelet命令行选项--fail-swap-on=false或等效的config可以使用swap运行
  • 公平,我猜有人问 SO 可能不应该使用那种高级选项 :)
  • @coderanger 你说Limits can be overcommitted, but Kubernetes is not involved in that process. It just sets the memory limit in the process cgroup 这是否意味着如果进程需要的内存超过为 pod 定义的上限,那么它会询问 os(linux) 并且 os 会提供它是否有足够的内存,即使我有为 pod 定义了上限?那么在 pod 级别定义上限有什么好处呢?
  • 如果 cgroups 系统中存在错误,我想从技术上讲这是可能的?但通常没有,Linux 会尊重 cgroup 中为每个容器设置的资源限制,因为这就是它们的用途。
  • 看起来我之前的问题并不清楚。我的问题是,如果我为 pod(包含一个容器)设置了 2 GB 的限制,但是由于来自用户的更多 http 请求,不知何故它需要超过 2GB,在这种情况下 kube 会做什么?从您的回答看来,它将控制权传递给内核,内核将根据 cgroup 设置和排名决定需要终止该容器中的哪个特定进程。对吗?
猜你喜欢
  • 1970-01-01
  • 2020-01-28
  • 2017-07-06
  • 2020-11-11
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多