簡體   English   中英

k8s 中 memory 的已用配額和硬配額有什么區別?

[英]what is the difference between used & hard quota for memory in k8s?

kubernetes 中 memory 的已用配額和硬配額有什么區別? 如何在limits.memory和requests.memory的配額中寫入正確的值? 我不明白,我沒有找到任何解釋

背景

資源配額是命名空間范圍內特定資源的限制。

由 ResourceQuota object 定義的資源配額提供了限制每個命名空間的聚合資源消耗的約束。

正如我在評論中提到的,它與Pods中使用的RequestsLimits非常相似。 Request是 pod 在開始時請求的值, limit是 pod 可以使用的最大值。 Quota中, hard值就像limit一樣,不能超過這個值。 Used是該特定資源當前使用的價值。 配額可用於限制jobspodsservicescpumemory的數量。

測試

要列出所有quotas ,您可以使用命令$ kubectl get quota -A 如果您錯過-A--all-namespaces ,您將只能從default命名空間獲得配額。

我已經在GKE集群和Minikube上對此進行了測試。

默認情況下, GKE集群有幾個Quotas 您可以在namespace中擁有超過 1 個Quota 在下面的示例中,您有 2 個kube-system命名空間quotas

$ kubectl get quota -A
NAMESPACE         NAME                  AGE   REQUEST                      LIMIT
default           gke-resource-quotas   11m   count/ingresses.extensions: 0/100, count/ingresses.networking.k8s.io: 0/100, count/jobs.batch: 0/5k, pods: 0/1500, services: 1/500
kube-node-lease   gke-resource-quotas   11m   count/ingresses.extensions: 0/100, count/ingresses.networking.k8s.io: 0/100, count/jobs.batch: 0/5k, pods: 0/1500, services: 0/500
kube-public       gke-resource-quotas   11m   count/ingresses.extensions: 0/100, count/ingresses.networking.k8s.io: 0/100, count/jobs.batch: 0/5k, pods: 0/1500, services: 0/500
kube-system       gcp-critical-pods     18m   pods: 13/1G 
kube-system       gke-resource-quotas   11m   count/ingresses.extensions: 0/100, count/ingresses.networking.k8s.io: 0/100, count/jobs.batch: 0/5k, pods: 15/1500, services: 3/500

但是Minikube一開始是沒有的。 要啟用Resource Quota ,請查看此文檔

您可以描述Quota以檢查哪些資源將受到限制。

$ kubectl describe quota gke-resource-quotas -n kube-system
Name:                              gke-resource-quotas
Namespace:                         kube-system
Resource                           Used  Hard
--------                           ----  ----
count/ingresses.extensions         0     100
count/ingresses.networking.k8s.io  0     100
count/jobs.batch                   0     5k
pods                               15    1500
services                           3     500

基於以上output:

在我當前的GKE集群中,我有 15 個 pod 正在運行( Used ),但我可以在這個命名空間中擁有的最大 pod 數是1500 我將無法在此namespace中部署 1501 個 pod。

創建命名空間

$ kubectl create ns test

創建配額

apiVersion: v1
kind: ResourceQuota
metadata:
  name: test
  namespace: test
spec:
  hard:
    requests.memory: "100Mi"  
    limits.memory: "200Mi"

resourcequota/test created

$ kubectl describe quota -n test
Name:            test
Namespace:       test
Resource         Used  Hard
--------         ----  ----
limits.memory    0     200Mi
requests.memory  0     100Mi

在上面的示例中,我沒有任何使用 memory 的 pod。

設想

2 個 pod,每個50Mi requests100Mi限制。

吊艙yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-1
  namespace: test
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: "50Mi"
      limits:
        memory: "100Mi"

之后, QuotaUsed值發生了變化。

$ kubectl describe quota -n test
Name:            test
Namespace:       test
Resource         Used   Hard
--------         ----   ----
limits.memory    100Mi  200Mi
requests.memory  50Mi   100Mi

如果我要創建具有相同值但名稱為nginx-2的第二個 pod,則 Kubernetes 允許我這樣做,因為不會超過Hard值。 UsedHard值將相同

$ kubectl describe quota -n test
Name:            test
Namespace:       test
Resource         Used   Hard
--------         ----   ----
limits.memory    200Mi  200Mi
requests.memory  100Mi  100Mi

但是,我將無法創建nginx-3 ,因為它會超過Hard值。 您將收到錯誤:

Error from server (Forbidden): error when creating "pod.yaml": pods "nginx-3" is forbidden: exceeded quota: test, requested: limits.memory=100Mi,requests.memory=50Mi, used: limits.memory=200Mi,requests.memory=100Mi, limited: limits.memory=200Mi,requests.memory=100Mi

在上面的示例中, resourcequota/test集對test命名空間的限制。

  • limits.memory指的是 pod 的spec.containers.resources.limits.memory
  • requests.memory指的是 pod 的spec.containers.resources.requests.memory

如果limitsrequests將超過quota中的Hard值,則創建的quota將不允許創建 pod。

$ kubectl describe quota test -n test中, Usage值是此namespace (當前正在使用)中所有 pod 限制的總和。 Hard不能超過的最大值。

結論

QuotaUsed值是已在此namespace中使用的資源數。 它可以是pods的數量或memorycpu的數量。 QuotaHard值是memory使用的最大pods數或最大閾值。 如果超過Hard值,則不會創建特定資源。

有用的鏈接

如果您還有一些問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM