為命名空間配置記憶體和 CPU 配額

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

下一步

給叢集管理員

給應用程式開發者

上次修改時間:2024 年 10 月 30 日下午 5:17 PST:KEP 2837: Pod Level Resources Alpha (0374213f57)