Kubernetes 配置命名空間的最小和最大內(nèi)存約束

2022-06-06 09:37 更新

配置命名空間的最小和最大內(nèi)存約束

本頁(yè)介紹如何設(shè)置在命名空間中運(yùn)行的容器使用的內(nèi)存的最小值和最大值。 你可以在 LimitRange 對(duì)象中指定最小和最大內(nèi)存值。如果 Pod 不滿足 LimitRange 施加的約束,則無(wú)法在命名空間中創(chuàng)建它。

在開始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

在你的集群里你必須要有創(chuàng)建命名空間的權(quán)限。

集群中的每個(gè)節(jié)點(diǎn)都必須至少有 1 GiB 的內(nèi)存可供 Pod 使用。

創(chuàng)建命名空間

創(chuàng)建一個(gè)命名空間,以便在此練習(xí)中創(chuàng)建的資源與集群的其余資源隔離。

kubectl create namespace constraints-mem-example

創(chuàng)建 LimitRange 和 Pod

下面是 LimitRange 的示例清單:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-min-max-demo-lr
spec:
  limits:
  - max:
      memory: 1Gi
    min:
      memory: 500Mi
    type: Container

創(chuàng)建 LimitRange:

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

查看 LimitRange 的詳情:

kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml

輸出顯示預(yù)期的最小和最大內(nèi)存約束。 但請(qǐng)注意,即使你沒(méi)有在 LimitRange 的配置文件中指定默認(rèn)值,也會(huì)自動(dòng)創(chuàng)建它們。

  limits:
  - default:
      memory: 1Gi
    defaultRequest:
      memory: 1Gi
    max:
      memory: 1Gi
    min:
      memory: 500Mi
    type: Container

現(xiàn)在,每當(dāng)在 constraints-mem-example 命名空間中創(chuàng)建 Pod 時(shí),Kubernetes 就會(huì)執(zhí)行下面的步驟:

  • 如果 Pod 中的任何容器未聲明自己的內(nèi)存請(qǐng)求和限制,控制面將為該容器設(shè)置默認(rèn)的內(nèi)存請(qǐng)求和限制。
  • 確保該 Pod 中的每個(gè)容器的內(nèi)存請(qǐng)求至少 500 MiB。
  • 確保該 Pod 中每個(gè)容器內(nèi)存請(qǐng)求不大于 1 GiB。

以下為包含一個(gè)容器的 Pod 清單。該容器聲明了 600 MiB 的內(nèi)存請(qǐng)求和 800 MiB 的內(nèi)存限制, 這些滿足了 LimitRange 施加的最小和最大內(nèi)存約束。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo
spec:
  containers:
  - name: constraints-mem-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
      requests:
        memory: "600Mi"

創(chuàng)建 Pod:

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

確認(rèn) Pod 正在運(yùn)行,并且其容器處于健康狀態(tài):

kubectl get pod constraints-mem-demo --namespace=constraints-mem-example

查看 Pod 詳情:

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

輸出結(jié)果顯示該 Pod 的容器的內(nèi)存請(qǐng)求為 600 MiB,內(nèi)存限制為 800 MiB。 這些滿足這個(gè)命名空間中 LimitRange 設(shè)定的限制范圍。

resources:
  limits:
     memory: 800Mi
  requests:
    memory: 600Mi

刪除你創(chuàng)建的 Pod:

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

嘗試創(chuàng)建一個(gè)超過(guò)最大內(nèi)存限制的 Pod

以下為包含一個(gè)容器的 Pod 的清單。這個(gè)容器聲明了 800 MiB 的內(nèi)存請(qǐng)求和 1.5 GiB 的內(nèi)存限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo-2
spec:
  containers:
  - name: constraints-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1.5Gi"
      requests:
        memory: "800Mi"

嘗試創(chuàng)建 Pod:

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

輸出結(jié)果顯示 Pod 沒(méi)有創(chuàng)建成功,因?yàn)樗x了一個(gè)容器的內(nèi)存請(qǐng)求超過(guò)了允許的值。

Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-2.yaml":
pods "constraints-mem-demo-2" is forbidden: maximum memory usage per Container is 1Gi, but limit is 1536Mi.

嘗試創(chuàng)建一個(gè)不滿足最小內(nèi)存請(qǐng)求的 Pod

以下為只有一個(gè)容器的 Pod 的清單。這個(gè)容器聲明了 100 MiB 的內(nèi)存請(qǐng)求和 800 MiB 的內(nèi)存限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo-3
spec:
  containers:
  - name: constraints-mem-demo-3-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
      requests:
        memory: "100Mi"

嘗試創(chuàng)建 Pod:

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

輸出結(jié)果顯示 Pod 沒(méi)有創(chuàng)建成功,因?yàn)樗x了一個(gè)容器的內(nèi)存請(qǐng)求小于強(qiáng)制要求的最小值:

Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-3.yaml":
pods "constraints-mem-demo-3" is forbidden: minimum memory usage per Container is 500Mi, but request is 100Mi.

創(chuàng)建一個(gè)沒(méi)有聲明內(nèi)存請(qǐng)求和限制的 Pod

以下為只有一個(gè)容器的 Pod 清單。該容器沒(méi)有聲明內(nèi)存請(qǐng)求,也沒(méi)有聲明內(nèi)存限制。

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

創(chuàng)建 Pod:

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

查看 Pod 詳情:

kubectl get pod constraints-mem-demo-4 --namespace=constraints-mem-example --output=yaml

輸出結(jié)果顯示 Pod 的唯一容器內(nèi)存請(qǐng)求為 1 GiB,內(nèi)存限制為 1 GiB。容器怎樣獲得那些數(shù)值呢?

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

因?yàn)槟愕?nbsp;Pod 沒(méi)有為容器聲明任何內(nèi)存請(qǐng)求和限制,集群會(huì)從 LimitRange 獲取默認(rèn)的內(nèi)存請(qǐng)求和限制。 應(yīng)用于容器。

這意味著 Pod 的定義會(huì)顯示這些值。你可以通過(guò) ?kubectl describe? 查看:

# 查看輸出結(jié)果中的 "Requests:" 的值
kubectl describe pod constraints-mem-demo-4 --namespace=constraints-mem-example

此時(shí),你的 Pod 可能已經(jīng)運(yùn)行起來(lái)也可能沒(méi)有運(yùn)行起來(lái)。 回想一下我們本次任務(wù)的先決條件是你的每個(gè)節(jié)點(diǎn)都至少有 1 GiB 的內(nèi)存。 如果你的每個(gè)節(jié)點(diǎn)都只有 1 GiB 的內(nèi)存,那將沒(méi)有一個(gè)節(jié)點(diǎn)擁有足夠的可分配內(nèi)存來(lái)滿足 1 GiB 的內(nèi)存請(qǐng)求。

刪除你的 Pod:

kubectl delete pod constraints-mem-demo-4 --namespace=constraints-mem-example

強(qiáng)制執(zhí)行內(nèi)存最小和最大限制

LimitRange 為命名空間設(shè)定的最小和最大內(nèi)存限制只有在 Pod 創(chuàng)建和更新時(shí)才會(huì)強(qiáng)制執(zhí)行。 如果你更新 LimitRange,它不會(huì)影響此前創(chuàng)建的 Pod。

設(shè)置內(nèi)存最小和最大限制的動(dòng)因

作為集群管理員,你可能想規(guī)定 Pod 可以使用的內(nèi)存總量限制。例如:

  • 集群的每個(gè)節(jié)點(diǎn)有 2 GiB 內(nèi)存。你不想接受任何請(qǐng)求超過(guò) 2 GiB 的 Pod,因?yàn)榧褐袥](méi)有節(jié)點(diǎn)可以滿足。
  • 集群由生產(chǎn)部門和開發(fā)部門共享。你希望允許產(chǎn)品部門的負(fù)載最多耗用 8 GiB 內(nèi)存, 但是開發(fā)部門的負(fù)載最多可使用 512 MiB。 這時(shí),你可以為產(chǎn)品部門和開發(fā)部門分別創(chuàng)建名字空間,并為各個(gè)名字空間設(shè)置內(nèi)存約束。

清理

刪除你的命名空間:

kubectl delete namespace constraints-mem-example


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)