Kubernetes Pod OOMKilled 问题

Kubernetes Pod OOMKilled 问题

场景是我们在 Kubernetes 集群中基于 nginx 镜像运行一些网站。当时我们的集群设置了 2 核节点和 4GB RAM。Pod 的配置如下:CPU:40M 和内存:100MiB。后来,我们将集群升级为 4 核节点和 8GB RAM。但每个 Pod 都不断出现 OOMKilled 问题。因此,我们将每个 Pod 的内存增加到 300MiB 左右,然后一切似乎都运行正常。

我的问题是为什么会发生这种情况以及如何解决。PS:如果我们将每个节点恢复为 2 核和 4GB RAM,Pod 可以在资源减少 100MiB 的情况下正常工作。

答案1

首先,pod 不应仅仅因为节点获得了更多资源就请求更多内存/CPU。如果没有您的规格,很难指出配置方面可能存在什么问题,但我想解释一下这个概念,使其更清楚。

您提到了您的 pod 配置,但没有具体说明这些是限制还是请求。

  • 请求是容器保证获得的内容。如果容器请求资源,Kubernetes 将只将其调度到可以为其提供该资源的节点上。这些不会导致 OOM,但会导致 pod 无法被调度。

  • 另一方面,限制可确保容器不会超过某个值。这可能会导致 OOM 终止。

请求和限制以每个容器为基础。虽然 Pod 通常包含单个容器,但 Pod 包含多个容器也很常见。Pod 中的每个容器都有自己的限制和请求,但由于 Pod 始终以组的形式进行调度,因此您需要将每个容器的限制和请求加在一起以获得 Pod 的合计值。

下面是一个具有 2 个容器的 pod 的示例,这些容器具有相同的指定请求和限制:

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: wp
    image: wordpress
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

如果您想要计算整个 pod 的请求和限制,则需要将这些值相加,使其:请求 0.5 cpu 和 128 MiB 内存,限制 1 cpu 和 256MiB 内存。

如果您想了解有关该主题的更多信息,请查看官方文档:

如果有帮助的话请告诉我。

相关内容