> For the complete documentation index, see [llms.txt](https://renhongcai.gitbook.io/kubernetes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://renhongcai.gitbook.io/kubernetes/di-shi-zhang-resourcequota/1.1-resourcequota_overview.md).

# 10.1 ResourceQuota概述

`ResourceQuota`是用于设定资源配额的对象，集群管理员可以为每个`namespace`创建`ResourceQuota`对象来限定资源的使用额度， 从而可以精准且合理地分配集群资源，避免多个`namespace`中的对象争抢共享的集群资源。

## ResourceQuota的出现背景

实际应用场景中，经常出现多用户或者多团队共用同一个集群的情况，管理员往往会为不同用户或团队分配不同的`namespace`， 从而将彼此隔离，但`namespace`只能做到逻辑上的隔离，多个`namespace`中的应用仍然会共享集群的硬件资源， 比如`CPU`、内存和存储等，如果某个`namespace`下的应用大量消耗这些共享资源，那么势必会影响其他`namespace`下的的应用。

`ResourceQuota`正是针对这种问题而提供的一个解决方案。例如，用户`A`和`B`共享某个含有16核CPU以及32G内存资源的集群， 并且用户`A`和`B`分别使用`namespace-a`和`namespace-b`，那么管理员可以分别在`namespace-a`和`namespace-b`中创建一个 `ResourceQuota`对象，并指定CPU和内存配额（比如平分集群资源），那么用户`A`和`B`后续创建的应用资源总消耗量将不会超过该配额， 一旦超过该配额，`Kubernetes`将拒绝创建新的应用。

## ResourceQuota功能启用

若要启用`ResourceQuota`功能，需要把字符串“ResourceQuota”加到`kube-apiserver`的`--enable-admission-plugins`参数列表中。比如：

```
# kube-apiserver <other parameters> --enable-admission-plugins="ResourceQuota,<other plugins>"
```

在绝大多数`Kubernetes`发行版中，`ResourceQuota`功能都是默认开启的。

## ResourceQuota资源配置

一个简单的`ResourceQuota`配置，如下所示：

```
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pod-count
  namespace: default
spec:
  hard:
    pods: "0"
```

这份配置将在名为`default`的`namespace`中创建一个`ResourceQuota`对象，该对象将确保在该`namespace`中“禁止”创建`Pod`对象。其主要配置如下：

* `metadata.namespace`：`ResourceQuota`对象所属的`namespace`，也是该对象作用的`namespace`；
* `spec.hard`：指定硬性配额列表；
* `spec.hard.pods`：为`Pod`对象个数设置配额；

`ResourceQuota`还支持其他更丰富的配置，比如支持对特性状态的资源实施限额、对特定优先级的资源实施限额等，这部分内容我们将在后绪的章节中陆续介绍。

## ResourceQuota可限制的资源

`ResourceQuota`支持为多种类型的资源设置限额：

* 计算类资源，比如CPU、内存等；
* 扩展类资源，比如GPU；
* 存储类资源，比如持久卷；

除了这些资源类型以外，还支持限定对象个数，这些对象包括：

* configmaps
* persistentvolumeclaims
* pods
* replicationcontrollers
* resourcequotas
* services
* services.loadbalancers
* services.nodeports
* secrets

更多的信息，我们将在后面的章节中再详细展开。
