我们对整个 Kubernetes 世界有点陌生,但现在有许多服务在 GKE 中运行。然而,今天我们看到了一些奇怪的行为,其中一个运行在我们的一个 Pod 内的进程被杀死,即使 Pod 本身有足够的可用资源,并且没有接近其极限。
限制定义如下:
resources:
requests:
cpu: 100m
memory: 500Mi
limits:
cpu: 1000m
memory: 1500Mi
Run Code Online (Sandbox Code Playgroud)
在 pod 中,一个 Celery (Python) 正在运行,这个特殊的正在消耗一些相当长的运行任务。
在其中一项任务的运行过程中,celery 进程突然被杀死,似乎是 OOM 引起的。GKE 集群操作日志显示以下内容:
Memory cgroup out of memory: Kill process 613560 (celery) score 1959 or sacrifice child
Killed process 613560 (celery) total-vm:1764532kB, anon-rss:1481176kB, file-rss:13436kB, shmem-rss:0kB
Run Code Online (Sandbox Code Playgroud)
该时间段的资源图如下所示:
可以清楚地看到,CPU 或内存使用量都没有接近 Pod 定义的限制,所以我们对为什么会发生 OOMKilling 感到困惑?进程本身被杀死而不是实际的 Pod 被杀死这一事实也有点困惑?
这种特殊的 OOM 是否真的发生在操作系统内部而不是在 Kubernetes 中?如果是这样 - 是否有解决此特定问题的解决方案?