kubernetes之定義容器和Pod的CPU資源


簡介

此文講解如何定義容器CPU請求和CPU限制。容器使用的CPU不能超過配置的限制。如果系統有空閑的CPU時間,則可以保證為容器分配所需的CPU數量。

備注:此文檔參考官方文檔,並加以自己的理解。如有誤導性的內容,請批評指正。

定義容器的CPU請求和限制

創建名稱空間

# kubectl create namespace cpu-example

為了定義容器的CPU請求,使用容器資源清單中的resources:requests字段。為了定義CPU的限制,使用容器資源清單中的resources:limits字段,以下創建只用一個容器的Pod,該容器CPU請求是0.5,CPU限制數1。文件名:cpu-request-limit.yaml

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

容器YAML配置文件的args塊中提供的配置參數--cpus "2"告訴容器嘗試使用2 CPUs。

創建Pod

# kubectl apply -f /root/k8s-example/pods/cpu-request-limit.yaml --namespace=cpu-example

確保Pod已正在運行

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

查看Pod資源詳情

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

從輸出結果看出,Pod內的容器CPU請求數為500 milliCPU,CPU限制數1

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

使用kubectl top 獲取Pod的metrics指標

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

從輸出結果看,該Pod使用了1001 milliCPU,該值小於Pod定義的CPU限制數1

NAME       CPU(cores)   MEMORY(bytes)
cpu-demo   1001m        1Mi

我們前面創建Pod時,設置的-cpu "2",即讓容器嘗試使用2 CPUs,但是容器只被分配了1個CPU,容器的CPU使用量受到限制,因為該容器正嘗試使用超出其限制的CPU資源。

刪除Pod

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

刪除namespace

# kubectl delete namespace cpu-example

CPU 單位

CPU資源用 CPU作為單位。在Kubernetes中,等於

  • 1 AWS vCPU
  • 1 GCP Core
  • 1 Azure vCore
  • 1 Hyperthread on a bare-metal Intel processor with Hyperthreading

CPU允許使用小數值。確保請求0.5 CPU的容器的CPU是請求1 CPU的容器的一半。可以使用后綴m表示milli。例如100m CPU,100 milliCPU和0.1 CPU都相同。精度不能超過1m。

定義CPU請求遠大於節點CPU個數

如果Pod自定義了CPU請求和限制,那么自定義容器的CPU請求和限制是非常有用的。一個Pod的CPU請求數等於該Pod內所有容器的CPU請求數總和;Pod的CPU限制數等於該Pod內所有容器CPU限制的總和。

Pod的基於請求數來調度,Pod被調度到有足夠CPU資源的node上,該node節點滿足該Pod請求的CPU資源。

創建一個Pod,該Pod的CPU請求數遠大於集群節點任何node的CPU總數。文件名:``

# kubectl apply -f /root/k8s-example/pods/cpu-request-limit-2.yaml --namespace=cpu-example

查看Pod狀態

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

從結果看出Pod狀態為Pending

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

查看Pod資源詳情

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

結果如下,容器不能被調度到任何node節點上,所有node節點沒有足夠的CPU資源。

Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  0/7 nodes are available: 7 Insufficient cpu.

刪除Pod

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

沒有自定義CPU限制

如果沒有自定義容器的CPU限制,適用以下情況之一:

  • 容器使用的CPU資源沒有上限,只要容器在運行,容器能使用該node節點的所有CPU資源
  • 容器運行在默認CPU限制的namespace上,容器被自動分配默認的CPU限制,集群管理員可以使用LimitRange對象設置默認的CPU限制。

設置CPU請求數和限制數的原因

通過在集群中配置容器的CPU請求和內存限制,可以合理的使用集群中node節點的CPU資源。如果保證Pod的CPU請求在合理值范圍內,則該Pod可以在集群中被合理的調度到合適的node節點上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM