这次我们看下K8S中的资源限制,主要是关于K8S中的ResourceQuota 对象
关于资源限制,主要是对每个命名空间的资源消耗总量提供限制,或者限制某些对象的总数目上限
在同一个命名空间下,可以创建多个ResourceQuota对象,共同生效
如果一个操作违反了配额的约束,会导致报错产生403的反应
如果一个命名空间下的计算资源,诸如CPU和Memory 配额被启用,那么一个Pod就必须要设置请求值和约束值,除非使用LimitRanger来设置默认值
接下来,我们会按照计算资源配额,存储资源配额,对象数量配额,这三个方面去讲解配置限制
1. 计算资源配置
创建的示例yaml如下
apiVersion: v1
kind: ResourceQuota metadata: name: compute-resources spec: hard: requests.cpu: “1” requests.memory: 1Gi limits.cpu: “2” limits.memory: 2Gi requests.nvidia.com/gpu: 4 |
如果设置了这个limit之后,所有的pod都需要手动配置对应的limit及Requets
2. 存储资源配额
关于存储资源的配额
配置项如上
3. 对象数量配额
前缀统一为count
count/<resource>.<group>:用于非核心(core)组的资源
count/<resource>:用于核心组的资源
常见的对象资源管理有
count/persistentvolumeclaims
count/services
count/secrets
count/configmaps
count/replicationcontrollers
count/deployments.apps
count/replicasets.apps
count/statefulsets.apps
count/jobs.batch
count/cronjobs.batch
其次是ResouceQuota是可以设置优先级的
利用scopeSelector字段,来确定Pod的优先级来控制资源限制
比如我们创建三个优先级类之一,即low,medium high
然后分配创建配额对象,在Pod创建的时候,声明对应的优先级来进行控制
apiVersion: v1
kind: List items: – apiVersion: v1 kind: ResourceQuota metadata: name: pods-high spec: hard: cpu: “1000” memory: 200Gi pods: “10” scopeSelector: matchExpressions: – operator : In scopeName: PriorityClass values: [“high”] |
首先是创建了一张优先级为high的配置限额对象
这个对象声明了cpu memory pods的限制
然后我们声明一个Pod,使用high优先级的配额对象
apiVersion: v1
kind: Pod metadata: name: high-priority spec: containers: – name: high-priority image: ubuntu command: [“/bin/sh”] args: [“-c”, “while true; do echo hello; sleep 10;done”] resources: requests: memory: “10Gi” cpu: “500m” limits: memory: “10Gi” cpu: “500m” priorityClassName: high |
这时候再查看
kubectl get quota,即可看到对应的high级别的quota已经有所改变
其次,一开始我们说过,如果指定了限制的cpu或memory,就需要在每个pod中指定限制,除非配置了默认的LimitRange
关于这个LimitRange,不仅仅是提供默认的配置范围而且还是为了避免出现,一个Pod或者Container会垄断所有可用的资源,LimitRange在命名空间内限制资源范围
比如我们有一个限制配额,为1CPU 1G
而如果我们有一个Pod直接申请了1CPU 1G,直接占满了,那么就不合理了,不如限制每个Pod申请的LimitRange的范围
基本的使用如下
一个LimitRange的使用如下
apiVersion: v1
kind: LimitRange metadata: name: cpu-min-max-demo-lr spec: limits: – max: cpu: “800m” min: cpu: “200m” type: Container |
这个时候,我们申请创建的Pod声明的cpu范围就必须要在800-200m之间
如果不声明,则会带一个默认的800m,也就是上限
不过可以设置默认值
limits:
– default: cpu: 800m defaultRequest: cpu: 800m max: cpu: 800m min: cpu: 200m type: Container |
这时候就有了默认的cpu限制