繁体   English   中英

为 Kubernetes 中的 Pod 分配或限制资源?

[英]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,然后使所有节点满载。 这不好。 可能需要分配资源而不是设置限制。

更新 2

我再次测试了限制和资源:

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

更新 3

现在我更改资源限制,请求5G并限制8G

resources:
  limits:
    cpu: 500m
    memory: 5Gi
  requests:
    cpu: 500m
    memory: 8Gi

结果是: 在此处输入图片说明

根据关于资源检查k8s源代码

在此处输入图片说明

总内存只有15G ,所有的 pod 需要24G ,所以可能会杀掉所有的 pod。 (如果没有限制,我的单个容器通常会花费超过16G 。)

这意味着您最好保持requestslimits完全相同,以避免 pod 被杀死或节点崩溃。 就像没有指定requests值一样,它会被设置为默认的limit ,那么requests到底是用来做什么的呢? 我认为只有limits就完全足够了,或者说IMO,与K8s声称的相反,我更喜欢将资源请求设置为大于限制,以确保节点的可用性。

更新 4

Kubernetes 1.1通过以下公式调度 pods mem 请求

(capacity - memoryRequested) >= podRequest.memory

似乎 kubernetes 并不像Vishnu Kannan所说的那样关心内存使用情况。 因此,如果其他应用程序大量使用该内存,则该节点将被粉碎。

幸运的是,从提交e64fe822 开始,公式已更改为:

(allocatable - memoryRequested) >= podRequest.memory

等待 k8s v1.2!

Kubernetes 资源规范有两个字段, requestlimit

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM