kubernetes资源清单之resourcequotas
kubernetes(k8s)资源清单之resourcequotas详解
kubernetes资源清单之resourcequotas
一、资源配额
多个用户或团队共享具有固定节点数目的集群时,会担心有人使用超过其基于公平原则所分配到的资源量。
Kubernetes
提供了两种资源限制的方式:ResourceQuota
和LimitRange
。其中ResourceQuota
是针对namespace
做的资源限制,而LimitRange
是针对namespace
中的每个组件做的资源限制。
资源配额,通过 ResourceQuota
对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod
可以使用的计算资源的总上限。
二、资源配额的工作方式
- 不同的团队可以在不同的命名空间下工作。这可以通过
RBAC
强制执行。 - 集群管理员可以为每个命名空间创建一个或多个
ResourceQuota
对象。 - 当用户在命名空间下创建资源(如 Pod、Service 等)时,
Kubernetes
的配额系统会 跟踪集群的资源使用情况,以确保使用的资源用量不超过ResourceQuota
中定义的硬性资源限额。 - 如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN), 并在消息中给出有可能违反的约束。
- 如果命名空间下的计算资源 (如
cpu
和memory
)的配额被启用,则用户必须为 这些资源设定请求值(request)和约束值(limit),否则配额系统将拒绝 Pod 的创建。 提示: 可使用LimitRanger
准入控制器来为没有设置计算资源需求的 Pod 设置默认值。
在集群容量小于各命名空间配额总和的情况下,可能存在资源竞争。资源竞争时,Kubernetes 系统会遵循先到先得的原则。不管是资源竞争还是配额的修改,都不会影响已经创建的资源使用对象。
三、启用资源配额
资源配额的支持在很多 Kubernetes
版本中是默认启用的。 当 API
服务器的命令行标志 --enable-admission-plugins=
中包含 ResourceQuota
时, 资源配额会被启用。
当命名空间中存在一个 ResourceQuota 对象时,对于该命名空间而言,资源配额就是开启的。
四、计算资源配额
资源名称 | 描述 |
---|---|
limits.cpu | 所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。 |
limits.memory | 所有非终止状态的 Pod,其内存限额总量不能超过该值。 |
requests.cpu | 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。 |
requests.memory | 所有非终止状态的 Pod,其内存需求总量不能超过该值。 |
hugepages- | 对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值。 |
cpu | 与 requests.cpu 相同。 |
memory | 与 requests.memory 相同。 |
五、存储资源配额
资源名称 | 描述 |
---|---|
requests.storage | 所有 PVC ,存储资源的需求总量不能超过该值。 |
persistentvolumeclaims | 在该命名空间中所允许的PVC 总量。 |
<storage-class-name>.storageclass.storage.k8s.io/requests.storage | 在所有与 <storage-class-name> 相关的持久卷申领中,存储请求的总和不能超过该值。 |
<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims | 在与 storage-class-name 相关的所有持久卷申领中,命名空间中可以存在的持久卷申领总数。 |
在 Kubernetes 1.8 版本中,本地临时存储的配额支持已经是 Alpha 功能:
资源名称 | 描述 |
---|---|
requests.ephemeral-storage | 在命名空间的所有 Pod 中,本地临时存储请求的总和不能超过此值。 |
limits.ephemeral-storage | 在命名空间的所有 Pod 中,本地临时存储限制值的总和不能超过此值。 |
ephemeral-storage | 与 requests.ephemeral-storage 相同。 |
六、对象数量配额
资源名称 | 描述 |
---|---|
configmaps | 在该命名空间中允许存在的 ConfigMap 总数上限。 |
persistentvolumeclaims | 在该命名空间中允许存在的 PVC的总数上限。 |
pods | 在该命名空间中允许存在的非终止状态的 Pod 总数上限。Pod 终止状态等价于 Pod 的 .status.phase in (Failed, Succeeded) 为真。 |
replicationcontrollers | 在该命名空间中允许存在的 ReplicationController 总数上限。 |
resourcequotas | 在该命名空间中允许存在的 ResourceQuota 总数上限。 |
services | 在该命名空间中允许存在的 Service 总数上限。 |
services.loadbalancers | 在该命名空间中允许存在的 LoadBalancer 类型的 Service 总数上限。 |
services.nodeports | 在该命名空间中允许存在的 NodePort 类型的 Service 总数上限。 |
secrets | 在该命名空间中允许存在的 Secret 总数上限。 |
七、配额作用域
作用域 | 描述 |
---|---|
Terminating | 匹配所有 spec.activeDeadlineSeconds 不小于 0 的 Pod。 |
NotTerminating | 匹配所有 spec.activeDeadlineSeconds 是 nil 的 Pod。 |
BestEffort | 匹配所有 Qos 是 BestEffort 的 Pod。 |
NotBestEffort | 匹配所有 Qos 不是 BestEffort 的 Pod。 |
PriorityClass | 匹配所有引用了所指定的优先级类的 Pods。 |
CrossNamespacePodAffinity | 匹配那些设置了跨名字空间 (反)亲和性条件的 Pod。 |
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
字段必须至少包含一个值
八、resourcequotas实例
8.1、计算资源
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "4"
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
查看
kubectl describe -n test resourcequota compute-resources
Name: compute-resources
Namespace: test
Resource Used Hard
-------- ---- ----
limits.cpu 500m 2
limits.memory 512Mi 2Gi
pods 1 4
requests.cpu 500m 1
requests.memory 512Mi 1Gi
8.2、存储资源
apiVersion: v1
kind: ResourceQuota
metadata:
name: storage-resources
namespace: test
spec:
hard:
requests.storage: "5"
persistentvolumeclaims: "5"
nginx.storageclass.storage.k8s.io/requests.storage: 500Gi
nginx.storageclass.storage.k8s.io/persistentvolumeclaims: "5"
查看
kubectl describe -n test resourcequota/storage-resources
Name: storage-resources
Namespace: test
Resource Used Hard
-------- ---- ----
nginx.storageclass.storage.k8s.io/persistentvolumeclaims 0 5
nginx.storageclass.storage.k8s.io/requests.storage 0 500Gi
persistentvolumeclaims 0 5
requests.storage 0 5
8.3、对象数量
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
namespace: test
spec:
hard:
configmaps: "10"
persistentvolumeclaims: "5"
pods: "4"
replicationcontrollers: "20"
secrets: "10"
services: "10"
services.loadbalancers: "2"
查看
kubectl describe -n test resourcequota/object-counts
Name: object-counts
Namespace: test
Resource Used Hard
-------- ---- ----
configmaps 1 10
persistentvolumeclaims 0 5
pods 1 4
replicationcontrollers 0 20
secrets 1 10
services 0 10
services.loadbalancers 0 2
更多推荐
所有评论(0)