超出容器的內存限制
只要節點有足夠的內存資源,那容器就可以使用超過其申請的內存,但是不允許容器使用超過其限制的 資源。如果容器分配了超過限制的內存,這個容器將會被優先結束。如果容器持續使用超過限制的內存, 這個容器就會被終結。如果一個結束的容器允許重啟,kubelet就會重啟他,但是會出現其他類型的運行錯誤。
本實驗,我們創建一個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 https://k8s.io/docs/tasks/configure-pod-container/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://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
exitCode: 137
finishedAt: 2017-06-20T20:52:19Z
reason: OOMKilled
startedAt: null
本實驗里的容器可以自動重啟,因此kubelet會再去啟動它。輸入多幾次這個命令看看它是怎么 被殺掉又被啟動的:
kubectl get pod memory-demo-2 --namespace=mem-example
這個輸出顯示了容器被殺掉,被啟動,又被殺掉,又被啟動的過程:
stevepe@sperry-1:~/steveperry-53.github.io$ kubectl get pod memory-demo-2 --namespace=mem-example
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 OOMKilled 1 37s
stevepe@sperry-1:~/steveperry-53.github.io$ 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