合理分配容器计算资源
只要节点有足够的内存资源,那容器就可以使用超过其申请的内存,但是不允许容器使用超过其限制的资源。如果容器分配了超过限制的内存,这个容器将会被优先结束。如果容器持续使用超过限制的内存,这个容器就会被终结。如果一个结束的容器允许重启,kubelet就会重启它,但是会出现其他类型的运行错误。
场景一
节点的内存超过了节点内存预留的上限,导致触发OOMkill。
解决方法:
可扩容节点或迁移节点中的pod至其他节点。
场景二
pod的内存的limit设置较小,实际使用率超过limit,导致容器触发了OOMkill。
解决方法:
扩大工作负载内存的limit设置。
示例
本例将创建一个Pod尝试分配超过其限制的内存,如下这个Pod的配置文档,它申请50M的内存, 内存限制设置为100M。
memory-request-limit-2.yaml,此处仅为示例:
apiVersion: v1
kind: Pod
metadata:
  name: memory-demo-2
spec:
  containers:
  - name: memory-demo-2-ctr
    image: vish/stress
    resources:
      requests:
        memory: 50Mi
      limits:
        memory: "100Mi"
    args:
    - -mem-total
    - 250Mi
    - -mem-alloc-size
    - 10Mi
    - -mem-alloc-sleep
    - 1s
  在配置文件里的args段里,可以看到容器尝试分配250M的内存,超过了限制的100M。
创建Pod:
kubectl create -f memory-request-limit-2.yaml --namespace=mem-example
查看Pod的详细信息:
kubectl get pod memory-demo-2 --namespace=mem-example
这时候,容器可能会运行,也可能会被关闭。如果容器还没被关闭,重复之前的命令直至您看到这个容器被关闭:
NAME READY STATUS RESTARTS AGE memory-demo-2 0/1 OOMKilled 1 24s
查看容器更详细的信息:
kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example
这个输出显示了容器被关闭因为超出了内存限制。
lastState:
   terminated:
     containerID: docker://7aae52677a4542917c23b10fb56fcb2434c2e8427bc956065183c1879cc0dbd2
     exitCode: 137
     finishedAt: 2020-02-20T17:35:12Z
     reason: OOMKilled
     startedAt: null
  本例中的容器可以自动重启,因此kubelet会再去启动它。多输入几次这个命令查看它是如何被关闭又被启动的:
kubectl get pod memory-demo-2 --namespace=mem-example
这个输出显示了容器被关闭,被启动,又被关闭,又被启动的过程:
$ kubectl get pod memory-demo-2 --namespace=mem-example NAME READY STATUS RESTARTS AGE memory-demo-2 0/1 OOMKilled 1 37s $ kubectl get pod memory-demo-2 --namespace=mem-example NAME READY STATUS RESTARTS AGE memory-demo-2 1/1 Running 2 40s
查看Pod的历史详细信息:
kubectl describe pod memory-demo-2 --namespace=mem-example
这个输出显示了Pod一直重复着被关闭又被启动的过程:
... Normal Created Created container with id 66a3a20aa7980e61be4922780bf9d24d1a1d8b7395c09861225b0eba1b1f8511 ... Warning BackOff Back-off restarting failed container
 
  