W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
本頁介紹如何為命名空間中的容器和 Pod 設(shè)置其所使用的 CPU 資源的最小和最大值。 你可以通過 LimitRange 對象聲明 CPU 的最小和最大值. 如果 Pod 不能滿足 LimitRange 的限制,就無法在該命名空間中被創(chuàng)建。
你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
在你的集群里你必須要有創(chuàng)建命名空間的權(quán)限。
集群中的每個(gè)節(jié)點(diǎn)都必須至少有 1.0 個(gè) CPU 可供 Pod 使用。
創(chuàng)建一個(gè)命名空間,以便本練習(xí)中創(chuàng)建的資源和集群的其余資源相隔離。
kubectl create namespace constraints-cpu-example
以下為 LimitRange 的示例清單:
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo-lr
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "200m"
type: Container
創(chuàng)建 LimitRange:
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints.yaml --namespace=constraints-cpu-example
查看 LimitRange 詳情:
kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example
輸出結(jié)果顯示 CPU 的最小和最大限制符合預(yù)期。但需要注意的是,盡管你在 LimitRange 的配置文件中你沒有聲明默認(rèn)值,默認(rèn)值也會被自動創(chuàng)建。
limits:
- default:
cpu: 800m
defaultRequest:
cpu: 800m
max:
cpu: 800m
min:
cpu: 200m
type: Container
現(xiàn)在,每當(dāng)你在 constraints-mem-example 命名空間中創(chuàng)建 Pod 時(shí),或者某些其他的 Kubernetes API 客戶端創(chuàng)建了等價(jià)的 Pod 時(shí),Kubernetes 就會執(zhí)行下面的步驟:
Note: 當(dāng)創(chuàng)建 LimitRange 對象時(shí),你也可以聲明大頁面和 GPU 的限制。 當(dāng)這些資源同時(shí)聲明了 'default' 和 'defaultRequest' 參數(shù)時(shí),兩個(gè)參數(shù)值必須相同。
以下為某個(gè)僅包含一個(gè)容器的 Pod 的清單。 該容器聲明了 CPU 請求 500 millicpu 和 CPU 限制 800 millicpu 。 這些參數(shù)滿足了 LimitRange 對象規(guī)定的 CPU 最小和最大限制。
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo
spec:
containers:
- name: constraints-cpu-demo-ctr
image: nginx
resources:
limits:
cpu: "800m"
requests:
cpu: "500m"
創(chuàng)建 Pod:
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod.yaml --namespace=constraints-cpu-example
確認(rèn) Pod 正在運(yùn)行,并且其容器處于健康狀態(tài):
kubectl get pod constraints-cpu-demo --namespace=constraints-cpu-example
查看 Pod 的詳情:
kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example
輸出結(jié)果顯示該 Pod 的容器的 CPU 請求為 500 millicpu,CPU 限制為 800 millicpu。 這些參數(shù)滿足 LimitRange 規(guī)定的限制范圍。
resources:
limits:
cpu: 800m
requests:
cpu: 500m
kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example
這里給出了包含一個(gè)容器的 Pod 的配置文件。容器聲明了 500 millicpu 的 CPU 請求和 1.5 CPU 的 CPU 限制。
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo-2
spec:
containers:
- name: constraints-cpu-demo-2-ctr
image: nginx
resources:
limits:
cpu: "1.5"
requests:
cpu: "500m"
嘗試創(chuàng)建 Pod:
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example
輸出結(jié)果表明 Pod 沒有創(chuàng)建成功,因?yàn)槠渲卸x了一個(gè)無法被接受的容器。 該容器之所以無法被接受是因?yàn)槠渲性O(shè)定了過高的 CPU 限制值:
Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-2.yaml":
pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m.
以下為某個(gè)只有一個(gè)容器的 Pod 的清單。該容器聲明了 CPU 請求 100 millicpu 和 CPU 限制 800 millicpu。
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo-3
spec:
containers:
- name: constraints-cpu-demo-3-ctr
image: nginx
resources:
limits:
cpu: "800m"
requests:
cpu: "100m"
嘗試創(chuàng)建 Pod:
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example
輸出結(jié)果顯示 Pod 沒有創(chuàng)建成功,因?yàn)槠渲卸x了一個(gè)無法被接受的容器。 該容器無法被接受的原因是其中所設(shè)置的 CPU 請求小于最小值的限制:
Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-3.yaml":
pods "constraints-cpu-demo-4" is forbidden: minimum cpu usage per Container is 200m, but request is 100m.
以下為一個(gè)只有一個(gè)容器的 Pod 的清單。該容器沒有聲明 CPU 請求,也沒有聲明 CPU 限制。
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo-4
spec:
containers:
- name: constraints-cpu-demo-4-ctr
image: vish/stress
創(chuàng)建 Pod:
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-4.yaml --namespace=constraints-cpu-example
查看 Pod 的詳情:
kubectl get pod constraints-cpu-demo-4 --namespace=constraints-cpu-example --output=yaml
輸出結(jié)果顯示 Pod 的唯一容器的 CPU 請求為 800 millicpu,CPU 限制為 800 millicpu。
容器是怎樣獲得這些數(shù)值的呢?
resources:
limits:
cpu: 800m
requests:
cpu: 800m
因?yàn)檫@一容器沒有聲明自己的 CPU 請求和限制, 控制面會根據(jù)命名空間中配置 LimitRange 設(shè)置默認(rèn)的 CPU 請求和限制。
此時(shí),你的 Pod 可能已經(jīng)運(yùn)行起來也可能沒有運(yùn)行起來。 回想一下我們本次任務(wù)的先決條件是你的每個(gè)節(jié)點(diǎn)都至少有 1 CPU。 如果你的每個(gè)節(jié)點(diǎn)都只有 1 CPU,那將沒有一個(gè)節(jié)點(diǎn)擁有足夠的可分配 CPU 來滿足 800 millicpu 的請求。 如果你在用的節(jié)點(diǎn)恰好有 2 CPU,那么有可能有足夠的 CPU 來滿足 800 millicpu 的請求。
kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example
只有當(dāng) Pod 創(chuàng)建或者更新時(shí),LimitRange 為命名空間規(guī)定的 CPU 最小和最大限制才會被強(qiáng)制執(zhí)行。 如果你對 LimitRange 進(jìn)行修改,那不會影響此前創(chuàng)建的 Pod。
作為集群管理員,你可能想設(shè)定 Pod 可以使用的 CPU 資源限制。例如:
刪除你的命名空間:
kubectl delete namespace constraints-cpu-example
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: