分配 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