k8s 中内存的已用配额和硬配额有什么区别?

Epi*_*555 8 kubernetes

kubernetes 中内存的已用配额和硬配额有什么区别?如何在 Limits.Memory 和 requests.Memory 的配额中写入正确的值?我不明白并且我没有找到任何解释

Pjo*_*erS 4

背景

资源配额是命名空间范围内特定资源的限制。

由 ResourceQuota 对象定义的资源配额提供了限制每个命名空间的聚合资源消耗的约束。

正如我在评论中提到的,它与中使用的Requests和非常相似。是 pod 在开始时请求的值,也是 pod 可以使用的最大值。在 中,值就像,它不能超过这个值。是该特定资源的当前使用价值。配额可用于限制、、或的数量。LimitsPodsRequestlimitQuotahardlimitUsedjobspodsservicescpumemory

测试

要列出您的所有内容quotas,您可以使用命令$ kubectl get quota -A。如果你错过了-A,或者--all-namespaces你将只能从命名空间获得配额default

我已经在GKE集群和Minikube.

默认情况下,GKE集群有一些Quotas. 您可以拥有超过 1Quota英寸namespace。在下面的示例中,您有 2 个命名quotas空间kube-system

$ 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

基于以上输出:

在我当前的GKE集群中,我有 15 个 pod 正在运行 ( Used),但在此命名空间中可以拥有的最大 pod 数量为1500。我将无法在这个namespace1501 pod 中部署。

创建命名空间

$ kubectl create ns test
Run Code Online (Sandbox Code Playgroud)

创建配额

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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我没有任何正在使用内存的 Pod。

设想

2 个 pod,每个 pod 都有50Mi requests限制100Mi

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-1
  namespace: test
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: "50Mi"
      limits:
        memory: "100Mi"
Run Code Online (Sandbox Code Playgroud)

之后,Used的值Quota已更改。

$ kubectl describe quota -n test
Name:            test
Namespace:       test
Resource         Used   Hard
--------         ----   ----
limits.memory    100Mi  200Mi
requests.memory  50Mi   100Mi
Run Code Online (Sandbox Code Playgroud)

如果我要创建具有相同值但名称的第二个 pod nginx-2,Kubernetes 允许我这样做,因为Hard值不会被超出。Used并且Hard值将相同

$ kubectl describe quota -n test
Name:            test
Namespace:       test
Resource         Used   Hard
--------         ----   ----
limits.memory    200Mi  200Mi
requests.memory  100Mi  100Mi
Run Code Online (Sandbox Code Playgroud)

然而,我将无法创造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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中resourcequota/test设置了命名空间的限制test

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

quota如果Createdlimitsrequests超过.Hardquota

在 中$ kubectl describe quota test -n testUsage值是此中所有 pod 限制的总和namespace(当前正在使用)。Hard是不能超过的最大值。

结论

Used的值Quota是已经在其中使用的资源数量namespace。它可以是 的数量pods或数量memorycpuHard的值是使用的Quota最大数量pods或最大阈值。memory如果超过Hard价值,则不会创建特定资源。

有用的链接

如果您还有疑问,请告诉我。