為命名空間配置記憶體和 CPU 配額
本頁面說明如何為命名空間中執行的所有 Pod 設定可用於總記憶體和 CPU 量的配額。命名空間。您可以在 ResourceQuota 物件中指定配額。
準備開始
您需要有一個 Kubernetes 叢集,並且必須將 kubectl 命令列工具配置為與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 實驗環境之一
您必須具有在叢集中建立命名空間的權限。
您叢集中的每個節點都必須至少有 1 GiB 的記憶體。
建立命名空間
建立命名空間,以便您在本練習中建立的資源與叢集的其餘部分隔離。
kubectl create namespace quota-mem-cpu-example
建立 ResourceQuota
以下是範例 ResourceQuota 的 Manifest
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
建立 ResourceQuota
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
檢視關於 ResourceQuota 的詳細資訊
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
ResourceQuota 對 quota-mem-cpu-example 命名空間提出了以下要求
- 對於命名空間中的每個 Pod,每個容器都必須具有記憶體請求、記憶體限制、CPU 請求和 CPU 限制。
- 該命名空間中所有 Pod 的記憶體請求總計不得超過 1 GiB。
- 該命名空間中所有 Pod 的記憶體限制總計不得超過 2 GiB。
- 該命名空間中所有 Pod 的 CPU 請求總計不得超過 1 個 CPU。
- 該命名空間中所有 Pod 的 CPU 限制總計不得超過 2 個 CPU。
請參閱 CPU 的含義,以了解 Kubernetes 中「1 個 CPU」的含義。
建立 Pod
以下是範例 Pod 的 Manifest
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
建立 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
驗證 Pod 是否正在執行,以及其(唯一)容器是否健康
kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example
再次檢視關於 ResourceQuota 的詳細資訊
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
輸出顯示配額以及已使用的配額量。您可以看到您的 Pod 的記憶體和 CPU 請求及限制未超過配額。
status:
hard:
limits.cpu: "2"
limits.memory: 2Gi
requests.cpu: "1"
requests.memory: 1Gi
used:
limits.cpu: 800m
limits.memory: 800Mi
requests.cpu: 400m
requests.memory: 600Mi
如果您有 jq
工具,您也可以查詢(使用 JSONPath)僅查詢 used
值,**並**美化列印輸出。例如
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example -o jsonpath='{ .status.used }' | jq .
嘗試建立第二個 Pod
以下是第二個 Pod 的 Manifest
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
在 Manifest 中,您可以看到 Pod 的記憶體請求為 700 MiB。請注意,已使用的記憶體請求和此新記憶體請求的總和超過了記憶體請求配額:600 MiB + 700 MiB > 1 GiB。
嘗試建立 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example
第二個 Pod 未建立。輸出顯示,建立第二個 Pod 將導致記憶體請求總計超過記憶體請求配額。
Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml":
pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo,
requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi
討論
如同你在本練習中所見,你可以使用 ResourceQuota 來限制命名空間中所有 Pod 執行的記憶體請求總量。你也可以限制記憶體限制、CPU 請求和 CPU 限制的總量。
除了管理命名空間內的總資源使用量,你可能還想限制個別的 Pod 或這些 Pod 中的容器。若要達成那種限制,請使用 LimitRange。
清理
刪除你的命名空間
kubectl delete namespace quota-mem-cpu-example