首页 » 安全相关 » KUBERNETES 中POD和CONTAINER的内存资源限制

KUBERNETES 中POD和CONTAINER的内存资源限制

 

指定内存请求和内存限制

要为Container指定内存请求,请resources:requests在Container的资源清单中包含该字段。要指定内存限制,包括resources:limits。 在实例中,将创建一个Container的Pod。Container的内存请求为100 MiB,内存限制为200 MiB。这是Pod的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-ctr
    image: polinux/stress
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

args配置文件中的部分在启动时为Container提供参数。该"--vm-bytes", "150M"参数告诉容器尝试分配的内存150 MIB。

创建Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit.yaml --namespace=mem-example

验证Pod容器是否正在运行:

kubectl get pod memory-demo --namespace=mem-example

查看Pod的详细信息:

kubectl get pod memory-demo --output=yaml --namespace=mem-example

输出显示Pod中的一个Container具有100 MiB的内存请求和200 MiB的内存限制。

...
resources:
  limits:
    memory: 200Mi
  requests:
    memory: 100Mi
...

运行kubectl top以获取pod的指标:

kubectl top pod memory-demo --namespace=mem-example

输出显示Pod使用大约162,900,000字节的内存,大约150 MiB。这大于Pod的100 MiB请求,但在Pod的200 MiB限制内。

NAME                        CPU(cores)   MEMORY(bytes)
memory-demo                 <something>  162856960

删除你的Pod:

kubectl delete pod memory-demo --namespace=mem-example

超过Container的内存限制

如果节点具有可用内存,则Container可以超出其内存请求。但是不允许Container使用超过其内存限制。如果Container分配的内存超过其限制,则Container将成为终止的。如果Container继续消耗超出其限制的内存,则Container将终止。如果可以重新启动已终止的Container,则kubelet会重新启动它,就像任何其他类型的运行时故障一样。 在本实例中,您将创建一个Pod,尝试分配比其限制更多的内存。这是Pod的配置文件,它有一个Container,内存请求为50 MiB,内存限制为100 MiB:

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo-2
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-2-ctr
    image: polinux/stress
    resources:
      requests:
        memory: "50Mi"
      limits:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]

在args配置文件的部分中,您可以看到Container将尝试分配250 MiB的内存,远高于100 MiB的限制。

创建Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit-2.yaml --namespace=mem-example

查看Pod的详细信息:

kubectl get pod memory-demo-2 --namespace=mem-example

此时,Container可能正在运行或被杀死。重复上述命令,直到Container被杀死:

NAME            READY     STATUS      RESTARTS   AGE
memory-demo-2   0/1       OOMKilled   1          24s

获取Container状态的更详细视图:

kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example

输出显示Container被杀死,因为它是内存不足(OOM):

lastState:
   terminated:
     containerID: docker://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
     exitCode: 137
     finishedAt: 2017-06-20T20:52:19Z
     reason: OOMKilled
     startedAt: null

如果未指定内存限制

如果未指定Container的内存限制,则适用以下某种情况:

  1. Container没有使用内存量的上限。Container可以使用运行它的节点上的所有可用内存,这反过来可以调用OOM Killer。此外,在OOM Kill的情况下,没有资源限制的容器将被杀死的可能性更大。
  2. Container在具有默认内存限制的命名空间中运行,并且Container会自动分配默认限制。群集管理员可以使用 LimitRange 指定内存限制的默认值。

内存请求和限制的好处

通过为群集中运行的Container配置内存请求和限制,可以有效利用群集节点上可用的内存资源。通过保持Pod的内存请求较低,您可以很好地安排Pod。通过使内存限制大于内存请求,您可以完成两件事:

  1. Pod可以进行突发活动,利用恰好可用的内存。
  2. Pod在突发期间可以使用的内存量限制在一些合理的数量。

原文链接:KUBERNETES 中POD和CONTAINER的内存资源限制,转载请注明来源!

3