上一节学的书限制单独的pod的资源,使用到了LimitRange。我们如果需要限制命名空间中的可用资源总量,就满足不了,需要创建一个ResourceQuota对象来实现。
1.ResourceQuota资源
ResoureceQuota的控制插件可以检查新增的pod是哦福会引起总资源超出ResourceQuota,类似LimitRange和LimitRange插件的作用。只是针对新创建的pod,并不影响已经存在的pod。
资源配额限制了一个命名空间中的pod和pvc存储最多可以使用的资源总量。同时也可以限制用户允许在该命名空间中创建pod、pvc,以及其他api对象的数量,处理最多的资源是cpu和内存。
为cpu和内存创建ResourceQuota
yaml文件:quota-cpu-memory.yaml
apiVersion:v1
kind:ResourceQuota
metaData:
name:cpu-and0mem
spec:
hard:
requests.cpu:400m
requests.memory:200Mi
limits.cpu:600m
limits.memory:500Mi
如上,为cpu和内存分别定义了requests和limits总量,而不是简单的为每种资源中定义一个总量。和LimitRange对比,结构不同,所有资源的requests和limits都定义在一个字段下。
与limitRange一样,ResourceQuota对象应用于他所创建的那个命名空间,但不同的是,ResourceQuota可以限制所有pod资源requests和limits总量,而不是每个单独的pod和容器。
查看额度和额度使用情况
kubectl describe quota
与ResourceQuota同时创建LimitRange
注意:创建ResourceQuota是还需要随之创建一个LimitRange对象。如果没有,则无法创建成功,因为他没有置顶任何资源requests和limits。
2.为持久化存储指定配额
ResourceQuota独享可以限制某个命名空间中最多可以声明的持久化存储总量。
yaml文件:quota-storage.yaml
apiVersion:v1
kind:ResourceQuota
metadata:
name:storage
spec:
hard:
requests.storage:500Gi
ssd.storageclass.storage.k8s.io/requests.storage:300Gi
standard.storageclass.storage.k8s.io/requests.storage:1Ti
3.限制可创建对象的个数
ResourceQuota可以限制按个命名空间中的pod、ReplicationController、Service以及其他对象的个数。鸡群管理员可以根据比如付费计划限制用户能够创建的对象个数,同时也可以用来限制公网IP或者Service可使用的节点端口个数。
yaml文件:quota-object-count.yaml
apiVersion:v1
kind:ResourceQuota
metadata:
name:objects
spec:
hard:
pods:10
replicationcontrollers:5
secrets:10
configmaps:10
persistentvolumeclaims:4
services:5
services.loadbalances:1
services.nodeports:2
ssd.storageclass.storage.k8s.io/persistentvolumeclains:2
对象个数配额目前可以限制一下对象配置:
pod
ReplicationController
Secret
ConfigMap
Persistent Volume Claim
Service(通用),以及两种特定类型的Service,比如LoadBalancer Service(service.loadbalances)和NodePort Service(services.nodeports)
目前ReplicaSet、Job、Deployment、Ingress等限制还需要看最新的文档
4.为特定的pod状态或者Qos等级指定配额
创建的Quota应用于所有pod,不管pod的当前状态和Qos等级如何。
但是Quota可以被一组quota scopes限制。目前配额作用范围有4种:
BestEffort、NotBestEffort、Termination和NotTerminating
BestEffort和NotBestEffort范围决定了配额是否应用于BestEffort Qos等级或者两种等级(Burstable和Guaranteed)的pod
Terminating和NotTerminating这两个范围说明:
为每个pod制定被标记为Failed,真正停止之前还可以运行多长时间,这是通过pod spec中配置的activeDeadlineSeconds来实现的。该属性定义了一个pod从开始尝试停止的时间到其被标记为Failed然后真正停止之前,允许其在节点上继续运行的秒数。Terminating配额作用范围应用与这些配置了activeDeadlineSeconds的pod。而NotTerminating应用于哪些没有指定该配置的pod。
说明:
创建ResourceQuota时,可以为其指定作用范围,目标pod必须与配额所配置的所有范围向匹配。另外配额范围也决定了配额可以限制的内容:BestEffort范围只允许限制pod个数,而其他3种范围除了pod个数,还可以限制cpu/内存的requests和limits。