一、LimitRange是什么¶
默认情况下, Kubernetes 集群上的容器运行使用的计算资源没有限制。 使用 Kubernetes 资源配额, 管理员(也称为 集群操作者)可以在一个指定的命名空间内限制集群资源的使用与创建。 在命名空间中,一个 Pod最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。 作为集群操作者或命名空间级的管理员,你可能也会担心如何确保一个 Pod 不会垄断命名空间内所有可用的资源。
LimitRange是另一个用于资源管理的对象,主要用于配置资源请求(requests)和限制(limits)的默认值和使用范围。Kubernetes管理员可以使用LimitRange?控制Pod或容器的资源请求和限制,从而进一步避免资源浪费和过度消耗。
LimitRange 是限制命名空间内可为每个适用的对象类别 (例如 Pod 或 PersistentVolumeClaim指定的资源分配量(限制和请求)的策略对象。
一个 LimitRange(限制范围) 对象提供的限制能够做到:
- 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
- 在一个命名空间中实施对每个 PersistentVolumeClaim能申请的最小和最大的存储空间大小的限制。
- 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
- 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。
当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施 LimitRange 限制。
LimitRange 的名称必须是合法的 DNS 子域名。
二、LimitRange出现背景¶
LimitRange之所以出现,一般只为应对两种常见场景:
场景一:假如我们通过ResourceQuota只限制了内存和CPU,没有限制Pod数量的情况,在CPU和内存为0时无限制地创建Pod,从而造成无法统计的情况。
场景二:假如一个Namespace分配了16核、64GB的空间,之后创建一个申请了requests.cpu为16、requests.memory为64GB的容器,那么单个Pod就能把整个Namespace的资源全部占用。
小结:
- ResourceQuota:解决 命名空间之间 的资源争抢问题(横向隔离)。
- LimitRange:解决 命名空间内部 的资源分配问题(纵向控制)。
三、LimitRange使用背景¶
LimitRange通常用于如下背景:
- 设置默认资源请求和限制:确保每个容器在创建时都有合理的默认资源请求和限制。
- 限制资源使用范围:防止用户设置过高的资源请求和限制,导致资源浪费。
四、LimitRange配置解析¶
apiVersion: v1
kind: LimitRange
metadata:
name: example-limit-range
namespace: my-namespace
spec:
limits:
- type: Container
default:
memory: 256Mi
cpu: 500m
defaultRequest:
memory: 64Mi
cpu: 250m
min:
memory:32Mi
cpu:100m
max:
memory:1Gi
cpu:1
上面参数说明:
- type:资源类型的限制,常见的值有Container、Pod等
- default:默认limits配置
- memory:默认的内存限制
- cpu:默认的CPU限制
- defaultRequest:默认requests配置
- memory:默认的内存请求
- cpu:默认的CPU请求
- min:内存和CPU的最小配置(request)
- memory:内存请求和限制的最小值
- cpu:CPU请求和限制的最小值
- max:内存和CPU的最大配置(limit)
- memory:内存请求和限制的最大值
- cpu:CPU请求和限制的最大值
注意:LimitRange作用于Pod,并且有命名空间限制!!!