一、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,并且有命名空间限制!!!