指定内存请求和内存限制
要为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的内存限制,则适用以下某种情况:
- Container没有使用内存量的上限。Container可以使用运行它的节点上的所有可用内存,这反过来可以调用OOM Killer。此外,在OOM Kill的情况下,没有资源限制的容器将被杀死的可能性更大。
- Container在具有默认内存限制的命名空间中运行,并且Container会自动分配默认限制。群集管理员可以使用 LimitRange 指定内存限制的默认值。
内存请求和限制的好处
通过为群集中运行的Container配置内存请求和限制,可以有效利用群集节点上可用的内存资源。通过保持Pod的内存请求较低,您可以很好地安排Pod。通过使内存限制大于内存请求,您可以完成两件事:
- Pod可以进行突发活动,利用恰好可用的内存。
- Pod在突发期间可以使用的内存量限制在一些合理的数量。
原文链接:KUBERNETES 中POD和CONTAINER的内存资源限制,转载请注明来源!