為命名空間配置最小和最大 CPU 限制
本頁說明如何在命名空間中為容器和 Pod 設定 CPU 資源的最小值和最大值。您可以在 LimitRange 物件中指定最小和最大 CPU 值。如果 Pod 不符合 LimitRange 施加的約束,則無法在命名空間中建立它。
開始之前
您需要有一個 Kubernetes 叢集,並且必須配置 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 體驗環境
您必須具有在叢集中建立命名空間的權限。
叢集中的每個節點都必須至少有 1.0 個 CPU 可供 Pod 使用。請參閱CPU 的意義,以了解 Kubernetes 所謂的「1 個 CPU」的含義。
建立命名空間
建立命名空間,以便將您在本練習中建立的資源與叢集的其餘部分隔離。
kubectl create namespace constraints-cpu-example
建立 LimitRange 和 Pod
以下是範例 LimitRange 的資訊清單
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo-lr
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "200m"
type: Container
建立 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
輸出顯示預期的最小和最大 CPU 約束。但請注意,即使您未在 LimitRange 的組態檔中指定預設值,它們也會自動建立。
limits:
- default:
cpu: 800m
defaultRequest:
cpu: 800m
max:
cpu: 800m
min:
cpu: 200m
type: Container
現在,每當您在 constraints-cpu-example 命名空間中建立 Pod(或 Kubernetes API 的某些其他用戶端建立等效的 Pod)時,Kubernetes 都會執行以下步驟
如果該 Pod 中的任何容器未指定自己的 CPU 請求和限制,則控制平面會將預設 CPU 請求和限制指派給該容器。
驗證該 Pod 中的每個容器都指定大於或等於 200 millicpu 的 CPU 請求。
驗證該 Pod 中的每個容器都指定小於或等於 800 millicpu 的 CPU 限制。
注意
在建立LimitRange
物件時,您也可以指定對巨頁 (huge-pages) 或 GPU 的限制。但是,當在這些資源上同時指定 default
和 defaultRequest
時,這兩個值必須相同。以下是有一個容器的 Pod 的資訊清單。容器資訊清單指定 CPU 請求為 500 millicpu,CPU 限制為 800 millicpu。這些符合此命名空間的 LimitRange 施加的最小和最大 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"
建立 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod.yaml --namespace=constraints-cpu-example
驗證 Pod 是否正在執行且其容器是否健康
kubectl get pod constraints-cpu-demo --namespace=constraints-cpu-example
檢視關於 Pod 的詳細資訊
kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example
輸出顯示 Pod 的唯一容器的 CPU 請求為 500 millicpu,CPU 限制為 800 millicpu。這些符合 LimitRange 施加的約束。
resources:
limits:
cpu: 800m
requests:
cpu: 500m
刪除 Pod
kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example
嘗試建立超過最大 CPU 約束的 Pod
以下是一個 Pod 的 Manifest,其中包含一個容器。此容器指定 CPU 請求為 500 毫 CPU,以及 CPU 限制為 1.5 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"
嘗試建立 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example
輸出顯示 Pod 未被建立,因為它定義了一個不可接受的容器。該容器不可接受,因為它指定的 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.
嘗試建立一個不符合最低 CPU 請求的 Pod
以下是一個 Pod 的 Manifest,其中包含一個容器。此容器指定 CPU 請求為 100 毫 CPU,以及 CPU 限制為 800 毫 CPU。
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"
嘗試建立 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example
輸出顯示 Pod 未被建立,因為它定義了一個不可接受的容器。該容器不可接受,因為它指定的 CPU 請求低於強制執行的最小值
Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-3.yaml":
pods "constraints-cpu-demo-3" is forbidden: minimum cpu usage per Container is 200m, but request is 100m.
建立一個未指定任何 CPU 請求或限制的 Pod
以下是一個 Pod 的 Manifest,其中包含一個容器。此容器未指定 CPU 請求,也未指定 CPU 限制。
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo-4
spec:
containers:
- name: constraints-cpu-demo-4-ctr
image: vish/stress
建立 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
輸出顯示 Pod 的單一容器具有 800 毫 CPU 的 CPU 請求和 800 毫 CPU 的 CPU 限制。該容器是如何獲得這些值的?
resources:
limits:
cpu: 800m
requests:
cpu: 800m
由於該容器未指定其自身的 CPU 請求和限制,控制平面套用了此命名空間中 LimitRange 的預設 CPU 請求和限制。
此時,您的 Pod 可能正在執行,也可能沒有執行。回想一下,此任務的先決條件是您的節點必須至少有 1 個 CPU 可供使用。如果您的每個節點只有 1 個 CPU,則可能沒有足夠的可分配 CPU 在任何節點上容納 800 毫 CPU 的請求。如果您碰巧使用具有 2 個 CPU 的節點,那麼您可能擁有足夠的 CPU 來容納 800 毫 CPU 的請求。
刪除您的 Pod
kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example
強制執行最小和最大 CPU 限制
LimitRange 對命名空間施加的最大和最小 CPU 限制僅在建立或更新 Pod 時強制執行。如果您變更 LimitRange,它不會影響先前建立的 Pod。
最小和最大 CPU 限制的動機
作為叢集管理員,您可能想要對 Pod 可以使用的 CPU 資源施加限制。例如
叢集中的每個節點都有 2 個 CPU。您不希望接受任何請求超過 2 個 CPU 的 Pod,因為叢集中沒有節點可以支援該請求。
一個叢集由您的生產和開發部門共用。您希望允許生產工作負載消耗最多 3 個 CPU,但您希望開發工作負載限制為 1 個 CPU。您為生產和開發建立個別的命名空間,並將 CPU 限制套用於每個命名空間。
清除
刪除您的命名空間
kubectl delete namespace constraints-cpu-example