Kubernetes 給容器和Pod配置設定CPU資源
文章目錄
- Kubernetes 給容器和Pod配置設定CPU資源
-
- @[toc]
- Before you begin
- 建立一個命名空間
- 聲明一個CPU申請和限制
- CPU 機關
- 請求的CPU超出了節點的能力範圍
- 如果不指定CPU限額呢
- 設定CPU申請和限制的動機
- 清理
- @[toc]
- Before you begin
- 建立一個命名空間
- 聲明一個CPU申請和限制
- CPU 機關
- 請求的CPU超出了節點的能力範圍
- 如果不指定CPU限額呢
- 設定CPU申請和限制的動機
- 清理
這個教程指導如何給容器配置設定請求的CPU資源和配置CPU資源限制,我們保證容器可以擁有 所申請的CPU資源,但是并不允許它使用超過限制的CPU資源。
Before you begin
You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube.
叢集裡的每個節點至少需要1個CPU。
這篇教程裡的少數步驟可能要求你的叢集運作着Heapster 如果你沒有Heapster,也可以完成大部分步驟,就算跳過Heapster的那些步驟,也不見得會有什麼問題。
判斷Heapster服務是否正常運作,執行以下指令:
kubectl get services --namespace=kube-system
如果heapster正常運作,指令的輸出應該類似下面這樣:
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-system heapster 10.11.240.9 <none> 80/TCP 6d
建立一個命名空間
建立一個命名空間,可以確定你在這個實驗裡所建立的資源都會被有效隔離, 不會影響你的叢集。
kubectl create namespace cpu-example
聲明一個CPU申請和限制
給容器聲明一個CPU請求,隻要在容器的配置檔案裡包含這麼一句resources:requests就可以, 聲明一個CPU限制,則是這麼一句resources:limits.
在這個實驗裡,我們會建立一個隻有一個容器的Pod,這個容器申請0.5個CPU,并且CPU限制設定為1. 下面是配置檔案:
cpu-request-limit.yaml [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-lKgFY3Hb-1604657312848)(https://k8smeetup.github.io/images/copycode.svg)] |
---|
|
在這個配置檔案裡,整個args段提供了容器所需的參數。 -cpus "2"代碼告訴容器嘗試使用2個CPU資源。
建立Pod:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/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裡的容器申請了500m的cpu,同時CPU用量限制為1.
resources:
limits:
cpu: "1"
requests:
cpu: 500m
啟用proxy以便通路heapster服務:
kubectl proxy
在另外一個指令視窗裡,從heapster服務讀取CPU使用率。
curl http://localhost:8001/api/v1/proxy/namespaces/kube-system/services/heapster/api/v1/model/namespaces/cpu-example/pods/cpu-demo/metrics/cpu/usage_rate
輸出顯示Pod目前使用974m的cpu,這個剛好比配置檔案裡限制的1小一點點。
{
"timestamp": "2017-06-22T18:48:00Z",
"value": 974
}
還記得我嗎設定了-cpu “2”, 這樣讓容器嘗試去使用2個CPU,但是容器卻隻被運作使用1一個, 因為容器的CPU使用被限制了,因為容器嘗試去使用超過其限制的CPU資源。
注意: 有另外一個可能的解釋為什麼CPU會被限制。因為這個節點可能沒有足夠的CPU資源,還記得我們 這個實驗的前提條件是每個節點都有至少一個CPU,如果你的容器所運作的節點隻有1個CPU,那容器就無法 使用超過1個的CPU資源,這跟CPU配置上的限制以及沒關系了。
CPU 機關
CPU資源是以CPU機關來計算的,一個CPU,對于Kubernetes而言,相當于:
- 1 AWS vCPU
- 1 GCP Core
- 1 Azure vCore
- 1 Hyperthread on a bare-metal Intel processor with Hyperthreading
小數值也是允許的,一個容器申請0.5個CPU,就相當于其他容器申請1個CPU的一半,你也可以加個字尾m 表示千分之一的概念。比如說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排程是基于請求的,隻有當Node的CPU資源可以滿足Pod的需求的時候,Pod才會被排程到這個Node上面。
在這個實驗當中,我們建立一個Pod請求超大的CPU資源,超過了叢集裡任何一個node所能提供的資源。 下面這個配置檔案,建立一個包含一個容器的Pod。這個容器申請了100個CPU,這應該會超出你叢集裡 任何一個節點的CPU資源。
cpu-request-limit-2.yaml [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-SQ8sppJ4-1604657312850)(https://k8smeetup.github.io/images/copycode.svg)] |
---|
|
建立Pod:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/cpu-request-limit-2.yaml --namespace=cpu-example
檢視Pod的狀态:
kubectl get pod cpu-demo-2 --namespace=cpu-example
這個輸出顯示Pod正處在Pending狀态,那是因為這個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資源沒有上限,它可以使用它運作的Node上所有的CPU資源。
- 容器所運作的命名空間有預設的CPU限制,這個容器就自動繼承了這個限制。叢集管理可以使用 限額範圍 來指定一個預設的CPU限額。
設定CPU申請和限制的動機
通過配置叢集裡的容器的CPU資源申請和限制,我們可以更好的利用叢集中各個節點的CPU資源。 保持Pod的CPU請求不太高,這樣才能更好的被排程。設定一個大于CPU請求的限制,可以獲得以下 兩點優勢:
- Pod 在業務高峰期能擷取到足夠的CPU資源。
- 能将Pod在需求高峰期能使用的CPU資源限制在合理範圍。
清理
删除你的命名空間:
kubectl delete namespace cpu-example