当前位置: 首页 > 知识库问答 >
问题:

为什么库伯内特斯会杀死一个暂停容器?

微生永春
2023-03-14

偶尔,我们的库伯内特斯星系团(GKE上为1.12.7)会发出如下事件:

1 OOMKilling: Memory cgroup out of memory: Kill process 605624 (pause) score 0 or sacrifice child
Killed process 605624 (pause) total-vm:1024kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB

与此同时,我们看到Docker的一个事件:

datadog/agent@sha256:904c18135ec534fc81c29a42537725946b23ba19ac3c0a8b2e942fe39981af20 1 oom 1 kill 1 die 1 stop 1 destroy 1 create 1 start on gke-prod-pool-1-dc20d284-sjwm...

OOM     k8s_datadog-agent_datadog-agent-76v8c_default_bf678779-c318-11e9-b064-42010a9a0059_7  
KILL    k8s_datadog-agent_datadog-agent-76v8c_default_bf678779-c318-11e9-b064-42010a9a0059_7  
...

datadog代理pod也会重新启动。

此特定pod配置有保证的QoS。根据本页节点OOM行为下的表格,保证的pod应该具有-998的oom分数。

为什么暂停容器在这里被杀死?既然它似乎是datadog代理的暂停容器,为什么oom分数是0,而不是-998?

共有1个答案

宋伯寅
2023-03-14

库伯内特斯有它的机制来指定容器的最小和最大要求;例如,您可以有:

 resources:
    limits: 150M
 requests:
    memory: 50M

当你的豆荚越过最大“限制”线时,豆荚将被杀死并报告为OOM死亡,你是否有足够的内存并不重要;由于您已经通过给他们打分来调查了这一过程,分数越高,该过程终止的可能性越大,反之,分数越低,该过程被送到屠宰场的可能性越小(因此,对于您想要保存的过程,使用负值);由于这并不是全部,内核也有一些oom_score_adj需要调整和控制,比如说,人为地控制分数,并在杀戮线中保留或不保留进程。

当为pod设置内存限制时,K8s根据您正确的状态QoS(可爆)发出OOM_SCORE_ADJ值,以确保OOMK选择特定的容器并杀死它。

最后,为了回答分数问题,关于为什么会得到这样的分数,这个“表格”可能对你有用:

 +------------------+------------------------+
 |     QoS          |           Score        |
 |  (Setting)       |     (Value or formula) |
 +-------------------------------------------+
 | Guaranteed       |           -998         |
 +-------------------------------------------+
 | Best effort      |           1000         |
 +-------------------------------------------+
 | Burstable        |          Formula       |
 +------------------+------------------------+

分值公式为暴躁es等于:

 min( max(2, 1000 - (1000 * mRB) / mMCB), 999)
 mRB = Memory Request Bytes.
 mMCB = Machine Memory Capacity Bytes

由于GKE/Kubernetes的QoS是稳定的,所以这就是它在杀戮室中的作用。

我相信这些信息会对您有用,但我也建议您查看以下链接:[1]OOR节点OOM行为(Kubernetes.io)[2]容器和pod内存分配

问候!

[1] https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/#node-oom行为

[2] https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/#exceed-a-容器-内存限制

 类似资料:
  • 我有一个简单的容器,它由安装在阿尔卑斯山上的OpenLDAP组成。它被安装为以非root用户身份运行。我能够使用我的本地Docker引擎运行容器而没有任何问题。但是,当我将其部署到我们的库伯内特斯系统时,它几乎立即被OOMKill杀死。我尝试在没有任何更改的情况下增加内存。我还查看了pod的内存使用情况,没有发现任何异常。 服务器启动为slapd-d debug-hldap://0.0.0.0:1

  • 我是Kubernetes的新手,开始阅读文档。通常使用“endpoint”一词,但文档中缺乏明确的定义。 Kubernetes的“终点”是什么?它位于哪里? 我可以想象“endpoint”是单个“节点”的某种接入点,但这只是猜测。

  • 本文向大家介绍暂停死区是什么?相关面试题,主要包含被问及暂停死区是什么?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 在代码块内,使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”

  • 我有一个应用程序,通过部署类型部署,副本为1。调度器不断地将应用程序移动到不同的节点: I022008:28:44.884808 1 Event.go:218]事件(V1.ObjectReference{kind:“pod”,namespace:“production”,name:“app1-production-77C79BDC85-DDJFB”,uid:“109fa057-1618-11e8-

  • 我假设没有愚蠢的问题,所以这里有一个我找不到直接答案的问题。 现在的情况 我目前有一个运行1.15的Kubernetes集群。AKS上的x,通过Terraform部署和管理。AKS最近宣布Azure将在AKS上停用Kubernetes的1.15版本,我需要将集群升级到1.16或更高版本。现在,据我所知,直接在Azure中升级集群不会对集群的内容产生任何影响,即节点、豆荚、秘密和当前在那里的所有其他

  • 服务网格的主要特征是 < li >服务发现 < li >配置管理 两者都是由Kubernetes提供的。< br >那我们为什么需要服务网格呢? *我知道对于更复杂的任务,例如分区、安全、复杂的负载平衡和路由,服务网格是正确的工具。