配置名稱空間的預設記憶體請求和限制

為 Namespace 定義預設記憶體資源限制,以便該 Namespace 中的每個新 Pod 都配置記憶體資源限制。

本頁介紹如何為 Namespace 配置預設記憶體請求和限制。

一個 Kubernetes 叢集可以劃分為多個 Namespace。如果一個 Namespace 配置了預設記憶體限制,而你試圖建立一個 Pod,其中容器未指定自己的記憶體限制,那麼控制平面將為該容器分配預設記憶體限制。

Kubernetes 在某些條件下會分配預設記憶體請求,本主題稍後將對此進行解釋。

準備工作

你必須擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 操場:

你必須有權在叢集中建立名稱空間。

叢集中的每個節點必須至少有 2 GiB 記憶體。

建立名稱空間

建立一個名稱空間,以便你在本練習中建立的資源與叢集的其餘部分隔離。

kubectl create namespace default-mem-example

建立一個 LimitRange 和一個 Pod

以下是一個示例 LimitRange 的清單。此清單指定了預設記憶體請求和預設記憶體限制。

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

在 default-mem-example Namespace 中建立 LimitRange。

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults.yaml --namespace=default-mem-example

現在,如果你在 default-mem-example Namespace 中建立一個 Pod,並且該 Pod 中的任何容器都沒有指定自己的記憶體請求和記憶體限制值,那麼控制平面將應用預設值:記憶體請求為 256MiB,記憶體限制為 512MiB。

以下是一個包含一個容器的 Pod 的示例清單。該容器未指定記憶體請求和限制。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx

建立 Pod。

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example

檢視 Pod 的詳細資訊

kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example

輸出顯示 Pod 的容器具有 256 MiB 的記憶體請求和 512 MiB 的記憶體限制。這些是 LimitRange 指定的預設值。

containers:
- image: nginx
  imagePullPolicy: Always
  name: default-mem-demo-ctr
  resources:
    limits:
      memory: 512Mi
    requests:
      memory: 256Mi

刪除你的 Pod

kubectl delete pod default-mem-demo --namespace=default-mem-example

如果你指定了容器的限制,但未指定其請求,會發生什麼?

以下是一個包含一個容器的 Pod 的清單。該容器指定了記憶體限制,但未指定請求。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-2
spec:
  containers:
  - name: default-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1Gi"

建立 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example

檢視 Pod 的詳細資訊

kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example

輸出顯示容器的記憶體請求被設定為與其記憶體限制匹配。請注意,該容器未被分配 256Mi 的預設記憶體請求值。

resources:
  limits:
    memory: 1Gi
  requests:
    memory: 1Gi

如果你指定了容器的請求,但未指定其限制,會發生什麼?

以下是一個包含一個容器的 Pod 的清單。該容器指定了記憶體請求,但未指定限制。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        memory: "128Mi"

建立 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example

檢視 Pod 的規範。

kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example

輸出顯示容器的記憶體請求被設定為容器清單中指定的值。該容器的記憶體使用限制為 512MiB,與該名稱空間的預設記憶體限制相匹配。

resources:
  limits:
    memory: 512Mi
  requests:
    memory: 128Mi

預設記憶體限制和請求的動機

如果你的 Namespace 配置了記憶體資源配額,那麼設定記憶體限制的預設值會很有幫助。以下是資源配額對 Namespace 施加的三個限制:

  • 對於在該 Namespace 中執行的每個 Pod,Pod 及其每個容器都必須有記憶體限制。(如果為 Pod 中的每個容器都指定了記憶體限制,Kubernetes 可以透過將其容器的限制相加來推斷 Pod 級別的記憶體限制)。
  • 記憶體限制對 Pod 排程到的節點施加資源保留。Namespace 中所有 Pod 保留的記憶體總量不能超過指定限制。
  • Namespace 中所有 Pod 實際使用的記憶體總量也不能超過指定限制。

當你新增 LimitRange 時:

如果該名稱空間中包含容器的任何 Pod 未指定自己的記憶體限制,控制平面會將預設記憶體限制應用於該容器,並且該 Pod 可以被允許在受記憶體 ResourceQuota 限制的名稱空間中執行。

清理

刪除你的名稱空間

kubectl delete namespace default-mem-example

下一步

致叢集管理員

致應用開發者

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