Kubernetes 為命名空間配置內(nèi)存和CPU配額

2022-06-06 09:52 更新

為命名空間配置內(nèi)存和 CPU 配額

本文介紹如何為命名空間下運行的所有 Pod 設(shè)置總的內(nèi)存和 CPU 配額。 你可以通過使用 ?ResourceQuota ?對象設(shè)置配額.

在開始之前

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

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

集群中每個節(jié)點至少有 1 GiB 的內(nèi)存。

創(chuàng)建命名空間

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

kubectl create namespace quota-mem-cpu-example

創(chuàng)建 ResourceQuota

下面是 ResourceQuota 的示例清單:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi

創(chuàng)建 ResourceQuota

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

查看 ResourceQuota 詳情:

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

ResourceQuota 在 quota-mem-cpu-example 命名空間中設(shè)置了如下要求:

  • 在該命名空間中的每個 Pod 的所有容器都必須要有內(nèi)存請求和限制,以及 CPU 請求和限制。
  • 在該命名空間中所有 Pod 的內(nèi)存請求總和不能超過 1 GiB。
  • 在該命名空間中所有 Pod 的內(nèi)存限制總和不能超過 2 GiB。
  • 在該命名空間中所有 Pod 的 CPU 請求總和不能超過 1 cpu。
  • 在該命名空間中所有 Pod 的 CPU 限制總和不能超過 2 cpu。

創(chuàng)建 Pod

以下是 Pod 的示例清單:

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

創(chuàng)建 Pod:

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

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

kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example

再查看 ResourceQuota 的詳情:

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

輸出結(jié)果顯示了配額以及有多少配額已經(jīng)被使用。你可以看到 Pod 的內(nèi)存和 CPU 請求值及限制值沒有超過配額。

status:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
  used:
    limits.cpu: 800m
    limits.memory: 800Mi
    requests.cpu: 400m
    requests.memory: 600Mi

如果有 ?jq? 工具的話,你可以通過(使用 ?JSONPath?) 直接查詢 ?used ?字段的值,并且輸出整齊的 JSON 格式。

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example -o jsonpath='{ .status.used }' | jq .

嘗試創(chuàng)建第二個 Pod

以下為第二個 Pod 的清單:

apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo-2
spec:
  containers:
  - name: quota-mem-cpu-demo-2-ctr
    image: redis
    resources:
      limits:
        memory: "1Gi"
        cpu: "800m"
      requests:
        memory: "700Mi"
        cpu: "400m"

在清單中,你可以看到 Pod 的內(nèi)存請求為 700 MiB。 請注意新的內(nèi)存請求與已經(jīng)使用的內(nèi)存請求之和超過了內(nèi)存請求的配額: 600 MiB + 700 MiB > 1 GiB。

嘗試創(chuàng)建 Pod:

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

第二個 Pod 不能被創(chuàng)建成功。輸出結(jié)果顯示創(chuàng)建第二個 Pod 會導(dǎo)致內(nèi)存請求總量超過內(nèi)存請求配額。

Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml":
pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo,
requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi

討論

如你在本練習(xí)中所見,你可以用 ResourceQuota 限制命名空間中所有 Pod 的內(nèi)存請求總量。 同樣你也可以限制內(nèi)存限制總量、CPU 請求總量、CPU 限制總量。

除了可以管理命名空間資源使用的總和,如果你想限制單個 Pod,或者限制這些 Pod 中的容器資源, 可以使用 LimitRange 實現(xiàn)這類的功能。

清理

刪除你的命名空間:

kubectl delete namespace quota-mem-cpu-example


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號