配置Pods和containers--爲Containers和Pods分配內存資源

指定內存請求和內存限制node

要爲容器指定內存請求,在容器的資源清單中使用resources:requests字段。要指定內存限制,使用resources:limits。linux

memory-request-limit.yaml
 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: memory-demo
 5   namespace: mem-example
 6 spec:
 7   containers:
 8   - name: memory-demo-ctr
 9     image: polinux/stress
10     resources:
11       limits:
12         memory: "200Mi"
13       requests:
14         memory: "100Mi"
15     command: ["stress"]
16     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

配置文件中的args部分在容器啓動時爲其提供參數。「-vm bytes」、「150M」參數告訴容器嘗試分配150 MiB的內存。docker

建立Pod:api

kubectl apply -f memory-request-limit.yaml --namespace=mem-example

確認POD容器正在運行:app

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

查看有關POD的詳細信息:spa

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

輸出顯示pod中的一個容器具備100 MiB的內存請求和200 MiB的內存限制。rest

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

運行kubectl top獲取pod的度量:code

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

輸出顯示POD使用了大約162900000字節的內存,大約是150MiB。這大於POD的100MiB請求,但在POD的200 MiB限制內。orm

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

刪除POD:對象

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

 

超過容器的內存限制

若是節點有可用內存,則容器能夠超出其內存請求。可是一個容器不容許使用超過其內存限制。若是容器分配的內存超過其限制,則該容器將成爲終止的候選對象。若是容器繼續消耗超出其限制的內存,則容器將終止。若是終止的容器能夠從新啓動,kubelet將從新啓動它,就像任何其餘類型的運行時失敗同樣。

memory-request-limit-2.yaml
 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: memory-demo-2
 5   namespace: mem-example
 6 spec:
 7   containers:
 8   - name: memory-demo-2-ctr
 9     image: polinux/stress
10     resources:
11       requests:
12         memory: "50Mi"
13       limits:
14         memory: "100Mi"
15     command: ["stress"]
16     args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]

在配置文件的args部分,能夠看到容器將嘗試分配250 MiB的內存,這遠遠高於100 MiB的限制。

建立Pod:

kubectl apply -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

輸出顯示容器因內存不足(OOM)而被終止:

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

輸出顯示容器被終止、從新啓動、再次終止、再次從新啓動,依此類推:

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

輸出顯示容器重複啓動和失敗:

... Normal  Created   Created container with id 66a3a20aa7980e61be4922780bf9d24d1a1d8b7395c09861225b0eba1b1f8511
... Warning BackOff   Back-off restarting failed container

查看有關羣集節點的詳細信息:

kubectl describe nodes

輸出包括因爲內存不足而被終止的容器的記錄:

Warning OOMKilling Memory cgroup out of memory: Kill process 4481 (stress) score 1994 or sacrifice child

刪除Pod:

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

 

指定對節點來講太大的內存請求

內存請求和限制與容器相關,但將pod視爲具備內存請求和限制是有用的。Pod的內存請求是pod中全部容器的內存請求的總和。一樣,pod的內存限制是pod中全部容器的限制之和。

Pod調度基於請求。只有當節點有足夠的可用內存來知足Pod的內存請求時,Pod才計劃在節點上運行。

以下,建立一個Pod,該Pod的內存請求太大,超過集羣中任何節點的容量。這是一個Pod的配置文件,其中有一個容器請求1000 GiB的內存,這可能超過集羣中任何節點的容量。

 memory-request-limit-3.yaml

 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: memory-demo-3
 5   namespace: mem-example
 6 spec:
 7   containers:
 8   - name: memory-demo-3-ctr
 9     image: polinux/stress
10     resources:
11       limits:
12         memory: "1000Gi"
13       requests:
14         memory: "1000Gi"
15     command: ["stress"]
16     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

建立Pod:

kubectl apply -f memory-request-limit-3.yaml --namespace=mem-example

查看POD狀態:

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

輸出顯示POD狀態爲掛起。也就是說,pod不計劃在任何節點上運行,它將無限期地保持在掛起狀態:

kubectl get pod memory-demo-3 --namespace=mem-example
NAME            READY     STATUS    RESTARTS   AGE
memory-demo-3   0/1       Pending   0          25s

查看有關POD的詳細信息,包括事件:

kubectl describe pod memory-demo-3 --namespace=mem-example

輸出顯示,因爲節點上的內存不足,沒法計劃容器:

Events:
  ...  Reason            Message
       ------            -------
  ...  FailedScheduling  No nodes are available that match all of the following predicates:: Insufficient memory (3).

 

內存單元

 內存資源以字節爲單位。您可使用如下後綴之一將內存表示爲普通整數或定點整數:E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki。例如,如下內容表示大體相同的值:

128974848, 129e6, 129M , 123Mi

 

若是未指定內存限制

 若是未指定容器的內存限制,則下列狀況之一適用:

      - 容器使用的內存量沒有上限。容器可使用運行它的節點上的全部可用內存,而這些內存又能夠調用OOM kill。此外,在OOM終止的狀況下,沒有資源限制的容器被終止的可能性更大。

      - 容器正在具備默認內存限制的命名空間中運行,容器將自動分配默認限制。羣集管理員可使用LimitRange指定內存限制的默認值。

 

內存請求和限制的動機

經過爲集羣中運行的容器配置內存請求和限制,能夠有效地利用集羣節點上可用的內存資源。經過保持pod的內存請求較低,能夠給pod很好的被調度的機會。經過具備大於內存請求的內存限制,您能夠完成兩件事:

     - pod能夠有突發的活動,在那裏它利用的內存剛好是可用的。

     - pod在突發期間可使用的內存量被限制在某個合理的數量。

相關文章
相關標籤/搜索