5

由于内存消耗,我的部署 pod 被驱逐:

  Type     Reason   Age   From                                             Message
  ----     ------   ----  ----                                             -------
  Warning  Evicted  1h    kubelet, gke-XXX-default-pool-XXX  The node was low on resource: memory. Container my-container was using 1700040Ki, which exceeds its request of 0.
  Normal   Killing  1h    kubelet, gke-XXX-default-pool-XXX  Killing container with id docker://my-container:Need to kill Pod

我试图通过在我的部署中添加以下内容来授予它更多内存yaml

apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      ...
      containers:

      - name: my-container
        image: my-container:latest
        ...
        resources:
          requests:
            memory: "3Gi"

但是,它未能部署:

  Type     Reason             Age               From                Message
  ----     ------             ----              ----                -------
  Warning  FailedScheduling   4s (x5 over 13s)  default-scheduler   0/3 nodes are available: 3 Insufficient memory.
  Normal   NotTriggerScaleUp  0s                cluster-autoscaler  pod didn't trigger scale-up (it wouldn't fit if a new node is added)

部署只请求一个容器。

我正在使用GKE自动缩放,默认(也是唯一)池中的节点具有 3.75 GB 内存。

通过反复试验,我发现我可以请求的最大内存是“2Gi”。为什么我不能在单个 pod 中使用完整的 3.75 节点?我需要更大内存容量的节点吗?

4

2 回答 2

6

即使节点有 3.75 GB 的总内存,可分配的容量也很可能不是全部 3.75 GB。

Kubernetes 为系统服务预留了一些容量,避免容器在节点上消耗过多的资源,影响系统服务的运行。

文档

Kubernetes 节点可以调度到容量。默认情况下,Pod 可以消耗节点上的所有可用容量。这是一个问题,因为节点通常运行相当多的系统守护进程,这些守护进程为操作系统和 Kubernetes 本身提供动力。除非为这些系统守护进程预留资源,否则 pod 和系统守护进程会竞争资源并导致节点上的资源匮乏问题。

因为您使用的是 GKE,它们是否不使用默认值,运行以下命令将显示您在节点中有多少可分配资源:

kubectl describe node [NODE_NAME] | grep Allocatable -B 4 -A 3

来自GKE 文档

可分配资源按以下方式计算:

可分配 = 容量 - 保留 - 驱逐阈值

对于内存资源,GKE 保留以下内容:

  • 前 4GB 内存的 25%
  • 下一个 4GB 内存的 20%(最高 8GB)
  • 下一个 8GB 内存的 10%(最高 16GB)
  • 下一个 112GB 内存的 6%(最高 128GB)
  • 128GB 以上任何内存的 2%

GKE 在每个节点上额外预留 100 MiB 内存用于 kubelet 驱逐。

正如错误消息所暗示的那样,扩展集群并不能解决问题,因为每个节点的容量限制为 X 内存量,而 POD 需要的内存不止于此。

于 2019-02-20T12:49:45.630 回答
2

每个节点都会为 Kubernetes 系统工作负载(例如kube-dns,以及您选择的任何附加组件)保留一些内存。这意味着您将无法访问所有节点的 3.75 Gi 内存。

因此,要请求 pod 为其保留 3Gi 内存,您确实需要具有更大内存容量的节点。

于 2019-02-20T12:46:55.803 回答