• 【博客540】k8s资源限制管理:LimitRange and ResourceQuota


    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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" 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

    LimitRange提供的约束可以:

    1、在命名空间中限制每个 Pod 或容器的最小和最大计算资源使用量,如:cpu,memory
    
    2、在命名空间中限制最小和最大存储持久卷或者本地存储容量,如:pvc,local-storage
    
    3、为命名空间中的计算资源设置默认请求/限制,并在运行时自动将它们注入容器
    
    4、在命名空间中限制pod或者容器申请的资源的limit与request的比值,即:limit/request的值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数设置:

    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。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    示例:使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    ResourceQuota提供的约束可以:

    1、计算资源配额: 限制一个 Namespace 中所有 Pod 的计算资源(CPU、Memory)的总和。
    
    2、存储资源配额: 限制一个 Namespace 中所有存储资源的总量。
    
    3、对象数量配额: 限制一个 Namespace 中指定类型对象的数量。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1、ResourcesQuota 支持的计算资源:

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

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

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

    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 的数量。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    配额作用域

    每个配额都有一组相关的作用域(scope),配额只会对作用域内的资源生效。
    当一个作用域被添加到配额中后,它会对作用域相关的资源数量作限制,
    如配额中指定了允许(作用域)集合之外的资源,会导致验证错误。
    
    作用域:
    Terminating: 匹配 spec.activeDeadlineSeconds ≥ 0 的 Pod。
    NotTerminating: 匹配 spec.activeDeadlineSeconds 是 nil(空) 的 Pod。
    BestEffort: 匹配所有 QoS 等级是 BestEffort 级别的 Pod。
    NotBestEffort: 匹配所有 QoS 等级不是 BestEffort 级别的 Pod。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    配额作用域示例:

    限制 Namespace 下 Pod 数量并只作用域 BestEffort
    创建 resources-test3.yaml 用于设置 Pod 对象数量的配额,并设置作用域 BestEffort:
    
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: besteffort
    spec:
      hard:
        pods: "5"
      scopes:
      - BestEffort
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    LimitRange和ResourceQuota的对象设计

    k8s LimitRange对象设计

    k8s ResourceQuota对象设计

  • 相关阅读:
    linux系统编程6-守护进程、线程
    死磕Java面试系列:深拷贝与浅拷贝的实现原理
    LeetCode952三部曲之三:再次优化(122ms -> 96ms,超51% -> 超91%)
    核心交换机、汇聚层交换机、接入层交换机的区别和特点
    Linux根文件系统说明和常用命令
    【数字IC验证快速入门】12、SystemVerilog TestBench(SVTB)入门
    etcd详解
    CrossOver23.6软件激活码怎么获取 CrossOver软件2023怎么激活
    Java Math.log()方法具有什么功能呢?
    C#添加WebApi,配置Swagger
  • 原文地址:https://blog.csdn.net/qq_43684922/article/details/128051321