我的部署吊舱由于内存消耗而被驱逐:
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 :(得分: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内存,您确实需要具有更大内存容量的节点。