一.简单介绍
资源配额Resource Quotas)是用来限制用户资源用量的一种机制。 它的工作原理为:
资源配额应用在Namespace上,并且每个Namespace最多只能有一个ResourceQuota对象
开启计算资源配额后,创建容器时必须配置计算资源请求或限制也可以LimitRange设置默认值)
用户超额后禁止创建新的资源
二.资源配额的启用
首先,在API Server启动时配置ResourceQuota adminssion control,然后在namespace中创建ResourceQuota对象即可。
三.资源配额的类型
计算资源,包括cpu和memory
cpu,limits.cpu,requests.cpu
memory,limits.memory,requests.memory
存储资源,包括存储资源的总量以及制定的storage class的总量
requests.storage:存储资源总量,如500Gi
persistentvolumeclaims:pvc的个数
.storageclass.storage.k8s.io/requests.storage
.storageclass.storage.k8s.io/persistentvolumeclaims
对象数,即可创建的对象的个数
pods, replicationcontrollers, configmaps, secrets
resourcequotas, persistentvolumeclaims
services, services.loadbalancers, services.nodeports
四.LimitRange
默认情况下,kubernetes中所有容器都没有任何cpu和内存限制。limitRange用来给Namespace增加一个资源限制,包括最小、最大和默认资源。比如:
apiVersion: v1
kind: LimitRange
metadata:
name: mylimits
spec:
limits:
- max:
cpu: "2"
memory: 1Gi
min:
cpu: 200m
memory: 6Mi
type: Pod
- default:
cpu: 300m
memory: 200Mi
defaultRequest:
cpu: 200m
memory: 100Mi
max:
cpu: "2"
memory: 1Gi
min:
cpu: 100m
memory: 3Mi
type: Container
五.kubernetes Resource QoS Classes 介绍
对于每一种Resource都可以将容器分为三种Qos Classes: Guaranteed,Burstable,Best-Effort,它们的QoS级别依次递减。
5.1 Guaranteed
如果pod中所有Container的所有Resource的limit和request相等都不为0,则这个Pod的Qos Class就是Guaranteed。
注意:如果一个容器只指明了limit,而未指明request,则表明request的值等于limit的值。
例子如下:
containers:
name: foo
resources:
limits:
cpu: 10m
memory: 1Gi
name: bar
resources:
limits:
cpu: 100m
memory: 100Mi
containers:
name: foo
resources:
limits:
cpu: 10m
memory: 1Gi
requests:
cpu: 10m
memory: 1Gi
name: bar
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 100m
memory: 100Mi
5.2 Best-Effort
如果Pod中所有容器的所有Resource的request和limit都没有赋值,则这个Pod的QoS Class就是Best-Effort.
containers:
name: foo
resources:
name: bar
resources:
5.3 Burstable
除了符合Guaranteed和Best-Effort的场景,其他场景的Pod QoS Class都属于Burstable。
注意:当limit值未指定时,其有效值其实是对应Node Resource的Capacity。
# 容器bar没有对Resource进行指定。
containers:
name: foo
resources:
limits:
cpu: 10m
memory: 1Gi
requests:
cpu: 10m
memory: 1Gi
name: bar
# 容器foo和bar对不同的Resource进行了指定。
containers:
name: foo
resources:
limits:
memory: 1Gi
name: bar
resources:
limits:
cpu: 100m
容器foo未指定limit,容器bar未指定request和limit。
containers:
name: foo
resources:
requests:
cpu: 10m
memory: 1Gi
name: bar