K8S 资源请求限制
metadata:name: high# name: 资源对象的名称,这里是 high,表示这个 PriorityClass 的名称。description: High priority# 描述信息value: 1000000# value: 优先级的值,这个值越高,优先级越高。这里设置为 1000000,表示较高的优先级。globalDefault: false# globalDefault:
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 或容器不会超出指定的资源限制。
更多推荐
所有评论(0)