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

Mug*_*gen 5 kubernetes google-kubernetes-engine kubernetes-deployment kubernetes-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
Run Code Online (Sandbox Code Playgroud)

我尝试通过在我的部署中添加以下内容来为其提供更多内存yaml:

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

      - name: my-container
        image: my-container:latest
        ...
        resources:
          requests:
            memory: "3Gi"
Run Code Online (Sandbox Code Playgroud)

但是,它未能部署:

  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)
Run Code Online (Sandbox Code Playgroud)

部署仅请求一个容器.

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

从反复试验中,我发现我可以请求的最大内存是"2Gi".为什么我不能利用单个pod的完整3.75节点?我是否需要具有更大内存容量的节点?

Die*_*des 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文档:

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

Allocatable =容量 - 保留 - 逐出阈值

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

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

GKE在每个节点上保留额外的100 MiB内存用于kubelet驱逐.

正如错误消息所示,扩展群集将无法解决问题,因为每个节点容量限制为X内存量,并且POD需要更多.