簡介
此文講解如何定義容器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節點上。
