# ResourceQuota Controller

<mark style="color:blue;">**ResourceQuota Controller（资源配额管理）**</mark>**确保了指定的资源对象在任何时候都不会超量占用系统物理资源，避免了由于某些业务进程的设计或实现的缺陷导致整个系统运行紊乱甚至意外宕机，对整个集群的平稳运行和稳定性有非常重要的作用。**

## **资源配额管理的三个层次**

目前Kubernetes支持如下三个层次的资源配额管理：

* <mark style="color:blue;">**容器级别**</mark>，可以对CPU和Memory进行限制。
* <mark style="color:blue;">**Pod级别**</mark>，可以对一个Pod内所有容器的可用资源进行限制。
* <mark style="color:blue;">**Namespace级别**</mark>，为Namespace（多租户）级别的资源限制，包括：
  * Pod数量；
  * Replication Controller数量；
  * Service数量；
  * ResourceQuota数量；
  * Secret数量；
  * 可持有的PV数量。

## 两种配额约束方式

Kubernetes的配额管理是通过<mark style="color:blue;">**Admission Control（准入控制）**</mark>来控制的，Admission Control当前提供了两种方式的**配额约束**，分别是<mark style="color:blue;">**LimitRanger**</mark>与<mark style="color:blue;">**ResourceQuota**</mark>。其中：

*   <mark style="color:blue;">**LimitRanger**</mark>作用于**Pod**和**Container。**

    如果在Pod定义中声明了LimitRanger，则用户通过API Server**请求创建或修改资源时**，Admission Control会计算当前配额的使用情况，**如果不符合配额约束，则创建对象失败**。
*   <mark style="color:blue;">**ResourceQuota**</mark>则作用于**Namespace**，限定一个Namespace里的各类资源的使用总额。

    对于定义了ResourceQuota的Namespace，ResourceQuota Controller组件则负责**定期统计和生成该Namespace下的各类对象的资源使用总量**，统计结果包括Pod、Service、RC、Secret和Persistent Volume等对象实例个数，以及该Namespace下所有Container实例所使用的资源量（目前包括CPU和内存），然后将这些统计结果写入etcd的resourceQuotaStatusStorage目录（resourceQuotas/status）下。

    随后这些统计信息被Admission Control使用，以确保相关Namespace下的资源配额总量不会超过ResourceQuota中的限定值。
