代码之家  ›  专栏  ›  技术社区  ›  Mugen

无法创建请求超过2Gi内存的部署

  •  0
  • Mugen  · 技术社区  · 6 年前

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

    0 回复  |  直到 6 年前
        1
  •  6
  •   Diego Mendes    6 年前

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

    docs :

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

    可分配的 节点中的资源:

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

    GKE docs :

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

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

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

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

        2
  •  2
  •   Paul Annetts    6 年前

    kube-dns ,也适用于您选择的任何附加组件)。这意味着您将无法访问节点的所有3.75 Gi内存。