无法创建需要超过2Gi内存的部署

时间:2019-02-20 12:23:53

标签: kubernetes google-kubernetes-engine kubernetes-pod kubernetes-deployment

我的部署吊舱由于内存消耗而被驱逐:

  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?我需要更大内存的节点吗?

2 个答案:

答案 0 :(得分:5)

即使该节点具有3.75 GB的总内存,也很可能可分配的容量并非全部为3.75 GB。

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

来自docs

  

Kubernetes节点可以安排为“容量”。默认情况下,Pod可以消耗节点上的所有可用容量 。这是一个问题,因为节点通常运行许多为操作系统和Kubernetes本身供电的系统守护程序。除非为这些系统守护程序留出资源,否则pod和系统守护程序会争用资源,并导致节点上出现资源匮乏的问题。

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

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

来自GKE docs

  

可分配资源的计算方式如下:

     

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

     

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

     
      
  • 前4GB内存的25%
  •   
  • 接下来的4GB内存的20%(最多8GB)
  •   
  • 接下来的8GB内存的10%(最高16GB)
  •   
  • 接下来的112GB内存(最多128GB)的6%
  •   
  • 128 GB以上的所有内存的2%
  •   
     

GKE在每个节点上保留了额外的100 MiB内存,用于逐出kubelet。

如错误消息所暗示的那样,扩展群集将无法解决问题,因为每个节点的容量限制为X的内存量,而POD则需要更多。

答案 1 :(得分:1)

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

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