配置Pods和containers--爲Containers和Pods分配CPU資源

指定CPU請求和CPU限制node

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

cpu-request-limit.yamlapp

 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: cpu-demo
 5   namespace: cpu-example
 6 spec:
 7   containers:
 8   - name: cpu-demo-ctr
 9     image: vish/stress
10     resources:
11       limits:
12         cpu: "1"
13       requests:
14         cpu: "0.5"
15     args:
16     - -cpus
17     - "2"

配置文件的args部分在容器啓動時爲其提供參數。-cpus「2」參數告訴容器嘗試使用2個cpu。spa

建立Pod:線程

kubectl apply -f cpu-request-limit.yaml --namespace=cpu-example

確認POD正在運行:code

kubectl get pod cpu-demo --namespace=cpu-example

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

kubectl get pod cpu-demo --output=yaml --namespace=cpu-example

輸出顯示Pod中的一個容器具備500 milliCPU的CPU請求和1 CPU的CPU限制。事件

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 500m

使用kubectl top獲取Pod的度量:ci

kubectl top pod cpu-demo --namespace=cpu-example

這個示例輸出顯示pod正在使用974milliCPU,這只是比Pod配置中指定的1CPU的限制少了一點。資源

NAME                        CPU(cores)   MEMORY(bytes)
cpu-demo                    974m         <something>

回想一下,經過設置-cpu「2」,將容器配置爲嘗試使用2個CPU,但容器只容許使用大約1個CPU。容器的CPU使用正在被限制,由於容器正在嘗試使用超過其限制的CPU資源。

注意:CPU使用低於1.0的另外一個可能的解釋是節點可能沒有足夠的可用CPU資源。回想一下,這個練習的先決條件要求每一個節點至少有一個cpu。若是容器在只有1個CPU的節點上運行,則不管爲容器指定的CPU限制如何,容器都不能使用超過1個CPU。

 

CPU單元

 

CPU資源是以CPU單位度量的。在kubernetes中,一個CPU至關於:

   - 1 AWS VCPU

   - 1 GCP核心

   - 1個azure vcore

   - 1個帶超線程的裸機Intel處理器上的超線程

容許使用小數。一個請求0.5CPU的容器的cpu保證是請求1CPU的容器的一半。你能夠用後綴m來表示milli。例如100M CPU、100毫CPU和0.1 CPU都是相同的。不容許精度小於1m。

 

CPU老是做爲絕對數量請求,而不是做爲相對數量;0.1是單核、雙核或48覈計算機上相同數量的CPU。

刪除Pod

kubectl delete pod cpu-demo --namespace=cpu-example

 

 

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

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

 

Pod調度基於請求。只有當節點有足夠的CPU資源來知足Pod CPU請求時,Pod纔會被安排在節點上運行。

 

以下將建立一個Pod,它的CPU請求太大,超過集羣中任何節點的容量。這是一個有一個容器的Pod的配置文件。容器請求100個CPU,這可能會超過集羣中任何節點的容量。

cpu-request-limit-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo-2
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr-2
    image: vish/stress
    resources:
      limits:
        cpu: "100"
      requests:
        cpu: "100"
    args:
    - -cpus
    - "2"

建立Pod:

kubectl apply -f cpu-request-limit-2.yaml --namespace=cpu-example

查看POD狀態:

kubectl get pod cpu-demo-2 --namespace=cpu-example

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

kubectl get pod cpu-demo-2 --namespace=cpu-example

 

NAME         READY     STATUS    RESTARTS   AGE
cpu-demo-2   0/1       Pending   0          7m

 

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

kubectl describe pod cpu-demo-2 --namespace=cpu-example

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

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

刪除Pod:

kubectl delete pod cpu-demo-2 --namespace=cpu-example

 

 

若是未指定CPU限制

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

   - 容器對它可使用的CPU資源沒有上限。容器可使用其運行所在節點上可用的全部CPU資源。

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

 

CPU請求和限制的動機

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

  - pod能夠有突發的活動,在那裏它能夠利用cpu資源碰巧是可用的。

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

相關文章
相關標籤/搜索