12

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

结果是: 在此处输入图像描述

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

在此处输入图像描述

总内存是 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!

4

2 回答 2

19

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

limits限制容器可以使用多少资源。对于内存,如果容器超出其限制,它将被 OOM 杀死。对于 CPU,它的使用可能会受到限制。

requests不同之处在于它们确保放置 pod 的节点至少有那么多可用容量。如果您想确保您的 pod 能够增长到特定大小而节点不会耗尽资源,请指定该大小的请求。不过,这将限制您可以调度的 Pod 数量——一个 10G 节点只能容纳 2 个具有 5G 内存请求的 Pod。

于 2016-02-25T17:35:48.773 回答
8

Kubernetes 支持服务质量。如果您的 Pod 已limits设置,则它们属于Guaranteed该类,并且由于系统内存压力而导致它们被杀死的可能性极低。如果你在节点上运行的 docker 守护进程或其他守护进程消耗大量内存,那么 Guaranteed Pod 就有可能被杀死。

Kube 调度程序确实考虑了内存容量和调度时分配的内存。例如,您不能在 10GB 节点上调度两个以上的 Pod,每个 Pod 请求 5GB。

到目前为止,Kubernetes 并未出于调度目的消耗内存使用量。

于 2016-02-25T21:24:35.630 回答