一.资源限制LimitRange概述
1.什么是资源限制
默认情况下, Kubernetes集群上的容器运行使用的计算资源没有限制。
使用Kubernetes资源配额, 管理员(也称为集群操作者)可以在一个指定的命名空间内限制集群资源的使用与创建。 在命名空间中,一个 Pod 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。
作为集群操作者或命名空间级的管理员,你可能也会担心如何确保一个Pod不会垄断命名空间内所有可用的资源。
LimitRange是限制命名空间内可为每个适用的对象类别 (例如 Pod 或 PersistentVolumeClaim) 指定的资源分配量(限制和请求)的策略对象。
一个 LimitRange(限制范围) 对象提供的限制能够做到:
- 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
- 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
- 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
- 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。
当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施LimitRange限制。LimitRange 的名称必须是合法的 DNS 子域名。
参考链接:
https://kubernetes.io/zh-cn/docs/concepts/policy/limit-range/
2.资源限制LimitRange和请求的约束
- 管理员在一个命名空间内创建一个 LimitRange 对象。
- 用户在此命名空间内创建(或尝试创建) Pod 和 PersistentVolumeClaim 等对象。
- 首先,LimitRanger 准入控制器对所有没有设置计算资源需求的所有 Pod(及其容器)设置默认请求值与限制值。
- 其次,LimitRange 跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 所定义的最小、最大资源使用量以及使用量比值。
- 若尝试创建或更新的对象(Pod 和 PersistentVolumeClaim)违反了 LimitRange 的约束, 向 API 服务器的请求会失败,并返回 HTTP 状态码 403 Forbidden 以及描述哪一项约束被违反的消息。
- 若你在命名空间中添加 LimitRange 启用了对 cpu 和 memory 等计算相关资源的限制, 你必须指定这些值的请求使用量与限制使用量。否则,系统将会拒绝创建 Pod。
- LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。 如果你添加或修改 LimitRange,命名空间中已存在的 Pod 将继续不变。
- 如果命名空间中存在两个或更多 LimitRange 对象,应用哪个默认值是不确定的。
二.资源限制LimitRange实战案例
1.计算资源最大,最小限制
1.1 设置容器的最大值和最小值限制资源
[root@master231 02-LimitRange]# cat 01-cpu-memory-min-max.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-memory-min-max
namespace: kube-public
spec:
limits:
# 容器能设置limit的最大值
- max:
cpu: 2
memory: 4Gi
# 容器能设置limit的最小值
min:
cpu: 200m
memory: 100Mi
# 限制的类型是容器
type: Container
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 01-cpu-memory-min-max.yaml
limitrange/cpu-memory-min-max created
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl -n kube-public get limits
NAME CREATED AT
cpu-memory-min-max 2024-01-09T14:45:28Z
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl -n kube-public describe limits cpu-memory-min-max
Name: cpu-memory-min-max
Namespace: kube-public
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container memory 100Mi 4Gi 4Gi 4Gi -
Container cpu 200m 2 2 2 -
[root@master231 02-LimitRange]#
温馨提示:
注意,上面有一个"Default Request"和"Default Limit"选项,表示当用户没有设置资源限制相关字段时,就是用该默认值哟。
1.2 小于requests样例测试
[root@master231 02-LimitRange]# cat 02-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pods-nginx
namespace: kube-public
spec:
containers:
- name: web
image: nginx:1.20.1-alpine
resources:
requests:
cpu: 0.1
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 02-pods.yaml
Error from server (Forbidden): error when creating "02-pods.yaml": pods "pods-nginx" is forbidden: minimum cpu usage per Container is 200m, but request is 100m
[root@master231 02-LimitRange]#
1.3 大于limits样例测试
[root@master231 02-LimitRange]# cat 03-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pods-nginx-02
namespace: kube-public
spec:
containers:
- name: web
image: nginx:1.20.1-alpine
resources:
requests:
cpu: 0.5
memory: 1Gi
limits:
cpu: 1
memory: 5Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 03-pods.yaml
Error from server (Forbidden): error when creating "03-pods.yaml": pods "pods-nginx" is forbidden: maximum memory usage per Container is 4Gi, but limit is 5Gi
[root@master231 02-LimitRange]#
1.4 不设置resources字段
[root@master231 02-LimitRange]# cat 04-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pods-nginx-04
namespace: kube-public
spec:
containers:
- name: web
image: nginx:1.20.1-alpine
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 04-pods.yaml
pod/pods-nginx-04 created
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl -n kube-public get pods pods-nginx-04 -o yaml | grep resources -A 6
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "2"
memory: 4Gi
[root@master231 02-LimitRange]#
1.5 设置合法的resources字段
[root@master231 02-LimitRange]# cat 05-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pods-nginx-05
namespace: kube-public
spec:
containers:
- name: web
image: nginx:1.20.1-alpine
resources:
requests:
cpu: 0.5
memory: 1Gi
limits:
cpu: 2
memory: 3Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 05-pods.yaml
pod/pods-nginx-05 created
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl -n kube-public get pods pods-nginx-04 -o yaml | grep resources -A 6
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "2"
memory: 4Gi
[root@master231 02-LimitRange]#
温馨提示:
不难发现,我们创建时,指定的"requests.cpu"是"0.5",而"requests.memory"是"1Gi",但实际上运行时却是我们设置的默认的最小值哟~
2.计算资源默认值限制
2.1 设置容器的默认限制资源
[root@master231 02-LimitRange]# cat 06-cpu-memory-default.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-memory-min-max-default
namespace: kube-public
spec:
limits:
- max:
cpu: 2
memory: 4Gi
min:
cpu: 200m
memory: 100Mi
type: Container
# 设置默认值的Request
defaultRequest:
cpu: 200m
memory: 500Mi
# 设置默认值的Limit
default:
cpu: 1
memory: 2Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 06-cpu-memory-default.yaml
limitrange/cpu-memory-min-max-default created
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl -n kube-public describe limitrange cpu-memory-min-max-default
Name: cpu-memory-min-max-default
Namespace: kube-public
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 200m 2 200m 1 -
Container memory 100Mi 4Gi 500Mi 2Gi -
[root@master231 02-LimitRange]#
2.2 不设置resources字段验证
[root@master231 02-LimitRange]# cat 07-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pods-nginx-07
namespace: kube-public
spec:
containers:
- name: web
image: nginx:1.20.1-alpine
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 07-pods.yaml
pod/pods-nginx-07 created
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl -n kube-public get pods pods-nginx-07 -o yaml | grep resources -A 6
resources:
limits:
cpu: "1"
memory: 2Gi
requests:
cpu: 200m
memory: 500Mi
[root@master231 02-LimitRange]#
3.存储资源最大,最小限制
2.1 设置指定范围的存储资源限制
[root@master231 02-LimitRange]# cat 08-storage-min-max.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: storage-min-max
namespace: kube-public
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 10Gi
min:
storage: 1Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 08-storage-min-max.yaml
limitrange/storage-min-max created
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl -n kube-public describe limitrange storage-min-max
Name: storage-min-max
Namespace: kube-public
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
PersistentVolumeClaim storage 1Gi 10Gi - - -
[root@master231 02-LimitRange]#
2.2 小于min样例测试
[root@master231 02-LimitRange]# cat 09-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo-09
namespace: kube-public
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 0.5Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 09-pvc.yaml
Error from server (Forbidden): error when creating "09-pvc.yaml": persistentvolumeclaims "pvc-demo-09" is forbidden: minimum storage usage per PersistentVolumeClaim is 1Gi, but request is 512Mi
[root@master231 02-LimitRange]#
2.3 大于max样例测试
[root@master231 02-LimitRange]# cat 10-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo-10
namespace: kube-public
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 15Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 10-pvc.yaml
Error from server (Forbidden): error when creating "10-pvc.yaml": persistentvolumeclaims "pvc-demo-10" is forbidden: maximum storage usage per PersistentVolumeClaim is 10Gi, but request is 15Gi
[root@master231 02-LimitRange]#
2.4 设置合法的存储大小字段
[root@master231 02-LimitRange]# cat 11-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo-11
namespace: kube-public
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
[root@master231 02-LimitRange]#
[root@master231 02-LimitRange]# kubectl apply -f 11-pvc.yaml
persistentvolumeclaim/pvc-demo-11 created
[root@master231 02-LimitRange]#