在实际生产环境中,Pod的调度规则设置和Pod资源管理算是优化应用配置的的两大重要手段。前面文章已经讲解过Pod的多种调度规则。
今天讲解一下K8S的资源管理相关知识。内容包括以下几个部分:
资源限制Resource Limits
资源配额Resource quota
限制范围:limitRange
三者详细对比
三者如何联合使用
1 资源限制
1.1 概述
Kubernetes 允许你为每个容器(Pod 中的每个容器)设置资源的 请求(Requests
) 和 限制(Limits
),用于指定单个容器的资源使用范围,防止容器过度消耗节点资源。
Requests:容器启动时 调度器 将根据请求的资源量来决定将容器调度到哪个节点。请求的资源量是容器运行时所需的最小资源,所调度到的节点上确保容器至少可以获得这些资源。
Limits:限制是容器可以使用的最大资源量。如果容器超出了这个限制,Kubernetes 会采取一定措施,如限制 CPU 或杀死容器(内存溢出时会杀死容器)。
1.2 作用
限制(limits)容器使用的最大资源量。 提供资源请求值(requests),确保容器启动时至少有一定的资源。 防止单个容器过度使用资源而影响其他容器。
1.3 配置示例
vim nginx-pod.yaml
复制
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: docker.m.daocloud.io/nginx:1.25
resources: # 定义资源限制
requests: # 资源请求
memory: "256Mi" # 容器至少需要 256 MiB 的内存
cpu: "500m" # 容器至少需要 500 毫核(0.5 核 CPU)
limits: # 资源限制
memory: "512Mi" # 容器最多可以使用 512 MiB 的内存
cpu: "1" # 容器最多可以使用 1 核 CPU复制
查看Pod的资源限制
kubectl describe pod nginx-pod
复制

1.4 工作机制
资源请求 (Requests):用于调度,表示容器启动时的最低资源需求。 资源限制 (Limits):用于运行时限制,表示容器的资源使用上限。
2 资源配额
2.1 概念
资源配额(Resource Quotas
)是针对 命名空间 设置的资源总量限制。它控制一个命名空间内所有资源(如 Pod、服务、持久卷)的最大总量,确保资源在多个命名空间之间公平分配。
2.2 作用
限制命名空间内所有资源的总量。 防止单个命名空间耗尽集群资源。 适合多租户环境,帮助实现公平分配。
2.3 配额类型
资源配额可以包含以下几种资源类型的限制:
CPU 和内存:限制命名空间内所有容器的 CPU 和内存资源总量。 Pod 数量:限制命名空间内允许创建的 Pod 数量。 服务(Services):限制命名空间内允许创建的服务数量。 副本控制器(Replicasets):限制命名空间内允许创建的副本控制器的数量。 持久卷声明(PersistentVolumeClaims):限制命名空间内允许创建的持久卷声明的数量。 镜像:限制命名空间内镜像的总数。
2.4 配置示例
vim quota.yaml
复制
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
namespace: test-quota
spec:
hard: # 硬限制,超出配额限制,将阻止创建对象资源
requests.cpu: "4" # 最多允许使用 4 核 CPU。
requests.memory: "8Gi" # 最多允许使用 8 GiB 内存
limits.cpu: "8" # 最多允许使用 8 核 CPU
limits.memory: "16Gi" # 最多允许使用 16 GiB 内存
pods: "10" # 最多允许创建 10 个 Pod。复制
查看配额配置
[root@k8s-master data]# kubectl get quota -n test-quota
NAME AGE REQUEST LIMIT
quota 17s pods: 0/10, requests.cpu: 0/4, requests.memory: 0/8Gi limits.cpu: 0/8, limits.memory: 0/16Gi
[root@k8s-master data]# kubectl describe quota -n test-quota
Name: quota
Namespace: test-quota
Resource Used Hard
-------- ---- ----
limits.cpu 0 8
limits.memory 0 16Gi
pods 0 10
requests.cpu 0 4
requests.memory 0 8Gi复制
你可以自行创建pod测试一下配额消耗情况
2.5 工作机制
配额是针对整个命名空间的,不直接影响单个 Pod 或容器。 如果命名空间内的资源总量达到配额上限,则无法创建新的资源对象(如 Pod)。
3 限制范围
3.1 概念
限制范围(LimitRange
)是针对 命名空间 内的 容器或 Pod 设置默认的资源请求和限制。当用户未在 Pod 或容器中显式定义资源请求和限制时,LimitRange 会为这些资源设置默认值。此外,它还能设置最小和最大资源范围,防止用户配置不合理的资源请求或限制。
3.2 作用
为未设置资源请求和限制的容器设置默认值。 限制资源请求和限制的最小值和最大值,防止配置不合理的资源规格。 与 ResourceQuota 配合使用,确保命名空间内的资源分配合理。
3.3 配置示例
vim limit-pod.yaml
复制
apiVersion: v1
kind: LimitRange
metadata:
name: container-limits
namespace: test-limits
spec:
limits:
- type: Container
max: # 定义最大可使用资源
memory: "1Gi"
cpu: "1"
min: # 定义最小资源需求
memory: "128Mi"
cpu: "200m"
default: # 定义默认资源需求
memory: "512Mi"
cpu: "500m"
defaultRequest: # 默认请求值
memory: "256Mi" # 默认内存请求为256Mi
cpu: "300m" # 默认CPU请求为300m复制
查看资源限制
[root@k8s-master data]# kubectl describe limitrange -n test-limits
Name: container-limits
Namespace: test-limits
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 200m 1 300m 500m -
Container memory 128Mi 1Gi 256Mi 512Mi复制
3.4 工作机制
默认值 (default):当容器没有设置 requests 或 limits 时,LimitRange 会应用默认值。 最小值 (min) 和 最大值 (max):约束资源请求和限制的范围。 默认请求值 (defaultRequest):为未设置 requests 的容器设置默认的资源请求值。
4 三者的对比
特性 | 资源限制 | 资源配额 | 限制范围 |
---|---|---|---|
应用范围 | 单个容器(Pod 的每个容器) | 整个命名空间 | 命名空间内的每个容器或 Pod |
作用层级 | 容器级别 | 命名空间级别 | 容器级别,但规则在命名空间级别生效 |
主要作用 | 限制单个容器的资源使用 | 限制命名空间的总资源使用量 | 提供默认值,并限制资源配置范围 |
使用场景 | 精细控制容器资源消耗 | 控制命名空间的资源总量,适合多租户场景 | 提供资源默认值,防止用户配置不合理 |
限制方式 | 超出限制时限制 CPU 或杀死内存溢出的容器 | 超出限制时拒绝创建新的资源 | 不符合范围或默认值的资源配置被拒绝 |
正面影响 | 精确控制单个容器资源使用量,保障容器性能 | 保障资源公平分配,避免资源耗尽 | 提供合理默认值,防止不合理配置 |
负面影响 | 配置不合理可能影响容器调度或性能,资源浪费 | 配额不足可能导致资源瓶颈,配置复杂 | 默认值不合理可能导致浪费或性能问题 |
对调度的影响 | 决定容器调度到节点的资源需求 | 无直接调度影响 | 提供默认值,间接影响调度 |
典型配置场景 | 单个 Pod 运行敏感应用 | 防止命名空间独占集群资源 | 给初学者提供合理的默认值或防止配置错误 |
5 三者的联合使用
在实际生产环境中,通常会同时使用 Resource Limits
、Resource Quotas
和 LimitRange
来实现资源管理的细粒度控制和全局约束。
5.1 配置流程
1、定义 LimitRange:
为命名空间设置合理的默认资源请求和限制值。 确保用户未指定资源时,自动应用默认配置。
2、设置 Resource Limits:
在每个 Pod 的容器级别设置具体的 requests 和 limits。 保证关键服务拥有明确的资源保障和上限,防止意外使用超出范围。
3、配置 Resource Quotas:
为命名空间设置资源总量的硬限制。 防止某个命名空间消耗过多的集群资源,影响其他租户。
5.2 工作流程
1、Pod 调度时:
如果未定义 requests 和 limits,LimitRange 提供默认值。 调度器根据 requests 选择合适的节点。
2、运行时资源限制:
容器运行时会受到 Resource Limits 的约束。 超过 CPU 限制时被限制计算能力;超过内存限制时可能被杀死。
3、命名空间资源控制:
ResourceQuota 检查命名空间内的资源总量,超过总量- 限制时,拒绝创建新资源。