Pod 的资源限制设置为:
resource
limit
cpu: 500m
memory: 5Gi
并且10G
节点上还剩下内存。
我已经5
在短时间内成功创建了 pod,并且该节点可能还剩下一些内存,例如8G
.
随着时间的推移,mem 的使用量越来越大,达到限制(5G x 5 = 25G > 10G
),则节点将失去响应。
为了保证可用性,有没有办法在节点上设置资源限制?
更新
核心问题是 pod 内存使用并不总是等于限制,尤其是在刚启动的时候。因此可以尽快创建无限的 pod,然后使所有节点满载。这不好。可能有一些东西可以分配资源而不是设置限制。
更新 2
我再次测试了限制和资源:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 5Gi
总mem是15G,剩下14G,但是调度成功了3个pod:
> free -mh
total used free shared buff/cache available
Mem: 15G 1.1G 8.3G 3.4M 6.2G 14G
Swap: 0B 0B 0B
> docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
44eaa3e2d68c 0.63% 1.939 GB / 5.369 GB 36.11% 0 B / 0 B 47.84 MB / 0 B
87099000037c 0.58% 2.187 GB / 5.369 GB 40.74% 0 B / 0 B 48.01 MB / 0 B
d5954ab37642 0.58% 1.936 GB / 5.369 GB 36.07% 0 B / 0 B 47.81 MB / 0 B
看来节点快要被碾压了XD
更新 3
现在我更改资源限制、请求5G
和限制8G
:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 8Gi
总内存是 only 15G
,并且所有的 pod 都需要24G
,所以所有的 pod 都可能被杀死。16G
(如果没有限制,我的单个容器将比通常花费更多。)
这意味着您最好保持requests
完全等于,limits
以避免 pod 被杀死或节点崩溃。好像requests
没有指定值一样,它会被设置limit
为默认值,那么究竟是做什么requests
用的呢?我认为只有limits
完全够用,或者IMO,与K8s声称的相反,我宁愿将资源请求设置为大于限制,以确保节点的可用性。
更新 4
Kubernetes 1.1通过以下公式安排 pod 内存请求:
(capacity - memoryRequested) >= podRequest.memory
似乎 kubernetes 并不像Vishnu Kannan所说的那样关心内存使用情况。因此,如果 mem 被其他应用程序大量使用,该节点将被粉碎。
幸运的是,从提交e64fe822 开始,公式已更改为:
(allocatable - memoryRequested) >= podRequest.memory
等待k8s v1.2!