kubernetes 的资源配额控制器

有很多团队在使用kubernetes的时候是将一个namespace当成一个租户的,所以对namespace的权限控制,资源控制就很重要了,你总是会担心你的某个租户使用的资源就超出了应有的配额。幸运的是kubernetes本身就为我们提供了解决这一问题的工具:资源配额控制器(ResourceQuotaController)

资源配额控制器确保了指定的资源对象始终不会超过配置的资源,能够有效的降低整个系统宕机的机率,增强系统的鲁棒性,对整个集群的稳定性有非常重要的作用。

介绍

kubernetes主要有3个层级的资源配额控制:

  • 容器:可以对 CPU 和 Memory 进行限制
  • POD:可以对一个 POD 内所有容器的的资源进行限制
  • Namespace:为一个命名空间下的资源进行限制

其中容器层次主要利用容器本身的支持,比如 Docker 对 CPU、内存等的支持;POD 方面可以限制系统内创建 POD 的资源范围,比如最大或者最小的 CPU、memory 需求;Namespace 层次就是对用户级别的资源限额了,包括 CPU、内存,还可以限定 POD、RC、Service 的数量。

要使用资源配额的话需要确保apiserver的–admission-control参数中包含ResourceQuota,当 namespace 中存在一个 ResourceQuota对象时,该 namespace 即开始实施资源配额的管理工作了,另外需要注意的是一个 namespace 中最多只应存在一个 ResourceQuota 对象。

ResourceQuotaController支持的配额控制资源主要包括:计算资源配额、存储资源配额、对象数量资源配额以及配额作用域,下面我们来分别看看这些资源的具体信息:

计算资源配额

用户可以对给定 namespace 下的计算资源总量进行限制,ResourceQuotaController所支持的资源类型如下:

未分类

示例如下:

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

然后我们查看下上面我们创建的 ResourceQuota对象:

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

另外需要注意的是:如果 namespace 下的计算资源 (如 cpu 和 memory)的配额被启用,则用户必须为这些资源设定请求值(request) 和约束值(limit),否则配额系统将拒绝Pod的创建;或者也可以为资源设置默认的资源限制,如下 yaml 文件:(同样需要在–admission-control参数中设置值LimitRanger)

apiVersion: v1
kind: LimitRange
metadata:
  name: limits
spec:
  limits:
  - default:
    cpu: 200m
    memory: 200Mi
  type: Container

存储资源配额

用户可以对给定 namespace 下的存储资源总量进行限制,此外,还可以根据相关的存储类(Storage Class)来限制存储资源的消耗。

未分类

对象数量配额

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

未分类

如下示例:

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

同样可以查看上面创建的资源限额对象:

$ kubectl describe quota object-counts -n myspace
Name:                   object-counts
Namespace:              myspace
Resource                Used  Hard
--------                ----  ----
configmaps              0     10
pods                    0     40
replicationcontrollers  0     20
secrets                 1     10
services                0     10
services.nodeports      0     2

配额作用域

每个配额都有一组相关的作用域(scope),配额只会对作用域内的资源生效。当一个作用域被添加到配额中后,它会对作用域相关的资源数量作限制。 如配额中指定了允许(作用域)集合之外的资源,会导致验证错误。

未分类

其中BestEffort 作用域限制配额跟踪以下资源: PODS

Terminating、 NotTerminating 和 NotBestEffort限制配额跟踪以下资源:cpu、limits.cpu、limits.memory、memory、pods、requests.cpu、requests.memory。

总结

物理资源 CPU 和内存受到 namespace 资源配额管理器的控制,几乎所有使用到的资源都能够被简单的调整,我们可以结合我们自身的业务和物理资源实际情况来进行分配配额,所以这里没有一个完全通用的配额方案,需要根据实际情况来定,因为只有你自己最清楚你的集群的整体情况了。