pod资源限制和QoS探索 (2)

8c9adca52f2bfd9e1862f6abaac5b435bdaf233925b7d640edb28e36da0b9b39和ca20137f7d5a42910e22425cca06443c16246c90ee9caa27814442e34a832b21:分别对应的是pod运行的主容器ID和pause容器ID

memory.usage_in_bytes已使用的内存,例如我这里查看的结果是160817152,也就是153MB左右

# cat memory.usage_in_bytes 160382976

使用kubect top命令查看使用情况

# kubectl top pod NAME CPU(cores) MEMORY(bytes) stress-memory 13m 151Mi

memory.limit_in_bytes:内存限制的最大值,等于我们设置的内存limit的值

# cat memory.limit_in_bytes 160587776

memory.max_usage_in_bytes:历史内存最大使用量,再查看一下该CGroup下内存历史最大使用量,正好200M

# cat memory.max_usage_in_bytes 209715200 创建一个内存使用超出limit的pod

这时候我们将内存使用设置到250M,超出200M的限制

apiVersion: v1 kind: Pod metadata: name: stress-memory2 namespace: default spec: containers: - name: stress image: polinux/stress imagePullPolicy: IfNotPresent command: ["stress"] args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"] ## 修改为250M,也就是分配250M内存 resources: limits: memory: "200Mi" requests: memory: "100Mi" nodeName: node01

执行kubectl create命令,运行这个pod

kubectl create -f pod-memory-2.yaml

查看pod状态

# kubectl get pod NAME READY STATUS RESTARTS AGE stress-memory 1/1 Running 1 10m6s stress-memory2 0/1 OOMKilled 2 26s

此时会发现,pod在不断重启,并且stress-memory2这个pod的状态为OOMKilled,这个是怎么回事呢,我们可以进到pod对应的CGroup下查看内存使用情况,我们继续看一下目前pod的状态

kubectl get pod stress-memory2 -oyaml ... ... status: ... ... lastState: terminated: containerID: docker://a7d686a3b56aa03b66fd4fed07217693d8e41d75529c02bae34769dca6f01f9e exitCode: 1 finishedAt: "2021-01-18T14:13:21Z" reason: OOMKilled startedAt: "2021-01-18T14:13:21Z"

可以看到pod退出的原因是OOMKilled,什么是OOMKilled呢?简单来说,就是当进程申请的内存超出了已有的内存资源,那么为了保证主机的稳定运行,就会基于进程oom_score的值,有选择性的杀死某个进程。也就是说,在这个例子中,pod申请的内存为250Mi,超过了限制的200Mi,那么就会从该进程所在的CGroup中,杀死对应的进程,具体我们可以看一下该CGroup中内存情况:

通过kubectl get pod stress-memory2 -oyaml命令,获取pod uid,进入到对应的CGroup

cd /sys/fs/cgroup/memory/kubepods/burstable/pod92c2a4c2-3b5c-4a9a-8a00-5d59575e96e7/

首先看一下内存限制是多少

# cat memory.limit_in_bytes 209715200

再查看一下内存使用量,只有1M左右,这是因为此时pod状态不是运行状态

# cat memory.usage_in_bytes 1093632

再查看一下该CGroup下内存历史最大使用量,正好200M

# cat memory.max_usage_in_bytes 209715200

此时我们再看看内存使用量达到限制值的次数

# cat memory.failcnt 531

从以上信息可以得知,内存不断申请超出内存限制的值,导致进程被kill,最终导致pod退出

只设置request

设置request=100M,不设置limit,并设置pod使用内存150M

apiVersion: v1 kind: Pod metadata: name: stress-memory4 namespace: default spec: containers: - name: stress image: polinux/stress imagePullPolicy: IfNotPresent command: ["stress"] args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"] resources: requests: memory: "100Mi" nodeName: node01

执行kubectl create命令,运行这个pod

kubectl create -f pod-memory-4.yaml

查看pod状态

# kubectl get pod NAME READY STATUS RESTARTS AGE stress-memory3 1/1 Running 0 79s

查看pod内存使用

# kubectl top pod NAME CPU(cores) MEMORY(bytes) stress-memory3 51m 150Mi

可以发现,pod内存使用时150Mi,说明只设置内存request,并不会对其限制其内存的使用

注意:如果只设置limit,则request=limit

内存资源限制的目的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsszxz.html