天天看點

Kubernetes 給容器和Pod配置設定CPU資源Kubernetes 給容器和Pod配置設定CPU資源

Kubernetes 給容器和Pod配置設定CPU資源

文章目錄

  • Kubernetes 給容器和Pod配置設定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)]

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

在這個配置檔案裡,整個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)]

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

建立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
           

繼續閱讀