為命名空間配置預設記憶體請求與限制
本頁說明如何為命名空間配置預設記憶體請求與限制。
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
注意
LimitRange
**不會**檢查其套用的預設值的一致性。這表示 LimitRange
設定的限制預設值可能小於用戶端提交給 API 伺服器的規格中為容器指定的請求值。如果發生這種情況,最終的 Pod 將無法排程。請參閱資源限制和請求的約束以取得更多詳細資訊。預設記憶體限制和請求的動機
如果您的命名空間已設定記憶體資源配額,則設定記憶體限制的預設值會很有幫助。以下是資源配額對命名空間施加的三個限制:
- 對於在命名空間中執行的每個 Pod,Pod 及其每個容器都必須具有記憶體限制。(如果您為 Pod 中的每個容器指定記憶體限制,Kubernetes 可以透過加總其容器的限制來推斷 Pod 層級的記憶體限制)。
- 記憶體限制會在 Pod 排程的節點上套用資源預留。命名空間中所有 Pod 預留的記憶體總量不得超過指定的限制。
- 命名空間中所有 Pod 實際使用的記憶體總量也不得超過指定的限制。
當您新增 LimitRange 時
如果該命名空間中包含容器的任何 Pod 沒有指定自己的記憶體限制,控制平面會將預設記憶體限制套用於該容器,且 Pod 可以被允許在受記憶體 ResourceQuota 限制的命名空間中執行。
清理
刪除您的命名空間
kubectl delete namespace default-mem-example