Kubernetes 為命名空間配置CPU最小和最大約束

2022-06-06 09:47 更新

為命名空間配置 CPU 最小和最大約束

本頁介紹如何為命名空間中的容器和 Pod 設(shè)置其所使用的 CPU 資源的最小和最大值。 你可以通過 LimitRange 對象聲明 CPU 的最小和最大值. 如果 Pod 不能滿足 LimitRange 的限制,就無法在該命名空間中被創(chuàng)建。

在開始之前

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

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

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

創(chuàng)建命名空間

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

kubectl create namespace constraints-cpu-example

創(chuàng)建 LimitRange 和 Pod

以下為 LimitRange 的示例清單:

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-min-max-demo-lr
spec:
  limits:
  - max:
      cpu: "800m"
    min:
      cpu: "200m"
    type: Container

創(chuàng)建 LimitRange:

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

查看 LimitRange 詳情:

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

輸出結(jié)果顯示 CPU 的最小和最大限制符合預(yù)期。但需要注意的是,盡管你在 LimitRange 的配置文件中你沒有聲明默認(rèn)值,默認(rèn)值也會被自動創(chuàng)建。

limits:
- default:
    cpu: 800m
  defaultRequest:
    cpu: 800m
  max:
    cpu: 800m
  min:
    cpu: 200m
  type: Container

現(xiàn)在,每當(dāng)你在 constraints-mem-example 命名空間中創(chuàng)建 Pod 時(shí),或者某些其他的 Kubernetes API 客戶端創(chuàng)建了等價(jià)的 Pod 時(shí),Kubernetes 就會執(zhí)行下面的步驟:

  • 如果 Pod 中的任何容器未聲明自己的 CPU 請求和限制,控制面將為該容器設(shè)置默認(rèn)的 CPU 請求和限制。
  • 確保該 Pod 中的每個(gè)容器的 CPU 請求至少 200 millicpu。
  • 確保該 Pod 中每個(gè)容器 CPU 請求不大于 800 millicpu。

Note: 當(dāng)創(chuàng)建 LimitRange 對象時(shí),你也可以聲明大頁面和 GPU 的限制。 當(dāng)這些資源同時(shí)聲明了 'default' 和 'defaultRequest' 參數(shù)時(shí),兩個(gè)參數(shù)值必須相同。

以下為某個(gè)僅包含一個(gè)容器的 Pod 的清單。 該容器聲明了 CPU 請求 500 millicpu 和 CPU 限制 800 millicpu 。 這些參數(shù)滿足了 LimitRange 對象規(guī)定的 CPU 最小和最大限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo
spec:
  containers:
  - name: constraints-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "500m"

創(chuàng)建 Pod:

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

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

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

查看 Pod 的詳情:

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

輸出結(jié)果顯示該 Pod 的容器的 CPU 請求為 500 millicpu,CPU 限制為 800 millicpu。 這些參數(shù)滿足 LimitRange 規(guī)定的限制范圍。

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 500m

刪除 Pod

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

嘗試創(chuàng)建一個(gè)超過最大 CPU 限制的 Pod

這里給出了包含一個(gè)容器的 Pod 的配置文件。容器聲明了 500 millicpu 的 CPU 請求和 1.5 CPU 的 CPU 限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-2
spec:
  containers:
  - name: constraints-cpu-demo-2-ctr
    image: nginx
    resources:
      limits:
        cpu: "1.5"
      requests:
        cpu: "500m"

嘗試創(chuàng)建 Pod:

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

輸出結(jié)果表明 Pod 沒有創(chuàng)建成功,因?yàn)槠渲卸x了一個(gè)無法被接受的容器。 該容器之所以無法被接受是因?yàn)槠渲性O(shè)定了過高的 CPU 限制值:

Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-2.yaml":
pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m.

嘗試創(chuàng)建一個(gè)不滿足最小 CPU 請求的 Pod

以下為某個(gè)只有一個(gè)容器的 Pod 的清單。該容器聲明了 CPU 請求 100 millicpu 和 CPU 限制 800 millicpu。

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

嘗試創(chuàng)建 Pod:

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

輸出結(jié)果顯示 Pod 沒有創(chuàng)建成功,因?yàn)槠渲卸x了一個(gè)無法被接受的容器。 該容器無法被接受的原因是其中所設(shè)置的 CPU 請求小于最小值的限制:

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

創(chuàng)建一個(gè)沒有聲明 CPU 請求和 CPU 限制的 Pod

以下為一個(gè)只有一個(gè)容器的 Pod 的清單。該容器沒有聲明 CPU 請求,也沒有聲明 CPU 限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-4
spec:
  containers:
  - name: constraints-cpu-demo-4-ctr
    image: vish/stress

創(chuàng)建 Pod:

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

查看 Pod 的詳情:

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

輸出結(jié)果顯示 Pod 的唯一容器的 CPU 請求為 800 millicpu,CPU 限制為 800 millicpu。

容器是怎樣獲得這些數(shù)值的呢?

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 800m

因?yàn)檫@一容器沒有聲明自己的 CPU 請求和限制, 控制面會根據(jù)命名空間中配置 LimitRange 設(shè)置默認(rèn)的 CPU 請求和限制。

此時(shí),你的 Pod 可能已經(jīng)運(yùn)行起來也可能沒有運(yùn)行起來。 回想一下我們本次任務(wù)的先決條件是你的每個(gè)節(jié)點(diǎn)都至少有 1 CPU。 如果你的每個(gè)節(jié)點(diǎn)都只有 1 CPU,那將沒有一個(gè)節(jié)點(diǎn)擁有足夠的可分配 CPU 來滿足 800 millicpu 的請求。 如果你在用的節(jié)點(diǎn)恰好有 2 CPU,那么有可能有足夠的 CPU 來滿足 800 millicpu 的請求。

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

CPU 最小和最大限制的強(qiáng)制執(zhí)行 

只有當(dāng) Pod 創(chuàng)建或者更新時(shí),LimitRange 為命名空間規(guī)定的 CPU 最小和最大限制才會被強(qiáng)制執(zhí)行。 如果你對 LimitRange 進(jìn)行修改,那不會影響此前創(chuàng)建的 Pod。

最小和最大 CPU 限制范圍的動機(jī)

作為集群管理員,你可能想設(shè)定 Pod 可以使用的 CPU 資源限制。例如:

  • 集群中的每個(gè)節(jié)點(diǎn)有兩個(gè) CPU。你不想接受任何請求超過 2 個(gè) CPU 的 Pod,因?yàn)榧褐袥]有節(jié)點(diǎn)可以支持這種請求。
  • 你的生產(chǎn)和開發(fā)部門共享一個(gè)集群。你想允許生產(chǎn)工作負(fù)載消耗 3 個(gè) CPU, 而開發(fā)部門工作負(fù)載的消耗限制為 1 個(gè) CPU。 你可以為生產(chǎn)和開發(fā)創(chuàng)建不同的命名空間,并且為每個(gè)命名空間都應(yīng)用 CPU 限制。

清理

刪除你的命名空間:

kubectl delete namespace constraints-cpu-example


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號