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