【问题标题】:Why Kubernetes pods are failing randomly when their limits overlap?为什么 Kubernetes pod 在它们的限制重叠时会随机失败?
【发布时间】:2020-02-11 20:01:06
【问题描述】:

我有一个单节点 Kubernetes 集群,它显示 10Gi、3 个 CPU 可用(总共 16Gi、4CPU)用于在集群启动后运行 Pod。我正在尝试两种不同的场景:

Scenario-1. 
   Running 3 pods individually with configs(Request,Limit) as: 
   Pod-A: (1 Gi,3.3Gi) and (1 cpu,1 cpu)
   Pod-B: (1 Gi,3.3Gi) and (1 cpu,1 cpu)
   Pod-C: (1 Gi,3.3Gi) and (1 cpu,1 cpu)

在这种情况下,应用程序会在相应的 pod 中完美启动,并按预期正常工作。

Scenario-2. 
   Running 3 pods individually with configs(Request,Limit) as: 
   Pod-A: (1 Gi,10 Gi) and (1 cpu,3 cpu)
   Pod-B: (1 Gi,10 Gi) and (1 cpu,3 cpu)
   Pod-C: (1 Gi,10 Gi) and (1 cpu,3 cpu)

在第二种情况下,应用程序在相应的 Pod 中启动,但在对这些 Pod 中的任何一个施加一些负载后随机失败,即有时 Pod-A 宕机,有时是 Pod-2 或 Pod-3。在任何时候,我都无法同时运行所有三个 pod。

我可以在失败的 pod 中看到的唯一事件如下

The warning which is available in node logs says "Warning CheckLimitsForResolvConf 1m (x32 over 15m) kubelet, xxx.net Resolv.conf file '/etc/resolv.conf' contains search line consisting of more than 3 domains!.”。

日志中只有这些信息,我无法找出 Pod 随机失败的实际原因。

谁能帮助我了解配置是否有问题或者我还缺少什么?

谢谢

【问题讨论】:

  • 注意:如果一个 Container 超过了它的内存请求,它的 Pod 很可能会在节点内存不足时被驱逐。如果 Pod 超过 CPU 限制,就会被限制。

标签: docker kubernetes containers


【解决方案1】:

当您创建 Pod 时,Kubernetes 调度程序会选择一个节点供 Pod 运行。 每个节点对每种资源类型都有一个最大容量:它可以为 Pod 提供的 CPU 和内存量。调度器确保对于每种资源类型,调度的Containers的资源请求总和小于节点的容量。

注意虽然节点上的实际内存或 CPU 资源使用率非常低,但如果 容量检查失败,调度程序仍会拒绝在节点上放置 Pod。这可以防止在以后资源使用量增加时(例如,在请求率的每日峰值期间)出现节点资源短缺。

所以调度后如果一个Container超过了它的内存请求,很可能只要节点内存不足,它的Pod就会被驱逐

请参考Default Hard Eviction Threshold values

kubelet 具有以下默认的硬驱逐阈值:

memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%

您应该在负载运行时跟踪您的Node Conditions

kubelet 将一个或多个驱逐信号映射到相应的节点条件。

如果已达到硬驱逐阈值,或已满足软驱逐阈值,与其关联的宽限期无关,kubelet 会报告反映节点处于压力之下的条件,即MemoryPressureDiskPressure

【讨论】:

  • 场景2(1+1+1 Gi)初始请求的资源小于节点总容量。而且,我在场景 2 中通过 pod 运行的作业与场景 1 中的作业相似。此外,调度程序成功地将 Pod 放入场景 2,这意味着容量检查成功。那么,在部署的后期阶段自动驱逐 pod 的原因是什么。
  • 正如你所说,你在场景 2 之后应用了一些负载 ..Note : When Container exceeds its memory request, it is likely that its Pod will be evicted whenever the node runs out of memory
  • 内存请求是指容器最初请求的内存(resources.requests.memory: 1Gi)吗?
  • 否,如果初始内存请求未满足您的调度,它自己将进入挂起状态,我说的是部署后在给定节点上运行的所有 pod 的内存使用情况(当您应用负载时) ....我添加了更多答案和链接供您参考,这将帮助您获得节点级别的所有驱逐相关详细信息。
猜你喜欢
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多