為命名空間配置預設記憶體請求與限制

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

本頁說明如何為命名空間配置預設記憶體請求與限制。

Kubernetes 叢集可以劃分為命名空間。一旦您擁有一個具有預設記憶體限制的命名空間,然後您嘗試建立一個 Pod,其容器未指定自己的記憶體限制,則控制平面會將預設記憶體限制指派給該容器。

在某些情況下,Kubernetes 會指派預設記憶體請求,本主題稍後會說明這些情況。

準備開始

您需要有一個 Kubernetes 叢集,並且必須將 kubectl 命令列工具配置為與您的叢集通訊。建議在至少有兩個非作為控制平面主機的節點的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用這些 Kubernetes 體驗場景之一

您必須具有在叢集中建立命名空間的權限。

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

建立命名空間

建立命名空間,以便您在此練習中建立的資源與叢集的其餘部分隔離。

kubectl create namespace default-mem-example

建立 LimitRange 與 Pod

以下範例展示了 LimitRange 的 Manifest 檔案。此 Manifest 檔案指定了預設的記憶體請求和預設的記憶體限制。

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

在 default-mem-example 命名空間中建立 LimitRange

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

現在,如果您在 default-mem-example 命名空間中建立 Pod,且該 Pod 內部的任何容器沒有指定自己的記憶體請求和記憶體限制值,則控制平面會套用預設值:記憶體請求為 256MiB,記憶體限制為 512MiB。

以下範例展示了一個包含一個容器的 Pod 的 Manifest 檔案。此容器未指定記憶體請求和限制。

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 的 Manifest 檔案。此容器指定了記憶體限制,但未指定請求。

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 的 Manifest 檔案。此容器指定了記憶體請求,但未指定限制。

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

輸出結果顯示容器的記憶體請求設定為容器 Manifest 檔案中指定的值。容器被限制最多使用 512MiB 的記憶體,這與命名空間的預設記憶體限制相符。

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

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

如果您的命名空間已設定記憶體資源配額,則設定記憶體限制的預設值會很有幫助。以下是資源配額對命名空間施加的三個限制:

  • 對於在命名空間中執行的每個 Pod,Pod 及其每個容器都必須具有記憶體限制。(如果您為 Pod 中的每個容器指定記憶體限制,Kubernetes 可以透過加總其容器的限制來推斷 Pod 層級的記憶體限制)。
  • 記憶體限制會在 Pod 排程的節點上套用資源預留。命名空間中所有 Pod 預留的記憶體總量不得超過指定的限制。
  • 命名空間中所有 Pod 實際使用的記憶體總量也不得超過指定的限制。

當您新增 LimitRange 時

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

清理

刪除您的命名空間

kubectl delete namespace default-mem-example

下一步

對於叢集管理者

對於應用程式開發者

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