一.簡單介紹
資源配額(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