配置名稱空間的最小和最大 CPU 約束
本頁面展示如何為 namespace 中的容器和 Pod 使用的 CPU 資源設定最小和最大值。你在 LimitRange 物件中指定最小和最大 CPU 值。如果 Pod 不滿足 LimitRange 施加的約束,則無法在 Namespace 中建立該 Pod。
準備工作
你需要有一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不充當控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練環境之一
你必須有權在叢集中建立名稱空間。
叢集中的每個節點必須至少有 1.0 個 CPU 可用於 Pod。有關 Kubernetes 中“1 CPU”的含義,請參見 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 Namespace 中建立 Pod(或 Kubernetes API 的其他客戶端建立等效 Pod)時,Kubernetes 會執行以下步驟
如果 Pod 中的任何容器未指定其自己的 CPU 請求和限制,則控制平面將預設 CPU 請求和限制分配給該容器。
驗證該 Pod 中的每個容器是否都指定了一個大於或等於 200 毫核的 CPU 請求。
驗證該 Pod 中的每個容器是否都指定了一個小於或等於 800 毫核的 CPU 限制。
注意
建立LimitRange
物件時,你還可以指定大頁或 GPU 的限制。但是,當這些資源同時指定 default
和 defaultRequest
時,這兩個值必須相同。以下是包含一個容器的 Pod 的清單。容器清單指定 500 毫核的 CPU 請求和 800 毫核的 CPU 限制。這些值滿足此 Namespace 的 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 毫核,CPU 限制為 800 毫核。這些值滿足 LimitRange 施加的約束。
resources:
limits:
cpu: 800m
requests:
cpu: 500m
刪除 Pod
kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example
嘗試建立一個超過最大 CPU 約束的 Pod
以下是包含一個容器的 Pod 的清單。該容器指定 500 毫核的 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"
嘗試建立 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 的清單。該容器指定 100 毫核的 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 的清單。該容器未指定 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 的單個容器的 CPU 請求為 800 毫核,CPU 限制為 800 毫核。該容器是如何獲得這些值的?
resources:
limits:
cpu: 800m
requests:
cpu: 800m
因為該容器未指定其自己的 CPU 請求和限制,所以控制平面應用了此 Namespace 的 LimitRange 中的預設 CPU 請求和限制。
此時,你的 Pod 可能正在執行,也可能沒有。回想一下,此任務的先決條件是你的節點必須至少有 1 個 CPU 可供使用。如果你的每個節點只有 1 個 CPU,那麼可能沒有足夠的可用 CPU 來滿足 800 毫核的請求。如果你碰巧使用的是 2 個 CPU 的節點,那麼你可能有足夠的 CPU 來滿足 800 毫核的請求。
刪除你的 Pod
kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example
強制執行最小和最大 CPU 約束
LimitRange 對 Namespace 施加的最大和最小 CPU 約束僅在建立或更新 Pod 時強制執行。如果你更改 LimitRange,它不會影響以前建立的 Pod。
最小和最大 CPU 約束的動機
作為叢集管理員,你可能希望對 Pod 可以使用的 CPU 資源施加限制。例如
叢集中的每個節點都有 2 個 CPU。你不希望接受任何請求超過 2 個 CPU 的 Pod,因為叢集中沒有節點可以支援該請求。
叢集由生產部門和開發部門共享。你希望允許生產工作負載消耗最多 3 個 CPU,但希望開發工作負載限制為 1 個 CPU。你為生產和開發建立單獨的 Namespace,並對每個 Namespace 應用 CPU 約束。
清理
刪除你的名稱空間
kubectl delete namespace constraints-cpu-example