W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本頁面展示如何為容器設(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è)名字空間,以便將 本練習(xí)中創(chuàng)建的資源與集群的其余部分資源隔離。
kubectl create namespace cpu-example
要為容器指定 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 單位度量。Kubernetes 中的一個(gè) CPU 等同于:
小數(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
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 限制,則會(huì)發(fā)生以下情況之一:
如果你為容器指定了 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)求。
通過配置你的集群中運(yùn)行的容器的 CPU 請(qǐng)求和限制,你可以有效利用集群上可用的 CPU 資源。 通過將 Pod CPU 請(qǐng)求保持在較低水平,可以使 Pod 更有機(jī)會(huì)被調(diào)度。 通過使 CPU 限制大于 CPU 請(qǐng)求,你可以完成兩件事:
刪除名稱空間:
kubectl delete namespace cpu-example
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: