K8S 资源请求限制

LimitRange

LimitRange 是限制命名空间内可为每个适用的对象类别 (例如 Pod 或 PersistentVolumeClaim) 指定的资源分配量(限制和请求)的策略对象。

一个 LimitRange(限制范围) 对象提供的限制能够做到:

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施 LimitRange 限制。

举例:

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
spec:
  limits:
  - default:            # 此处定义默认限制值
      cpu: 500m
    defaultRequest:     # 此处定义默认请求值
      cpu: 500m
    max:                # 最大请求CPU 为 1 核
      cpu: "1"
    min: 				# CPU 的最小限制为 100 毫核
      cpu: 100m
    type: Container

字段解释

  • type: Container :指定了这个 LimitRange 的类型是容器级别的。这意味着这些限制将应用于每个容器,而不是 Pod 或其他资源。
  • type: Pod :指定为 Pod 类型 这样可以为 Pod 中的所有容器定义资源限制和请求的范围。

这两个类型根据需求选择其中一个即可。

注意

  • LimitRange 用于限制单个 Pod 或者容器的资源使用。
  • LimitRange 可以限制单个 Pod 或者容器的 CPU、内存、存储等资源的使用量。
  • LimitRange 可以确保 Pod 不会超出指定的资源限制。
  • LimitRange 设置在命名空间级别。

Resource Quotas

通过 ResourceQuota 对象来定义每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。

资源配额的工作方式如下:

  • 不同的团队可以在不同的命名空间下工作。这可以通过 RBAC 强制执行。
  • 集群管理员可以为每个命名空间创建一个或多个 ResourceQuota 对象。
  • 当用户在命名空间下创建资源(如 Pod、Service 等)时,Kubernetes 的配额系统会跟踪集群的资源使用情况, 以确保使用的资源用量不超过 ResourceQuota 中定义的硬性资源限额。
  • 如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN), 并在消息中给出有可能违反的约束。
  • 如果命名空间下的计算资源 (如 cpu 和 memory)的配额被启用, 则用户必须为这些资源设定请求值(request)和约束值(limit),否则配额系统将拒绝 Pod 的创建。 提示: 可使用 LimitRanger 准入控制器来为没有设置计算资源需求的 Pod 设置默认值。

举例

apiVersion: v1  
kind: ResourceQuota  
metadata:  
  name: resource-quota  
  namespace: apps  
spec:  
  hard:  
    pods: "100"                # 命名空间中的最大Pod数量  
    requests.cpu: "100"        # 所有Pod请求CPU的总和不得超过100个核心  
    requests.memory: "100Gi"   # 所有Pod请求内存的总和不得超过100GiB  
    limits.cpu: "200"          # 所有Pod限制CPU的总和不得超过200个核心  
    limits.memory: "200Gi"     # 所有Pod限制内存的总和不得超过200GiB

创建完成以后查看

[root@master01 yaml]# kubectl describe resourcequotas -n apps resource-quota 
Name:            resource-quota
Namespace:       apps
Resource         Used  Hard
--------         ----  ----
limits.cpu       0     200
limits.memory    0     200Gi
pods             1     100
requests.cpu     0     100
requests.memory  0     100Gi

这样在 apps 命名空间创建的 Pod 就需要遵循上面的资源限制。

hard 里面还可以写什么参数?

requests.cpu:			 容器的 CPU 请求量。
requests.memory: 		 容器的内存请求量。
limits.cpu: 			 容器的 CPU 极限。
limits.memory: 			 容器的内存极限。
persistentvolumeclaims:  持久卷声明的数量。
services.loadbalancers:  负载均衡器的数量。
configmaps:              配置地图的数量。
replicationcontrollers:  复制控制器的数量。
resourcequotas:          资源配额的数量。
secrets:                 密钥的数量。
services:                服务的数量。
services.nodeports:      NodePort 服务的数量。
services.loadbalancers:  负载均衡器服务的数量。
requests.nvidia.com/gpu: 英伟达GPU数量。
等等。。。

可选的资源限制

本示例创建一个配额对象,并将其与具有特定优先级的 Pod 进行匹配。 该示例的工作方式如下:

集群中的 Pod 可取三个优先级类之一,即 “low”,“high” 和全局策略。
举例:

定义优先级:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high					# name: 资源对象的名称,这里是 high,表示这个 PriorityClass 的名称。
description: High priority		# 描述信息
value: 1000000					# value: 优先级的值,这个值越高,优先级越高。这里设置为 1000000,表示较高的优先级。
globalDefault: false			# globalDefault: 是否将这个 PriorityClass 设置为默认的全局优先级。这里设置为 false,表示不将其设为全局默认优先级。
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: low
description: low priority
value: 1000000
globalDefault: false

定义 ResourceQuota

## apps 命名空间默认策略
apiVersion: v1  
kind: ResourceQuota  
metadata:  
  name: resource-quota  
  namespace: apps  
spec:  
  hard:  
    pods: "100"                # 命名空间中的最大Pod数量  
    requests.cpu: "100"        # 所有Pod请求CPU的总和不得超过100个核心  
    requests.memory: "100Gi"   # 所有Pod请求内存的总和不得超过100GiB  
    limits.cpu: "200"          # 所有Pod限制CPU的总和不得超过200个核心  
    limits.memory: "200Gi"     # 所有Pod限制内存的总和不得超过200GiB
---
## high 高优先级
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pods-high
  namespace: apps
spec:
  hard:
    cpu: "2"
    memory: 2Gi
    pods: "10"
  scopeSelector:
    matchExpressions:
    - operator: In
      scopeName: PriorityClass
      values: ["high"]
## low 低优先级
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pods-low
  namespace: apps
spec:
  hard:
    cpu: "1"
    memory: 1Gi
    pods: "5"
  scopeSelector:
    matchExpressions:
    - operator: In
      scopeName: PriorityClass
      values: ["low"]

创建优先级为 “high” 的 Pod 测试

apiVersion: v1
kind: Pod
metadata:
  name: high-priority
  namespace: apps
spec:
  containers:
  - name: high-priority
    image: ubuntu
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello; sleep 10;done"]
    resources:
      requests:
        memory: "1Gi"
        cpu: "500m"
      limits:
        memory: "1Gi"
        cpu: "500m"
  priorityClassName: high

创建成功以后查看

[root@master01 resourcequotas]# kubectl get po -n apps 
NAME                       READY   STATUS    RESTARTS       AGE
high-priority              1/1     Running   0              5s

[root@master01 resourcequotas]# kubectl get resourcequotas -n apps 
NAME             AGE     REQUEST                                                           LIMIT
pods-high        2m26s   cpu: 500m/2, memory: 1Gi/2Gi, pods: 1/10                          
pods-low         2m26s   cpu: 0/1, memory: 0/1Gi, pods: 0/5                                
resource-quota   2m26s   pods: 2/100, requests.cpu: 500m/100, requests.memory: 1Gi/100Gi   limits.cpu: 500m/200, limits.memory: 1Gi/200Gi

注意:
如果创建pod 的时候不指定 “priorityClassName: high” 这个优先级默认会用全局的资源限制,如果没有全局的资源限制 那就是没有资源限制(当K8S集群资源不够用的时候默认会优先杀死没有资源限制的Pod)。

Resource Quotas 和 LimitRange 区别

  • Resource Quotas 限制命名空间中所有资源对象的数量和总量,而 LimitRange 限制单个 Pod 或容器的资源使用。
  • Resource Quotas 是一种集群级别的资源限制,而 LimitRange 是针对命名空间中单个 Pod 或容器的限制。
  • Resource Quotas 通常用于控制命名空间使用的总资源量,而 LimitRange 用于确保 Pod 或容器不会超出指定的资源限制。
  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值