Kubernetes 為容器和Pods分配CPU資源

2022-06-09 11:20 更新

為容器和 Pods 分配 CPU 資源

本頁面展示如何為容器設(shè)置 CPU request(請(qǐng)求) 和 CPU limit(限制)。 容器使用的 CPU 不能超過所配置的限制。 如果系統(tǒng)有空閑的 CPU 時(shí)間,則可以保證給容器分配其所請(qǐng)求數(shù)量的 CPU 資源。

在開始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

要檢查版本,請(qǐng)輸入 ?kubectl version?。

集群中的每個(gè)節(jié)點(diǎn)必須至少有 1 個(gè) CPU 可用才能運(yùn)行本任務(wù)中的示例。

本頁的一些步驟要求你在集群中運(yùn)行 metrics-server 服務(wù)。如果你的集群中已經(jīng)有正在運(yùn)行的 metrics-server 服務(wù),可以跳過這些步驟。

如果你正在運(yùn)行Minikube,請(qǐng)運(yùn)行以下命令啟用 metrics-server:

minikube addons enable metrics-server

查看 metrics-server(或者其他資源度量 API ?metrics.k8s.io? 服務(wù)提供者)是否正在運(yùn)行, 請(qǐng)鍵入以下命令:

kubectl get apiservices

如果資源指標(biāo) API 可用,則會(huì)輸出將包含一個(gè)對(duì) ?metrics.k8s.io? 的引用。

NAME
v1beta1.metrics.k8s.io

創(chuàng)建一個(gè)名字空間

創(chuàng)建一個(gè)名字空間,以便將 本練習(xí)中創(chuàng)建的資源與集群的其余部分資源隔離。

kubectl create namespace cpu-example

指定 CPU 請(qǐng)求和 CPU 限制

要為容器指定 CPU 請(qǐng)求,請(qǐng)?jiān)谌萜髻Y源清單中包含 ?resources: requests? 字段。 要指定 CPU 限制,請(qǐng)包含 ?resources:limits?。

在本練習(xí)中,你將創(chuàng)建一個(gè)具有一個(gè)容器的 Pod。容器將會(huì)請(qǐng)求 0.5 個(gè) CPU,而且最多限制使用 1 個(gè) CPU。 這是 Pod 的配置文件:

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"

配置文件的 ?args ?部分提供了容器啟動(dòng)時(shí)的參數(shù)。 ?-cpus "2"? 參數(shù)告訴容器嘗試使用 2 個(gè) CPU。

創(chuàng)建 Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example

驗(yàn)證所創(chuàng)建的 Pod 處于 Running 狀態(tài)

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

查看顯示關(guān)于 Pod 的詳細(xì)信息:

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

輸出顯示 Pod 中的一個(gè)容器的 CPU 請(qǐng)求為 500 milli CPU,并且 CPU 限制為 1 個(gè) CPU。

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

使用 ?kubectl top? 命令來獲取該 Pod 的度量值數(shù)據(jù):

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

此示例輸出顯示 Pod 使用的是 974 milliCPU,即略低于 Pod 配置中指定的 1 個(gè) CPU 的限制。

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

回想一下,通過設(shè)置 ?-cpu "2"?,你將容器配置為嘗試使用 2 個(gè) CPU, 但是容器只被允許使用大約 1 個(gè) CPU。 容器的 CPU 用量受到限制,因?yàn)樵撊萜髡龂L試使用超出其限制的 CPU 資源。

Note: CPU 使用率低于 1.0 的另一種可能的解釋是,節(jié)點(diǎn)可能沒有足夠的 CPU 資源可用。 回想一下,此練習(xí)的先決條件需要你的節(jié)點(diǎn)至少具有 1 個(gè) CPU 可用。 如果你的容器在只有 1 個(gè) CPU 的節(jié)點(diǎn)上運(yùn)行,則容器無論為容器指定的 CPU 限制如何, 都不能使用超過 1 個(gè) CPU。

CPU 單位 

CPU 資源以 CPU 單位度量。Kubernetes 中的一個(gè) CPU 等同于:

  • 1 個(gè) AWS vCPU
  • 1 個(gè) GCP核心
  • 1 個(gè) Azure vCore
  • 裸機(jī)上具有超線程能力的英特爾處理器上的 1 個(gè)超線程

小數(shù)值是可以使用的。一個(gè)請(qǐng)求 0.5 CPU 的容器保證會(huì)獲得請(qǐng)求 1 個(gè) CPU 的容器的 CPU 的一半。 你可以使用后綴 ?m? 表示毫。例如 ?100m? CPU、100 milliCPU 和 0.1 CPU 都相同。 精度不能超過 1m。

CPU 請(qǐng)求只能使用絕對(duì)數(shù)量,而不是相對(duì)數(shù)量。0.1 在單核、雙核或 48 核計(jì)算機(jī)上的 CPU 數(shù)量值是一樣的。

刪除 Pod:

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

設(shè)置超過節(jié)點(diǎn)能力的 CPU 請(qǐng)求

CPU 請(qǐng)求和限制與都與容器相關(guān),但是我們可以考慮一下 Pod 具有對(duì)應(yīng)的 CPU 請(qǐng)求和限制這樣的場景。 Pod 對(duì) CPU 用量的請(qǐng)求等于 Pod 中所有容器的請(qǐng)求數(shù)量之和。 同樣,Pod 的 CPU 資源限制等于 Pod 中所有容器 CPU 資源限制數(shù)之和。

Pod 調(diào)度是基于資源請(qǐng)求值來進(jìn)行的。 僅在某節(jié)點(diǎn)具有足夠的 CPU 資源來滿足 Pod CPU 請(qǐng)求時(shí),Pod 將會(huì)在對(duì)應(yīng)節(jié)點(diǎn)上運(yùn)行:

在本練習(xí)中,你將創(chuàng)建一個(gè) Pod,該 Pod 的 CPU 請(qǐng)求對(duì)于集群中任何節(jié)點(diǎn)的容量而言都會(huì)過大。 下面是 Pod 的配置文件,其中有一個(gè)容器。容器請(qǐng)求 100 個(gè) CPU,這可能會(huì)超出集群中任何節(jié)點(diǎn)的容量。

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"

創(chuàng)建 Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example

查看該 Pod 的狀態(tài):

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

輸出顯示 Pod 狀態(tài)為 Pending。也就是說,Pod 未被調(diào)度到任何節(jié)點(diǎn)上運(yùn)行, 并且 Pod 將無限期地處于 Pending 狀態(tài):

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

查看有關(guān) Pod 的詳細(xì)信息,包含事件:

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

輸出顯示由于節(jié)點(diǎn)上的 CPU 資源不足,無法調(diào)度容器:

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 限制,則會(huì)發(fā)生以下情況之一:

  • 容器在可以使用的 CPU 資源上沒有上限。因而可以使用所在節(jié)點(diǎn)上所有的可用 CPU 資源。
  • 容器在具有默認(rèn) CPU 限制的名字空間中運(yùn)行,系統(tǒng)會(huì)自動(dòng)為容器設(shè)置默認(rèn)限制。 集群管理員可以使用 LimitRange 指定 CPU 限制的默認(rèn)值。

如果你設(shè)置了 CPU 限制但未設(shè)置 CPU 請(qǐng)求

如果你為容器指定了 CPU 限制值但未為其設(shè)置 CPU 請(qǐng)求,Kubernetes 會(huì)自動(dòng)為其 設(shè)置與 CPU 限制相同的 CPU 請(qǐng)求值。類似的,如果容器設(shè)置了內(nèi)存限制值但未設(shè)置 內(nèi)存請(qǐng)求值,Kubernetes 也會(huì)為其設(shè)置與內(nèi)存限制值相同的內(nèi)存請(qǐng)求。

CPU 請(qǐng)求和限制的初衷

通過配置你的集群中運(yùn)行的容器的 CPU 請(qǐng)求和限制,你可以有效利用集群上可用的 CPU 資源。 通過將 Pod CPU 請(qǐng)求保持在較低水平,可以使 Pod 更有機(jī)會(huì)被調(diào)度。 通過使 CPU 限制大于 CPU 請(qǐng)求,你可以完成兩件事:

  • Pod 可能會(huì)有突發(fā)性的活動(dòng),它可以利用碰巧可用的 CPU 資源。
  • Pod 在突發(fā)負(fù)載期間可以使用的 CPU 資源數(shù)量仍被限制為合理的數(shù)量。

清理

刪除名稱空間:

kubectl delete namespace cpu-example


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)