开发者社区> 问答> 正文

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

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

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

展开
收起
k8s小能手 2019-02-22 15:45:45 2852 0
1 条回答
写回答
取消 提交回答
  • 整合最优质的专家资源和技术资料,问答解疑

    即使节点具有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需要更多。

    2019-07-17 23:29:09
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载