这次我们看下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限制

发表评论

邮箱地址不会被公开。 必填项已用*标注