配置名稱空間的最小和最大 CPU 約束

定義 Namespace 的有效 CPU 資源限制範圍,以便該 Namespace 中的每個新 Pod 都落在你配置的範圍內。

本頁面展示如何為 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 限制。

以下是包含一個容器的 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

下一步

致叢集管理員

致應用開發者

最後修改於 2024 年 10 月 30 日下午 5:17 PST:KEP 2837:Pod 級別資源 Alpha (0374213f57)