k8s资源管理: Limitrange

大番茄 2020年01月04日 373次浏览

https://kubernetes.io/docs/concepts/policy/limit-range/


limitrange可以对在相同namespace里的pod,container,pvc做相关的资源范围限制,如最大不能超过,最小不能低于。 以及默认值设置。

pod: 限制pod中所有容器使用的limit总和大小, 以及request总和的大小。 还有limit与request之间的倍数限制,如: limit的总和必须是request总和的2倍。
container: 限制container的limit与request大小, 以及limit与request的倍数。还有默认的limit与request大小。
pvc: 分配的最大与最小存储空间的限制。

限制范围总览

管理员在一个命名空间内创建一个 LimitRange 对象。
用户在命名空间内创建 Pod ,Container 和 PersistentVolumeClaim 等资源。
LimitRanger 准入控制器对所有没有设置计算资源需求的 Pod 和 Container 设置默认值与限制值, 并跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 对象中的最小、最大资源使用量以及使用量比值。
若创建或更新资源(Pod、 Container、PersistentVolumeClaim)违反了 LimitRange 的约束, 向 API 服务器的请求会失败,并返回 HTTP 状态码 403 FORBIDDEN 与描述哪一项约束被违反的消息。
若命名空间中的 LimitRange 启用了对 cpu 和 memory 的限制, 用户必须指定这些值的需求使用量与限制使用量。否则,系统将会拒绝创建 Pod。
LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。


配置起来很简单,只是有几点需要注意:
1、对已经存在的资源也生效,如:deployment发生pod调度,controller需要访问apiserver,只要访问apiserver就会经过访问控制。 如果deployment里的pod不符和limitrange的规则,apiserver拒绝controller的访问并返回403,pod调度失败。下面第二第三的报错信息都是controller-manager报出来的。
要注意cronjob类的资源,因为这个任务是反复执行,所以controller调度的也多。
2、maxLimitRequestRatio:limit与request的倍数限制需要container已经配置limit与request, 如果没有配置,会被拒绝。

E0104 09:46:56.026078   24795 replica_set.go:450] Sync "test/centos7-test-6d7c69bb86" failed with pods "centos7-test-6d7c69bb86-r6cvn" is forbidden: memory max limit to request ratio per Pod is 2, but no request is specified or request is 0  
E0104 09:47:07.822195   24795 replica_set.go:450] Sync "test/centos7-test-6d7c69bb86" failed with pods "centos7-test-6d7c69bb86-x8ghq" is forbidden: memory max limit to request ratio per Pod is 2, but no request is specified or request is 0  
E0104 09:47:09.051782   24795 replica_set.go:450] Sync "test/centos7-test-6d7c69bb86" failed with pods "centos7-test-6d7c69bb86-dfcfd" is forbidden: memory max limit to request ratio per Pod is 2, but no request is specified or request is 0  

3、defaultdefaultRequest: 配置的默认值其实就是给container添加默认的limit与request配置,但是container添加配置以后,还是会受到limitrange中的maxLimitRequestRatio参数的限制。 所以要注意一下。下面的报错就是配置的默认request与默认limit相差的倍数太大,而maxlimitrequestratio只限制了2倍。

E0104 10:04:46.171275   24795 replica_set.go:450] Sync "test/centos7-test-6d7c69bb86" failed with pods "centos7-test-6d7c69bb86-qbwn4" is forbidden: memory max limit to request ratio per Pod is 2, but provided ratio is 8.108108  
E0104 10:04:46.185093   24795 replica_set.go:450] Sync "test/centos7-test-6d7c69bb86" failed with pods "centos7-test-6d7c69bb86-vnvqk" is forbidden: memory max limit to request ratio per Pod is 2, but provided ratio is 8.108108  
E0104 10:05:17.695342   24795 replica_set.go:450] Sync "test/centos7-test-6d7c69bb86" failed with pods "centos7-test-6d7c69bb86-7dl2m" is forbidden: memory max limit to request ratio per Pod is 2, but provided ratio is 8.108108  

4、不同的limitrange配置文件: 不同的limitrange配置文件配置不会检查规则冲突如:max与default如果在相同配置文件设置的有冲突,创建就会失败。 如果在不同的配置文件就没有问题。 然后就会导致分配给container的默认资源限制不符合规则。


配置:

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-mem-cpu-per-co
spec:
  limits:
  - max:
      cpu: "2000m"
      memory: "1Gi"
    min:
      cpu: "100m"
      memory: "99Mi"
    default:
      cpu: "700m"
      memory: "900Mi"
    defaultRequest:
      cpu: "110m"
      memory: "111Mi"
    maxLimitRequestRatio:
      memory: 2
    type: Container

max: limit限制,限制所有创建的container的limit不能超过这个。
min: request限制,限制所有创建的container的request不能低于这个。
default: 默认limit, 如果container没有分配limit与request,就添加这里指定的limit.
defaultRequest: 默认request, 如果container没有分配limit与request,就添加这里指定的request.
maxLimitRequestRatio:限制limit与request的倍数,这里的值很显然是有问题的。
type: 可以使用Pod,Container,PersistentVolumeClaim

上面的default部分写的是没有分配limit与request, 是因为如果container指定了其中的一项,另一项不会单单的使用默认值。
如果container只指定了limit或request:
只指定了limit, 默认的request会与指定的limit相同。
只指定了request, 默认的limit会与limitrange配置中的default相同。

补充:
typer如果是pod: max与min分别是整个pod所有容器limit的总和 与 所有容器request总和 的限制。
type是container: 是单一容器的限制。 只有container可以使用default与defaultRequest。
只有pod与container可以使用maxLimtRequestRatio。

pvc:
贴一个官方的例子吧:

apiVersion: v1
kind: LimitRange
metadata:
  name: storagelimits
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 2Gi
    min:
      storage: 1Gi