為命名空間配置預設 CPU 請求和限制

為命名空間定義預設 CPU 資源限制,以便該命名空間中的每個新 Pod 都已配置 CPU 資源限制。

本頁說明如何為命名空間配置預設 CPU 請求和限制。

Kubernetes 叢集可以劃分為命名空間。如果您在具有預設 CPU限制的命名空間中建立 Pod,並且該 Pod 中的任何容器未指定自己的 CPU 限制,則控制平面會將預設 CPU 限制指派給該容器。

Kubernetes 會指派預設 CPU請求,但僅在稍後在本頁中說明的特定條件下。

準備開始

您需要有一個 Kubernetes 叢集,並且必須配置 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且不充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用minikube建立一個,或者您可以使用這些 Kubernetes Playground 之一

您必須具有在叢集中建立命名空間的權限。

如果您尚不熟悉 Kubernetes 中 1.0 CPU 的含義,請閱讀CPU 的含義

建立命名空間

建立命名空間,以便將您在此練習中建立的資源與叢集的其餘部分隔離。

kubectl create namespace default-cpu-example

建立 LimitRange 和 Pod

這是一個範例 LimitRange 的 Manifest 檔案。此 Manifest 檔案指定預設的 CPU 請求和預設的 CPU 限制。

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container

在 default-cpu-example 命名空間中建立 LimitRange

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --namespace=default-cpu-example

現在,如果您在 default-cpu-example 命名空間中建立 Pod,且該 Pod 中的任何容器未指定其自身的 CPU 請求和 CPU 限制值,則控制平面會套用預設值:CPU 請求為 0.5,預設 CPU 限制為 1。

這是一個 Pod 的 Manifest 檔案,其中包含一個容器。該容器未指定 CPU 請求和限制。

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo
spec:
  containers:
  - name: default-cpu-demo-ctr
    image: nginx

建立 Pod。

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod.yaml --namespace=default-cpu-example

檢視 Pod 的規格

kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example

輸出顯示 Pod 中唯一的容器具有 500m cpu 的 CPU 請求(您可以理解為 “500 毫 CPU”),以及 1 cpu 的 CPU 限制。這些是 LimitRange 指定的預設值。

containers:
- image: nginx
  imagePullPolicy: Always
  name: default-cpu-demo-ctr
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 500m

如果您指定容器的限制,但不指定其請求,會發生什麼情況?

這是一個 Pod 的 Manifest 檔案,其中包含一個容器。該容器指定了 CPU 限制,但未指定請求。

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo-2
spec:
  containers:
  - name: default-cpu-demo-2-ctr
    image: nginx
    resources:
      limits:
        cpu: "1"

建立 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml --namespace=default-cpu-example

檢視您建立的 Pod 的規格

kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example

輸出顯示容器的 CPU 請求設定為與其 CPU 限制相符。請注意,容器未被指派預設的 CPU 請求值 0.5 cpu

resources:
  limits:
    cpu: "1"
  requests:
    cpu: "1"

如果您指定容器的請求,但不指定其限制,會發生什麼情況?

這是一個範例 Pod 的 Manifest 檔案,其中包含一個容器。該容器指定了 CPU 請求,但未指定限制。

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo-3
spec:
  containers:
  - name: default-cpu-demo-3-ctr
    image: nginx
    resources:
      requests:
        cpu: "0.75"

建立 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml --namespace=default-cpu-example

檢視您建立的 Pod 的規格

kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example

輸出顯示容器的 CPU 請求設定為您在建立 Pod 時指定的值(換句話說:它與 Manifest 檔案相符)。但是,同一個容器的 CPU 限制設定為 1 cpu,這是該命名空間的預設 CPU 限制。

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 750m

預設 CPU 限制和請求的動機

如果您的命名空間已設定 CPU 資源配額,則設定 CPU 限制的預設值會很有幫助。以下是 CPU 資源配額對命名空間施加的兩個限制:

  • 對於在命名空間中執行的每個 Pod,其每個容器都必須具有 CPU 限制。
  • CPU 限制會在 Pod 實際排程的節點上套用資源保留。為命名空間中所有 Pod 保留使用的 CPU 總量不得超過指定的限制。

當您新增 LimitRange 時

如果該命名空間中包含容器的任何 Pod 未指定其自身的 CPU 限制,則控制平面會將預設 CPU 限制套用於該容器,並且可以允許 Pod 在受 CPU ResourceQuota 限制的命名空間中執行。

清除

刪除您的命名空間

kubectl delete namespace default-cpu-example

下一步

對於叢集管理員

對於應用程式開發人員

上次修改時間:2024 年 10 月 30 日下午 5:17 PST:KEP 2837: Pod Level Resources Alpha (0374213f57)