分配 Pod 級別的 CPU 和記憶體資源

特性狀態: Kubernetes v1.34 [beta] (預設啟用:true)

本頁面展示瞭如何除了在容器級別指定資源外,還在 Pod 級別為 Pod 指定 CPU 和記憶體資源。Kubernetes 節點根據 Pod 的資源請求為 Pod 分配資源。這些請求可以在 Pod 級別或 Pod 內的各個容器中定義。當兩者都存在時,Pod 級別的請求具有優先權。

同樣,Pod 的資源使用受限於限制,這些限制也可以在 Pod 級別或 Pod 內的各個容器中設定。同樣,當兩者都存在時,Pod 級別的限制具有優先權。這允許靈活的資源管理,使您能夠在 Pod 和容器級別控制資源分配。

為了在 Pod 級別指定資源,需要啟用 PodLevelResources Feature Gate

針對 Pod 級別資源

  • 優先順序:當 Pod 級別和容器級別資源都指定時,Pod 級別資源優先。
  • QoS:Pod 級別資源在影響 Pod 的 QoS 類別方面具有優先權。
  • OOM Score:OOM 分數調整計算同時考慮 Pod 級別和容器級別資源。
  • 相容性:Pod 級別資源旨在與現有功能相容。

準備工作

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

你的 Kubernetes 伺服器版本必須是 1.34 或更高版本。

要檢查版本,請輸入 kubectl version

必須為你的控制平面和叢集中的所有節點啟用 PodLevelResources 功能門控

限制

對於 Kubernetes 1.34,調整 Pod 級別資源具有以下限制:

  • 資源型別: Pod 級別只能指定 CPU、記憶體和 Hugepages 資源。
  • 作業系統: Pod 級別資源不支援 Windows Pod。
  • 資源管理器: 拓撲管理器、記憶體管理器和 CPU 管理器不會根據 Pod 級別資源對 Pod 和容器進行對齊,因為這些資源管理器目前不支援 Pod 級別資源。
  • 原地擴縮容 不支援原地擴縮容 Pod 級別資源。修改 Pod 上的 Pod 級別資源限制或請求會導致 field.Forbidden 錯誤。錯誤訊息明確指出:“具有 Pod 級別資源的 Pod 無法進行擴縮容。”

建立名稱空間

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

kubectl create namespace pod-resources-example

建立一個具有 Pod 級別記憶體請求和限制的 Pod

要在 Pod 級別為 Pod 指定記憶體請求,請在 Pod 規格清單中包含 resources.requests.memory 欄位。要指定記憶體限制,請包含 resources.limits.memory

在此練習中,你將建立一個包含一個容器的 Pod。該 Pod 的記憶體請求為 100 MiB,記憶體限制為 200 MiB。以下是該 Pod 的配置檔案:

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: pod-resources-example
spec:
  resources:
    requests:
      memory: "100Mi"
    limits:
      memory: "200Mi"
  containers:
  - name: memory-demo-ctr
    image: nginx
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

清單中的 args 部分為容器啟動時提供引數。"--vm-bytes", "150M" 引數指示容器嘗試分配 150 MiB 記憶體。

建立 Pod

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-memory-request-limit.yaml --namespace=pod-resources-example

驗證 Pod 是否正在執行

kubectl get pod memory-demo --namespace=pod-resources-example

檢視 Pod 的詳細資訊

kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example

輸出顯示 Pod 的記憶體請求為 100 MiB,記憶體限制為 200 MiB。

...
spec: 
  containers:    
  ...
  resources:
    requests:
      memory: 100Mi
    limits:
      memory: 200Mi
...

執行 kubectl top 獲取 Pod 的指標。

kubectl top pod memory-demo --namespace=pod-resources-example

輸出顯示 Pod 正在使用大約 162,900,000 位元組的記憶體,大約 150 MiB。這大於 Pod 的 100 MiB 請求,但在 Pod 的 200 MiB 限制之內。

NAME                        CPU(cores)   MEMORY(bytes)
memory-demo                 <something>  162856960

建立一個具有 Pod 級別 CPU 請求和限制的 Pod

要在 Pod 級別為 Pod 指定 CPU 請求,請在 Pod 規格清單中包含 resources.requests.cpu 欄位。要指定 CPU 限制,請包含 resources.limits.cpu

在此練習中,你將建立一個包含一個容器的 Pod。該 Pod 的請求為 0.5 CPU,限制為 1 CPU。以下是該 Pod 的配置檔案:

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: pod-resources-example
spec:
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: "0.5"
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    args:
    - -cpus
    - "2"

配置檔案的 args 部分為容器啟動時提供引數。-cpus "2" 引數指示容器嘗試使用 2 個 CPU。

建立 Pod

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-cpu-request-limit.yaml --namespace=pod-resources-example

驗證 Pod 是否正在執行

kubectl get pod cpu-demo --namespace=pod-resources-example

檢視 Pod 的詳細資訊

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

輸出顯示 Pod 的 CPU 請求為 500 milliCPU,CPU 限制為 1 CPU。

spec:
  containers:
  ...
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 500m

使用 kubectl top 獲取 Pod 的度量資料。

kubectl top pod cpu-demo --namespace=pod-resources-example

此示例輸出顯示 Pod 正在使用 974 milliCPU,略低於 Pod 配置中指定的 1 CPU 限制。

NAME                        CPU(cores)   MEMORY(bytes)
cpu-demo                    974m         <something>

回想一下,透過設定 -cpu "2",你將容器配置為嘗試使用 2 個 CPU,但容器只被允許使用大約 1 個 CPU。由於容器嘗試使用的 CPU 資源超過了 Pod CPU 限制,因此容器的 CPU 使用受到了限制。

建立在 Pod 級別和容器級別都具有資源請求和限制的 Pod

要為 Pod 分配 CPU 和記憶體資源,你可以在 Pod 級別和容器級別同時指定它們。在 Pod 規格中包含 resources 欄位,以定義整個 Pod 的資源。此外,在 Pod 清單中容器的規格內包含 resources 欄位,以設定容器特定的資源要求。

在此練習中,你將建立一個包含兩個容器的 Pod,以探索 Pod 級別和容器級別資源規範的互動。Pod 本身將定義 CPU 請求和限制,而其中一個容器將擁有自己的顯式資源請求和限制。另一個容器將繼承 Pod 級別設定的資源約束。以下是 Pod 的配置檔案:

apiVersion: v1
kind: Pod
metadata:
  name: pod-resources-demo
  namespace: pod-resources-example
spec:
  resources:
    limits:
      cpu: "1"
      memory: "200Mi"
    requests:
      cpu: "1"
      memory: "100Mi"
  containers:
  - name: pod-resources-demo-ctr-1
    image: nginx
    resources:
      limits:
        cpu: "0.5"
        memory: "100Mi"
      requests:
        cpu: "0.5"
        memory: "50Mi"
  - name: pod-resources-demo-ctr-2
    image: fedora
    command:
    - sleep
    - inf 

建立 Pod

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-resources.yaml --namespace=pod-resources-example

驗證 Pod 容器是否正在執行

kubectl get pod-resources-demo --namespace=pod-resources-example

檢視 Pod 的詳細資訊

kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example

輸出顯示,Pod 中的一個容器的記憶體請求為 50 MiB,CPU 請求為 0.5 核,記憶體限制為 100 MiB,CPU 限制為 0.5 核。Pod 本身的記憶體請求為 100 MiB,CPU 請求為 1 核,記憶體限制為 200 MiB,CPU 限制為 1 核。

...
containers:
  name: pod-resources-demo-ctr-1
  resources:
      requests:
        cpu: 500m
        memory: 50Mi
      limits:
        cpu: 500m
        memory: 100Mi
  ...
  name: pod-resources-demo-ctr-2
  resources: {}  
resources:
  limits:
      cpu: 1
      memory: 200Mi
    requests:
      cpu: 1
      memory: 100Mi
...

由於指定了 Pod 級別的請求和限制,Pod 中兩個容器的請求保證都將等於 1 核 CPU 和 100Mi 記憶體。此外,兩個容器的總資源使用量不能超過 Pod 級別限制中指定的值,確保它們總共不能超過 200 MiB 記憶體和 1 核 CPU。

清理

刪除你的名稱空間

kubectl delete namespace pod-resources-example

下一步

針對應用程式開發者

致叢集管理員

上次修改於 2025 年 7 月 3 日太平洋標準時間上午 6:28:1.34 版本 Pod 級別資源文件更新 (b4175eb858)