[英]Allocate or Limit resource for pods in Kubernetes?
Pod 的资源限制设置为:
resource
limit
cpu: 500m
memory: 5Gi
节点上还剩下10G
内存。
我在短时间内成功创建了5
pod,节点可能还有一些内存,例如8G
。
随着时间的推移,内存使用量越来越大,达到极限( 5G x 5 = 25G > 10G
),节点就会失去响应。
为了保证可用性,有没有办法在节点上设置资源限制?
核心问题是pod内存使用并不总是等于limit,尤其是在刚启动的时候。 因此可以尽快创建无限的 pod,然后使所有节点满载。 这不好。 可能需要分配资源而不是设置限制。
我再次测试了限制和资源:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 5Gi
总内存是 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
现在我更改资源限制,请求5G
并限制8G
:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 8Gi
总内存只有15G
,所有的 pod 需要24G
,所以可能会杀掉所有的 pod。 (如果没有限制,我的单个容器通常会花费超过16G
。)
这意味着您最好保持requests
与limits
完全相同,以避免 pod 被杀死或节点崩溃。 就像没有指定requests
值一样,它会被设置为默认的limit
,那么requests
到底是用来做什么的呢? 我认为只有limits
就完全足够了,或者说IMO,与K8s声称的相反,我更喜欢将资源请求设置为大于限制,以确保节点的可用性。
Kubernetes 1.1通过以下公式调度 pods mem 请求:
(capacity - memoryRequested) >= podRequest.memory
似乎 kubernetes 并不像Vishnu Kannan所说的那样关心内存使用情况。 因此,如果其他应用程序大量使用该内存,则该节点将被粉碎。
幸运的是,从提交e64fe822 开始,公式已更改为:
(allocatable - memoryRequested) >= podRequest.memory
等待 k8s v1.2!
Kubernetes 资源规范有两个字段, request
和limit
。
limits
了容器可以使用的资源量。 对于内存,如果容器超出其限制,它将被 OOM 杀死。 对于 CPU,它的使用可能会受到限制。
requests
的不同之处在于,它们确保放置 Pod 的节点至少有足够的可用容量。 如果您想确保您的 pod 能够增长到特定大小而节点不会耗尽资源,请指定该大小的请求。 不过,这将限制您可以安排的 pod 数量——10G 节点只能容纳 2 个具有 5G 内存请求的 pod。
Kubernetes 支持服务质量。 如果您的 Pod 设置了limits
,则它们属于Guaranteed
类,并且它们由于系统内存压力而被杀死的可能性极低。 如果您在节点上运行的 docker 守护程序或其他一些守护程序消耗了大量内存,那么有保证的 Pod 可能会被杀死。
Kube 调度器确实考虑了调度时分配的内存容量和内存。 例如,您不能在 10GB 节点上安排两个以上的 Pod,每个 Pod 请求 5GB。
到目前为止,Kubernetes 不会出于调度目的消耗内存使用量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.