Concepts

Detailed explanations of Kubernetes system concepts and abstractions.

Edit This Page

资源配额

当一个固定节点数的集群中存在多个用户或者团队时,就会产生某个团队使用的资源超出公平份额的问题。
资源配额就是为管理员解决此问题的一个工具。
通过ResourceQuota对象来定义一个资源配额,提供了对每个命名空间下限制资源消耗总数的约束条件。它可以按照类型限制一个命名空间下对象的数量,也可以按照资源消耗来限制计算资源总量。

资源配额工作如下:

使用命名空间和配额的一些例子:

如果集群的总容量小于命名空间的配额总额,可能会产生资源竞争。这时会按照先到先得来处理。
资源竞争和配额的更新都不会影响已经创建好的资源。

启用资源配额

Kubernetes 的众多发行版本默认开启了资源配额的支持。当在apiserver的--admission-control配置中添加ResourceQuota参数后,便启用了。 当一个命名空间中含有ResourceQuota对象时,资源配额强制执行。一个命名空间最多只能有一个ResourceQuota对象。

计算资源的配额

你可以在一个给定的命名空间中限制可以请求的计算资源(compute resources)的总量。 支持以下的资源类型:

资源名称 描述
cpu 非终止态的所有pod, cpu请求总量不能超出此值。
limits.cpu 非终止态的所有pod, cpu限制总量不能超出此值。
limits.memory 非终止态的所有pod, 内存限制总量不能超出此值。
memory 非终止态的所有pod, 内存请求总量不能超出此值。
requests.cpu 非终止态的所有pod, cpu请求总量不能超出此值。
requests.memory 非终止态的所有pod, 内存请求总量不能超出此值。

存储资源的配额

你可以在一个给定的命名空间中限制可以请求的存储资源(storage resources)的总量。 总之,你可以根据关联的存储类来限制存储资源的消耗量。

资源名称 描述
requests.storage 所有PVC, 存储请求总量不能超出此值。
persistentvolumeclaims 命名空间中可以存在的PVC(persistent volume claims)总数。
.storageclass.storage.k8s.io/requests.storage 和该存储类关联的所有PVC, 存储请求总和不能超出此值。
.storageclass.storage.k8s.io/persistentvolumeclaims 和该存储类关联的所有PVC,命名空间中可以存在的PVC(persistent volume claims)总数。

例如,如果一个操作人员想要分别定额gold存储类和bronze存储类,则这个操作人员可以按照下面这样定义配额:

对象数量的配额

一个给定类型的对象的数量可以被限制。支持以下类型:

资源名称 描述
congfigmaps 命名空间中可以存在的配置映射的总数。
persistentvolumeclaims 命名空间中可以存在的PVC总数。
pods 命名空间中可以存在的非终止态的pod总数。如果一个pod的status.phaseFailed, Succeeded, 则该pod处于终止态。
replicationcontrollers 命名空间中可以存在的rc总数。
resourcequotas 命名空间中可以存在的资源配额(resource quotas)总数。
services 命名空间中可以存在的服务总数量。
services.loadbalancers 命名空间中可以存在的服务的负载均衡的总数量。
services.nodeports 命名空间中可以存在的服务的主机接口的总数量。
secrets 命名空间中可以存在的secrets的总数量。

例如,pod 数量配额,则表示在单个命名空间中可以创建的pod的最大值。 你可能想要在一个命名空间中定义一个pod限额来避免一个用户创建了许多小的pod从而耗光这个集群Pod IPs 的情况。

限额的作用域

每个配额可以有一组关联的作用域。如果一个限额匹配枚举的作用的交集,它将只衡量一个资源的利用率。 当一个作用域被添加到配额时,它将会限制它支持的涉及到该作用域的资源的数量。在不允许设置的限额上指定资源将会导致一个验证错误。

作用域 描述
Terminating 匹配 spec.activeDeadlineSeconds >= 0 的pod
NotTerminating 匹配 spec.activeDeadlineSeconds is nil 的pod
BestEffort 匹配具有最佳服务质量的pod
NotBestEffort 匹配具有非最佳服务质量的pod

BestEffort作用域禁止限额跟踪以下的资源:

TerminatingNotTerminatingNotBestEffort作用域禁止限额跟踪以下的资源:

请求 vs 限度

当分配计算资源时,每个容器可以为cpu或者内存指定一个请求值和一个限度值。可以配置限额值来限制它们中的任何一个值。
如果指定了requests.cpu 或者 requests.memory的限额值,那么就要求传入的每一个容器显式的指定这些资源的请求。如果指定了limits.cpu或者limits.memory,那么就要求传入的每一个容器显式的指定这些资源的限度。

查看和设置配额

Kubectl 支持创建,更新和查看配额:

$ kubectl create namespace myspace

$ cat <<EOF > compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
spec:
  hard:
    pods: "4"
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
EOF
$ kubectl create -f ./compute-resources.yaml --namespace=myspace

$ cat <<EOF > object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
spec:
  hard:
    configmaps: "10"
    persistentvolumeclaims: "4"
    replicationcontrollers: "20"
    secrets: "10"
    services: "10"
    services.loadbalancers: "2"
EOF
$ kubectl create -f ./object-counts.yaml --namespace=myspace

$ kubectl get quota --namespace=myspace
NAME                    AGE
compute-resources       30s
object-counts           32s

$ kubectl describe quota compute-resources --namespace=myspace
Name:                  compute-resources
Namespace:             myspace
Resource               Used Hard
--------               ---- ----
limits.cpu             0    2
limits.memory          0    2Gi
pods                   0    4
requests.cpu           0    1
requests.memory        0    1Gi

$ kubectl describe quota object-counts --namespace=myspace
Name:                   object-counts
Namespace:              myspace
Resource                Used    Hard
--------                ----    ----
configmaps              0       10
persistentvolumeclaims  0       4
replicationcontrollers  0       20
secrets                 1       10
services                0       10
services.loadbalancers  0       2

配额和集群容量

资源配额对象与集群容量无关。它们以绝对单位表示。因此,如果在集群中新增加节点,也不会给每个命名空间自动增加消耗更多资源的能力。 有时可能需要更复杂的策略,例如:

范例

参考如何使用资源配额的详细案例

了解更多

参阅资源配额设计文档来了解更多信息。

Analytics

Create an Issue Edit this Page