配置名稱空間的記憶體和 CPU 配額

定義名稱空間的整體記憶體和 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

下一步

致叢集管理員

致應用開發者

最後修改於 2024 年 10 月 30 日下午 5:17 PST:KEP 2837:Pod 級別資源 Alpha (0374213f57)