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、default
与defaultRequest
: 配置的默认值其实就是给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