k8s资源限制管理:LimitRange and ResourceQuota

LimitRange vs ResourceQuota

LimitRangeResourceQuota用于管理中命名空间每个pod 和容器的资源申请约束
ResourceQuota用于限制命名空间的总资源消耗

ResourceQuota example:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
spec:
  hard:
    configmaps: "10" 
    persistentvolumeclaims: "4" 
    replicationcontrollers: "20" 
    secrets: "10" 
    services: "10"

LimitRange example

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 
spec:
  limits:
    -
      type: "Pod"
      max:
        cpu: "2" 
        memory: "1Gi" 
      min:
        cpu: "200m" 
        memory: "6Mi" 
    -
      type: "Container"
      max:
        cpu: "2" 
        memory: "1Gi" 
      min:
        cpu: "100m" 
        memory: "4Mi" 
      default:
        cpu: "300m" 
        memory: "200Mi" 
      defaultRequest:
        cpu: "200m" 
        memory: "100Mi" 
      maxLimitRequestRatio:
        cpu: "10" 

LimitRange:每个pod 和容器的资源申请约束

LimitRange提供的约束可以:

1、在命名空间中限制每个 Pod 或容器的最小和最大计算资源使用量,如:cpu,memory

2、在命名空间中限制最小和最大存储持久卷或者本地存储容量,如:pvc,local-storage

3、为命名空间中的计算资源设置默认请求/限制,并在运行时自动将它们注入容器

4、在命名空间中限制pod或者容器申请的资源的limit与request的比值,即:limit/request的值

参数设置:

Container 参数:
* max: Pod 中所有容器的 Limits 值上限。
* min: Pod 中所有容器的 Requests 值下限。
* default: Pod 中容器未指定 Limits 时,将此值设置为默认值。
* defaultRequest: Pod 中容器未指定 Requests 是,将此值设置为默认值。
* maxLimitRequestRatio: 
Pod 中的容器设置 Limits 与 Requests 的比例的值不能超过 maxLimitRequestRatio 参数
设置的值,即:Limits/Requests ≤ maxLimitRequestRatio。

Pod 参数:
* max: Pod 中所有容器资源总和值上限。
* min: Pod 中所有容器资源总和值下限。
* maxLimitRequestRatio: 
Pod 中全部容器设置 Limits 总和与 Requests 总和的比例的值不能超过
maxLimitRequestRatio 参数设置的值,即: 
(All Container Limits)/(All Container Requests) ≤ maxLimitRequestRatio。

示例:使用limitrange限制pod使用本地存储的空间,即:pod直接写入容器读写层的空间

apiVersion: v1
kind: LimitRange
metadata:
  name: storage-limit
  namespace: mytest
spec:
  limits:
  - default:
      ephemeral-storage: 2Gi
    defaultRequest:
      ephemeral-storage: 1Gi 
    type: Container

ResourceQuota:命名空间的总资源消耗约束

ResourceQuota提供的约束可以:

1、计算资源配额: 限制一个 Namespace 中所有 Pod 的计算资源(CPU、Memory)的总和。

2、存储资源配额: 限制一个 Namespace 中所有存储资源的总量。

3、对象数量配额: 限制一个 Namespace 中指定类型对象的数量。

1、ResourcesQuota 支持的计算资源:

cpu: 所有非终止状态的Pod中,其CPU需求总量不能超过该值。
limits.cpu: 所有非终止状态的Pod中,其CPU限额总量不能超过该值。
limits.memory: 所有非终止状态的Pod中,其内存限额总量不能超过该值。
memory: 所有非终止状态的Pod中,其内存需求总量不能超过该值。
requests.cpu: 所有非终止状态的Pod中,其CPU需求总量不能超过该值。
requests.memory: 所有非终止状态的Pod中,其内存需求总量不能超过该值。

2、ResourcesQuota 支持限制的存储资源:

requests.storage:所有 PVC 请求的存储大小总量不能超过此值。
Persistentvolumeclaims: PVC 对象存在的最大数目。
.storageclass.storage.k8s.io/requests.storage:
 和 StorageClass 关联的 PVC 的请求存储的量大小不能超过此设置的值。
.storageclass.storage.k8s.io/persistentvolumeclaims:
 和 StorageClass 关联的 PVC 的总量。

3、ResourcesQuota 支持限制的对象资源:

Configmaps: 允许存在的 ConfigMap 的数量。
Pods: 允许存在的非终止状态的 Pod 数量,
      如果 Pod 的 status.phase 为 Failed 或 Succeeded , 那么其处于终止状态。
Replicationcontrollers: 允许存在的 Replication Controllers 的数量。
Resourcequotas: 允许存在的 Resource Quotas 的数量。
Services: 允许存在的 Service 的数量。
services.loadbalancers: 允许存在的 LoadBalancer 类型的 Service 的数量。
services.nodeports: 允许存在的 NodePort 类型的 Service 的数量。
Secrets: 允许存在的 Secret 的数量。

配额作用域

每个配额都有一组相关的作用域(scope),配额只会对作用域内的资源生效。
当一个作用域被添加到配额中后,它会对作用域相关的资源数量作限制,
如配额中指定了允许(作用域)集合之外的资源,会导致验证错误。

作用域:
Terminating: 匹配 spec.activeDeadlineSeconds ≥ 0 的 Pod。
NotTerminating: 匹配 spec.activeDeadlineSeconds 是 nil(空) 的 Pod。
BestEffort: 匹配所有 QoS 等级是 BestEffort 级别的 Pod。
NotBestEffort: 匹配所有 QoS 等级不是 BestEffort 级别的 Pod。

配额作用域示例:

限制 Namespace 下 Pod 数量并只作用域 BestEffort
创建 resources-test3.yaml 用于设置 Pod 对象数量的配额,并设置作用域 BestEffort:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: besteffort
spec:
  hard:
    pods: "5"
  scopes:
  - BestEffort

LimitRange和ResourceQuota的对象设计

k8s LimitRange对象设计

k8s ResourceQuota对象设计

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐