為命名空間配置最小和最大 CPU 限制

為命名空間定義有效的 CPU 資源限制範圍,以便該命名空間中的每個新 Pod 都落在您配置的範圍內。

本頁說明如何在命名空間中為容器和 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 限制。

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

下一步

針對叢集管理員

針對應用程式開發人員

上次修改時間為 2024 年 10 月 30 日下午 5:17 PST:KEP 2837:Pod 層級資源 Alpha (0374213f57)