在 Kubernetes 中为 pods 分配或限制资源?
Allocate or Limit resource for pods in Kubernetes?
Pod的资源限制设置为:
resource
limit
cpu: 500m
memory: 5Gi
节点上还有 10G
内存。
我在短时间内成功创建了 5
pods,节点可能还有一些内存,例如8G
.
随着时间的推移,mem使用量越来越大,达到极限(5G x 5 = 25G > 10G
),节点将失去响应。
为了保证可用性,有没有办法在节点上设置资源限制?
更新
核心问题是pod的内存占用并不总是等于limit,尤其是刚启动的时候。所以可以尽快创建无限制的pods,然后让所有节点满载。这不好。可能有一些分配资源而不是设置限制。
更新 2
我再次测试了限制和资源:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 5Gi
总mem为15G,剩余14G,但调度了3个pods,运行成功:
> 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
结果是:
根据 k8s source code about the resource check:
总内存只有15G
,而所有pods需要24G
,所以可能会把pods全部杀掉。 (如果没有限制,我的单个容器通常会花费 16G
以上。)
这意味着你最好保持 requests
正好等于 到 limits
以避免 pod 被杀死或节点崩溃。好像没有指定requests
值,就会是set to the limit
as default,那么requests
到底是干什么用的呢?我觉得只有limits
就完全够了,或者IMO,与K8s声称的相反,我更喜欢设置资源请求大于限制,以确保节点的可用性。
更新 4
Kubernetes 1.1 schedule the pods mem requests 通过公式:
(capacity - memoryRequested) >= podRequest.memory
看来 kubernetes 并不像 Vishnu Kannan 所说的那样关心内存使用情况。所以如果mem被其他应用占用太多,节点会被压垮。
幸运的是,从提交 e64fe822 开始,公式已更改为:
(allocatable - memoryRequested) >= podRequest.memory
等待 k8s v1.2!
Kubernetes 资源规范有两个字段,request
和 limit
。
limits
对容器可以使用的资源量设置上限。对于内存,如果容器超出其限制,它将被 OOM 杀死。对于 CPU,它的使用可能会受到限制。
requests
的不同之处在于它们确保放置 pod 的节点至少有那么多的可用容量。如果您想确保您的 pods 能够在节点 运行 资源不足的情况下增长到特定大小,请指定该大小的请求。不过,这将限制您可以调度的数量 pods——一个 10G 的节点将只能满足 2 个 pods 的 5G 内存请求。
Kubernetes 支持服务质量。如果您的 Pods 设置了 limits
,则它们属于 Guaranteed
class,并且它们因系统内存压力而被杀死的可能性极低。如果 docker 守护进程或节点上 运行 的其他守护进程消耗大量内存,则 Guaranteed Pods 有可能被杀死。
Kube 调度程序确实会在调度时考虑内存容量和分配的内存。例如,您不能安排超过两个 pods,每个都在 10GB 节点上请求 5GB。
到目前为止,Kubernetes 还没有为调度目的消耗内存。
Pod的资源限制设置为:
resource
limit
cpu: 500m
memory: 5Gi
节点上还有 10G
内存。
我在短时间内成功创建了 5
pods,节点可能还有一些内存,例如8G
.
随着时间的推移,mem使用量越来越大,达到极限(5G x 5 = 25G > 10G
),节点将失去响应。
为了保证可用性,有没有办法在节点上设置资源限制?
更新
核心问题是pod的内存占用并不总是等于limit,尤其是刚启动的时候。所以可以尽快创建无限制的pods,然后让所有节点满载。这不好。可能有一些分配资源而不是设置限制。
更新 2
我再次测试了限制和资源:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 5Gi
总mem为15G,剩余14G,但调度了3个pods,运行成功:
> 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
结果是:
根据 k8s source code about the resource check:
总内存只有15G
,而所有pods需要24G
,所以可能会把pods全部杀掉。 (如果没有限制,我的单个容器通常会花费 16G
以上。)
这意味着你最好保持 requests
正好等于 到 limits
以避免 pod 被杀死或节点崩溃。好像没有指定requests
值,就会是set to the limit
as default,那么requests
到底是干什么用的呢?我觉得只有limits
就完全够了,或者IMO,与K8s声称的相反,我更喜欢设置资源请求大于限制,以确保节点的可用性。
更新 4
Kubernetes 1.1 schedule the pods mem requests 通过公式:
(capacity - memoryRequested) >= podRequest.memory
看来 kubernetes 并不像 Vishnu Kannan 所说的那样关心内存使用情况。所以如果mem被其他应用占用太多,节点会被压垮。
幸运的是,从提交 e64fe822 开始,公式已更改为:
(allocatable - memoryRequested) >= podRequest.memory
等待 k8s v1.2!
Kubernetes 资源规范有两个字段,request
和 limit
。
limits
对容器可以使用的资源量设置上限。对于内存,如果容器超出其限制,它将被 OOM 杀死。对于 CPU,它的使用可能会受到限制。
requests
的不同之处在于它们确保放置 pod 的节点至少有那么多的可用容量。如果您想确保您的 pods 能够在节点 运行 资源不足的情况下增长到特定大小,请指定该大小的请求。不过,这将限制您可以调度的数量 pods——一个 10G 的节点将只能满足 2 个 pods 的 5G 内存请求。
Kubernetes 支持服务质量。如果您的 Pods 设置了 limits
,则它们属于 Guaranteed
class,并且它们因系统内存压力而被杀死的可能性极低。如果 docker 守护进程或节点上 运行 的其他守护进程消耗大量内存,则 Guaranteed Pods 有可能被杀死。
Kube 调度程序确实会在调度时考虑内存容量和分配的内存。例如,您不能安排超过两个 pods,每个都在 10GB 节点上请求 5GB。
到目前为止,Kubernetes 还没有为调度目的消耗内存。