配置名稱空間的記憶體和 CPU 配額
此頁面展示瞭如何為在 名稱空間 中執行的所有 Pod 定義記憶體和 CPU 總量的配額。你可以在 ResourceQuota 物件中指定配額。
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不是控制平面主機的節點組成的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練場之一
你必須有權在叢集中建立名稱空間。
叢集中的每個節點必須至少有 1 GiB 記憶體。
建立名稱空間
建立一個名稱空間,以便你在本練習中建立的資源與叢集的其餘部分隔離。
kubectl create namespace quota-mem-cpu-example
建立一個 ResourceQuota
以下是一個 ResourceQuota 示例的清單
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 示例的清單
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 的清單
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"
在清單中,你可以看到該 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