diff --git a/content/en/docs/concepts/policy/resource-quotas.md b/content/en/docs/concepts/policy/resource-quotas.md index 9decd45697..5fa13aae79 100644 --- a/content/en/docs/concepts/policy/resource-quotas.md +++ b/content/en/docs/concepts/policy/resource-quotas.md @@ -237,7 +237,7 @@ one value. For example: - middle ``` -If the `operator` is `Exists` or `DoesNotExist`, the `values field must *NOT* be +If the `operator` is `Exists` or `DoesNotExist`, the `values` field must *NOT* be specified. ### Resource Quota Per PriorityClass diff --git a/content/zh/docs/concepts/policy/resource-quotas.md b/content/zh/docs/concepts/policy/resource-quotas.md index f6bd8acf9e..60e9dcacc4 100644 --- a/content/zh/docs/concepts/policy/resource-quotas.md +++ b/content/zh/docs/concepts/policy/resource-quotas.md @@ -30,7 +30,7 @@ Resource quotas are a tool for administrators to address this concern. A resource quota, defined by a `ResourceQuota` object, provides constraints that limit aggregate resource consumption per namespace. It can limit the quantity of objects that can be created in a namespace by type, as well as the total amount of compute resources that may -be consumed by resources in that project. +be consumed by resources in that namespace. --> 资源配额,通过 `ResourceQuota` 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod 可以使用的计算资源的总上限。 @@ -43,9 +43,9 @@ Resource quotas work like this: - 不同的团队可以在不同的命名空间下工作,目前这是非约束性的,在未来的版本中可能会通过 ACL (Access Control List 访问控制列表) 来实现强制性约束。 -- 集群管理员可以为每个命名空间创建一个或多个资源配额对象。 +- 集群管理员可以为每个命名空间创建一个或多个 ResourceQuota 对象。 - 当用户在命名空间下创建资源(如 Pod、Service 等)时,Kubernetes 的配额系统会 - 跟踪集群的资源使用情况,以确保使用的资源用量不超过资源配额中定义的硬性资源限额。 + 跟踪集群的资源使用情况,以确保使用的资源用量不超过 ResourceQuota 中定义的硬性资源限额。 - 如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN), 并在消息中给出有可能违反的约束。 - 如果命名空间下的计算资源 (如 `cpu` 和 `memory`)的配额被启用,则用户必须为 @@ -68,10 +68,10 @@ Resource quotas work like this: [演练](/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)示例。 -ResourceQuota 对象的名称必须时合法的 +ResourceQuota 对象的名称必须是合法的 [DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。 ## 启用资源配额 -资源配额的支持在很多 Kubernetes 版本中是默认开启的。当 apiserver `--enable-admission-plugins=` +资源配额的支持在很多 Kubernetes 版本中是默认开启的。当 API 服务器的 `--enable-admission-plugins=` 参数中包含 `ResourceQuota` 时,资源配额会被启用。 -当命名空间中存在一个 `ResourceQuota` 对象时,对于该命名空间而言,资源配额就是开启的。 +当命名空间中存在一个 ResourceQuota 对象时,对于该命名空间而言,资源配额就是开启的。 | 资源名称 | 描述 | | --------------------- | --------------------------------------------- | @@ -147,6 +151,9 @@ The following resource types are supported: | `limits.memory` | 所有非终止状态的 Pod,其内存限额总量不能超过该值。 | | `requests.cpu` | 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。 | | `requests.memory` | 所有非终止状态的 Pod,其内存需求总量不能超过该值。 | +| `hugepages-` | 对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值。 | +| `cpu` | 与 `requests.cpu` 相同。 | +| `memory` | 与 `requests.memory` 相同。 | | 资源名称 | 描述 | | --------------------- | ----------------------------------------------------------- | | `requests.storage` | 所有 PVC,存储资源的需求总量不能超过该值。 | -| `persistentvolumeclaims` | 在该命名空间中所允许的 [PVC](/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) 总量。 | -| `.storageclass.storage.k8s.io/requests.storage` | 在所有与 storage-class-name 相关的持久卷声明中,存储请求的总和不能超过该值。 | -| `.storageclass.storage.k8s.io/persistentvolumeclaims` | 在与 storage-class-name 相关的所有持久卷声明中,命名空间中可以存在的[持久卷申领](/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)总数。 | +| `persistentvolumeclaims` | 在该命名空间中所允许的 [PVC](/zh/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) 总量。 | +| `.storageclass.storage.k8s.io/requests.storage` | 在所有与 `` 相关的持久卷申领中,存储请求的总和不能超过该值。 | +| `.storageclass.storage.k8s.io/persistentvolumeclaims` | 在与 storage-class-name 相关的所有持久卷申领中,命名空间中可以存在的[持久卷申领](/zh/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)总数。 | | 资源名称 | 描述 | | ------------------------------- |----------------------------------------------------------- | | `requests.ephemeral-storage` | 在命名空间的所有 Pod 中,本地临时存储请求的总和不能超过此值。 | | `limits.ephemeral-storage` | 在命名空间的所有 Pod 中,本地临时存储限制值的总和不能超过此值。 | +| `ephemeral-storage` | 与 `requests.ephemeral-storage` 相同。 | ## 对象数量配额 -Kubernetes 1.9 版本增加了使用以下语法对所有标准的、命名空间域的资源类型进行配额设置的支持。 +你可以使用以下语法对所有标准的、命名空间域的资源类型进行配额设置: -* `count/.` +* `count/.`:用于非核心(core)组的资源 +* `count/`:用于核心组的资源 -Kubernetes 1.15 版本增加了对使用相同语法来约束自定义资源的支持。 +相同语法也可用于自定义资源。 例如,要对 `example.com` API 组中的自定义资源 `widgets` 设置配额,请使用 `count/widgets.example.com`。 当使用 `count/*` 资源配额时,如果对象存在于服务器存储中,则会根据配额管理资源。 -这些类型的配额有助于防止存储资源耗尽。例如,用户可能想根据服务器的存储能力来对服务器中 Secret 的数量进行配额限制。集群中存在过多的 Secret 实际上会导致服务器和控制器无法启动!用户可以选择对 Job 进行配额管理,以防止配置不当的 CronJob 在某命名空间中创建太多作业而导致集群拒绝服务。 - +这些类型的配额有助于防止存储资源耗尽。例如,用户可能想根据服务器的存储能力来对服务器中 +Secret 的数量进行配额限制。 +集群中存在过多的 Secret 实际上会导致服务器和控制器无法启动。 +用户可以选择对 Job 进行配额管理,以防止配置不当的 CronJob 在某命名空间中创建太多 Job 而导致集群拒绝服务。 -在 Kubernetes 1.9 版本之前,可以在有限的一组资源上实施一般性的对象数量配额。 +对有限的一组资源上实施一般性的对象数量配额也是可能的。 此外,还可以进一步按资源的类型设置其配额。 支持以下类型: @@ -294,26 +309,26 @@ The following types are supported: | 资源名称 | 描述 | | ------------------------------- | ------------------------------------------------- | | `configmaps` | 在该命名空间中允许存在的 ConfigMap 总数上限。 | -| `persistentvolumeclaims` | 在该命名空间中允许存在的 [PVC](/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) 的总数上限。 | -| `pods` | 在该命名空间中允许存在的非终止状态的 pod 总数上限。Pod 终止状态等价于 Pod 的 `.status.phase in (Failed, Succeeded)` = true | -| `replicationcontrollers` | 在该命名空间中允许存在的 RC 总数上限。 | -| `resourcequotas` | 在该命名空间中允许存在的资源配额总数上限。 | +| `persistentvolumeclaims` | 在该命名空间中允许存在的 [PVC](/zh/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) 的总数上限。 | +| `pods` | 在该命名空间中允许存在的非终止状态的 Pod 总数上限。Pod 终止状态等价于 Pod 的 `.status.phase in (Failed, Succeeded)` 为真。 | +| `replicationcontrollers` | 在该命名空间中允许存在的 ReplicationController 总数上限。 | +| `resourcequotas` | 在该命名空间中允许存在的 ResourceQuota 总数上限。 | | `services` | 在该命名空间中允许存在的 Service 总数上限。 | -| `services.loadbalancers` | 在该命名空间中允许存在的 LoadBalancer 类型的服务总数上限。 | -| `services.nodeports` | 在该命名空间中允许存在的 NodePort 类型的服务总数上限。 | +| `services.loadbalancers` | 在该命名空间中允许存在的 LoadBalancer 类型的 Service 总数上限。 | +| `services.nodeports` | 在该命名空间中允许存在的 NodePort 类型的 Service 总数上限。 | | `secrets` | 在该命名空间中允许存在的 Secret 总数上限。 | ## 配额作用域 {#quota-scopes} -每个配额都有一组相关的作用域(scope),配额只会对作用域内的资源生效。 +每个配额都有一组相关的 `scope`(作用域),配额只会对作用域内的资源生效。 配额机制仅统计所列举的作用域的交集中的资源用量。 | 作用域 | 描述 | | ----- | ----------- | @@ -357,30 +373,88 @@ Resources specified on the quota outside of the allowed set results in a validat | `NotTerminating` | 匹配所有 `spec.activeDeadlineSeconds` 是 nil 的 Pod。 | | `BestEffort` | 匹配所有 Qos 是 BestEffort 的 Pod。 | | `NotBestEffort` | 匹配所有 Qos 不是 BestEffort 的 Pod。 | +| `PriorityClass` | 匹配所有引用了所指定的[优先级类](/zh/docs/concepts/configuration/pod-priority-preemption)的 Pods。 | -`BestEffort` 作用域限制配额跟踪以下资源:`pods` - -`Terminating`、`NotTerminating` 和 `NotBestEffort` 这三种作用域限制配额跟踪以下资源: - -* `cpu` -* `limits.cpu` -* `limits.memory` -* `memory` * `pods` + +The `Terminating`, `NotTerminating`, `NotBestEffort` and `PriorityClass` +scopes restrict a quota to tracking the following resources: +--> +`BestEffort` 作用域限制配额跟踪以下资源: + +* `pods` + +`Terminating`、`NotTerminating`、`NotBestEffort` 和 `PriorityClass` 这些作用域限制配额跟踪以下资源: + +* `pods` +* `cpu` +* `memory` * `requests.cpu` * `requests.memory` +* `limits.cpu` +* `limits.memory` + + +需要注意的是,你不可以在同一个配额对象中同时设置 `Terminating` 和 `NotTerminating` +作用域,你也不可以在同一个配额中同时设置 `BestEffort` 和 `NotBestEffort` +作用域。 + +`scopeSelector` 支持在 `operator` 字段中使用以下值: + +* `In` +* `NotIn` +* `Exists` +* `DoesNotExist` + + +定义 `scopeSelector` 时,如果使用以下值之一作为 `scopeName` 的值,则对应的 +`operator` 只能是 `Exists`。 + +* `Terminating` +* `NotTerminating` +* `BestEffort` +* `NotBestEffort` + + +如果 `operator` 是 `In` 或 `NotIn` 之一,则 `values` 字段必须至少包含一个值。 +例如: + +```yaml + scopeSelector: + matchExpressions: + - scopeName: PriorityClass + operator: In + values: + - middle +``` + + +如果 `operator` 为 `Exists` 或 `DoesNotExist`,则*不*可以设置 `values` 字段。 ### 基于优先级类(PriorityClass)来设置资源配额 -{{< feature-state for_k8s_version="1.12" state="beta" >}} +{{< feature-state for_k8s_version="v1.17" state="stable" >}} 仅当配额规范中的 `scopeSelector` 字段选择到某 Pod 时,配额机制才会匹配和计量 Pod 的资源消耗。 + +如果配额对象通过 `scopeSelector` 字段设置其作用域为优先级类,则配额对象只能 +跟踪以下资源: + +* `pods` +* `cpu` +* `memory` +* `ephemeral-storage` +* `limits.cpu` +* `limits.memory` +* `limits.ephemeral-storage` +* `requests.cpu` +* `requests.memory` +* `requests.ephemeral-storage` + + 本示例创建一个配额对象,并将其与具有特定优先级的 Pod 进行匹配。 该示例的工作方式如下: @@ -586,16 +678,6 @@ memory 0 20Gi pods 0 10 ``` - -`scopeSelector` 在 `operator` 字段中支持以下值: - -* `In` -* `NotIn` -* `Exist` -* `DoesNotExist` - ## 配额和集群容量 {#quota-and-cluster-capacity} -资源配额与集群资源总量是完全独立的。它们通过绝对的单位来配置。 +ResourceQuota 与集群资源总量是完全独立的。它们通过绝对的单位来配置。 所以,为集群添加节点时,资源配额*不会*自动赋予每个命名空间消耗更多资源的能力。 有时可能需要资源配额支持更复杂的策略,比如: - - 在几个团队中按比例划分总的集群资源。 - - 允许每个租户根据需要增加资源使用量,但要有足够的限制以防止资源意外耗尽。 - - 探测某个命名空间的需求,添加物理节点并扩大资源配额值。 +- 在几个团队中按比例划分总的集群资源。 +- 允许每个租户根据需要增加资源使用量,但要有足够的限制以防止资源意外耗尽。 +- 探测某个命名空间的需求,添加物理节点并扩大资源配额值。 ## 默认情况下限制特定优先级的资源消耗 @@ -798,18 +881,19 @@ It may be desired that pods at a particular priority, eg. "cluster-services", sh (例如 "cluster-services")的 Pod。 通过这种机制,操作人员能够将限制某些高优先级类仅出现在有限数量的命名空间中, 而并非每个命名空间默认情况下都能够使用这些优先级类。 要实现此目的,应使用 kube-apiserver 标志 `--admission-control-config-file` 传递如下配置文件的路径: -{{< tabs name="example1" >}} -{{% tab name="apiserver.config.k8s.io/v1" %}} ```yaml apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration @@ -825,27 +909,6 @@ plugins: operator: In values: ["cluster-services"] ``` -{{% /tab %}} -{{% tab name="apiserver.k8s.io/v1alpha1" %}} -```yaml -# 在 Kubernetes 1.17 中已不推荐使用,请使用 apiserver.config.k8s.io/v1 -apiVersion: apiserver.k8s.io/v1alpha1 -kind: AdmissionConfiguration -plugins: -- name: "ResourceQuota" - configuration: - # 在 Kubernetes 1.17 中已不推荐使用,请使用 apiserver.config.k8s.io/v1, ResourceQuotaConfiguration - apiVersion: resourcequota.admission.k8s.io/v1beta1 - kind: Configuration - limitedResources: - - resource: pods - matchScopes: - - scopeName: PriorityClass - operator: In - values: ["cluster-services"] -``` -{{% /tab %}} -{{< /tabs >}} -有关更多信息,请参见 [LimitedResources](https://github.com/kubernetes/kubernetes/pull/36765) 和 -[优先级类配额支持的设计文档](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/pod-priority-resourcequota.md)。 - - -## 示例 - -查看[如何使用资源配额的详细示例](/zh/docs/tasks/administer-cluster/quota-api-object/)。 - ## {{% heading "whatsnext" %}} - 查看[资源配额设计文档](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_resource_quota.md) +- 查看[如何使用资源配额的详细示例](/zh/docs/tasks/administer-cluster/quota-api-object/)。 +- 阅读[优先级类配额支持的设计文档](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/pod-priority-resourcequota.md)。 了解更多信息。 +- 参阅[LimitedResources](https://github.com/kubernetes/kubernetes/pull/36765) +