配置名稱空間的預設 CPU 請求和限制

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

本頁面展示瞭如何為一個名稱空間配置預設的 CPU 請求和限制。

Kubernetes 叢集可以劃分為名稱空間。如果你在一個具有預設 CPU 限制的名稱空間中建立一個 Pod,並且該 Pod 中的任何容器都沒有指定自己的 CPU 限制,那麼控制平面將為該容器分配預設的 CPU 限制。

Kubernetes 會分配一個預設的 CPU 請求,但僅在某些條件下(本頁稍後會解釋)。

準備工作

你需要有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練場之一:

你必須有權在叢集中建立名稱空間。

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

建立名稱空間

建立一個名稱空間,以便你在本練習中建立的資源與叢集的其餘部分隔離。

kubectl create namespace default-cpu-example

建立一個 LimitRange 和一個 Pod

這是一個示例 LimitRange 的清單。該清單指定了預設的 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 的清單。該容器未指定 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 的唯一容器的 CPU 請求為 500m cpu(可以讀作“500 毫核”),CPU 限制為 1 cpu。這些是 LimitRange 指定的預設值。

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

如果只指定了容器的限制,但未指定其請求怎麼辦?

這是一個包含一個容器的 Pod 的清單。該容器指定了 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 限制匹配。請注意,該容器未被分配 0.5 cpu 的預設 CPU 請求值。

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

如果只指定了容器的請求,但未指定其限制怎麼辦?

這是一個包含一個容器的 Pod 的示例清單。該容器指定了 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 時指定的值(換句話說:它與清單匹配)。然而,同一容器的 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 級別資源 Alpha (0374213f57)