什么是LimitRange
LimitRange是在namespace范围内,限制pod或container资源使用量的策略。
LimitRange可以:
- 限制namespace中每个pod或container的最小和最大资源用量。
- 限制namespace中每个PVC的资源请求范围。
- 限制namespace中资源请求和限制数量的比例。
- 配置资源的默认限制。
使用LimitRange
默认来说k8s集群已启用LimitRange。创建LimitRange之后,LimitRange会在它所属namespace范围内生效。
使用概览
- 管理员创建一个LimitRange。
- 用户在namespace中创建pod,PVC等资源对象。
- 对于该namespace中所有没有配置资源使用限制的资源对象,第一步创建的LimitRange对他们生效。
- 如果创建的资源对象违反LimitRange的限制,k8s APIServer会给出403 FORBIDDEN。
- 如果namespace中配置了LimitRange,限制了类似cpu和内存等计算资源,用户必须指明这些限制的值,否则k8s可能拒绝pod。
- LimitRange在pod admission阶段检查,pod运行阶段不会检查。
注意:对于已经运行的pod,不存在资源竞争问题,LimitRange的修改对他们也不生效。只有在pod创建时LimitRange才有效。
使用LimitRange限制Container的资源使用
如下的例子建立了一个LimitRange资源对象,用来限制container使用的资源。
apiVersion: v1
kind: LimitRange
metadata:
name: limit-mem-cpu-per-container
spec:
limits:
- max:
cpu: "800m"
memory: "1Gi"
min:
cpu: "100m"
memory: "99Mi"
default:
cpu: "700m"
memory: "900Mi"
defaultRequest:
cpu: "110m"
memory: "111Mi"
type: Container
查看LimitRange
kubectl describe limitrange/limit-mem-cpu-per-container
创建限制资源使用的pod
apiVersion: v1
kind: Pod
metadata:
name: busybox1
spec:
containers:
- name: busybox-cnt01
image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello from cnt01; sleep 10;done"]
resources:
requests:
memory: "100Mi"
cpu: "100m"
limits:
memory: "200Mi"
cpu: "500m"
- name: busybox-cnt02
image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello from cnt02; sleep 10;done"]
resources:
requests:
memory: "100Mi"
cpu: "100m"
- name: busybox-cnt03
image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello from cnt03; sleep 10;done"]
resources:
limits:
memory: "200Mi"
cpu: "500m"
- name: busybox-cnt04
image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello from cnt04; sleep 10;done"]
获取container的资源限制信息
kubectl get po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[0].resources"
最终pod资源限制的处理机制
- 如果pod配置了请求和限制,并且请求和限制的值位于LimitRange对应类型资源的min和max之间。pod资源限制采用pod的配置。
- 如果pod配置了请求但没有配置限制,pod限制会采用LimitRange中的默认配置。
- 如果pod配置了限制但没有配置请求,pod请求会使用和limit相同的配置。
- 如果pod既没有配置请求又没有配置限制,pod限制使用LimitRange定义的默认配置,请求使用defaultRequest的配置。
使用LimitRange限制Pod的资源使用
创建LimitRange是,将type的值指定为Pod即可。
apiVersion: v1
kind: LimitRange
metadata:
name: limit-mem-cpu-per-pod
spec:
limits:
- max:
cpu: "2"
memory: "2Gi"
type: Pod
注意:pod类型的LimitRange会检查之后创建的pod中所有container配置的资源限制总和,如果pod内所有container的资源限制总和超过了LimitRange的限制,pod创建会被拒绝。
使用LimitRange限制PVC的资源使用
一个例子如下所示:
apiVersion: v1
kind: LimitRange
metadata:
name: storagelimits
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 2Gi
min:
storage: 1Gi
这个例子限制了PVC的最小存储请求和最大资源请求量。
使用LimitRange控制limit/request比例
LimitRange还可以控制资源限制量和请求量的最大比例,即limit/request要求小于等于maxLimitRequestRatio。
apiVersion: v1
kind: LimitRange
metadata:
name: limit-memory-ratio-pod
spec:
limits:
- maxLimitRequestRatio:
memory: 2
type: Pod
这个例子限制了pod的内存request和limit的比例必须小于等于2。否则pod的创建会被拒绝。
比如创建下面这个pod:
apiVersion: v1
kind: Pod
metadata:
name: busybox3
spec:
containers:
- name: busybox-cnt01
image: busybox
resources:
limits:
memory: "300Mi"
requests:
memory: "100Mi"
这个pod的内存资源的limit/request为3,大于LimitRange中配置的2,不符合要求,不允许创建这个pod。
网友评论