场景是我们在 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 内存。
如果您想了解有关该主题的更多信息,请查看官方文档:
如果有帮助的话请告诉我。