1 资源限制
1.1 概述
Kubernetes 允许你为每个容器(Pod 中的每个容器)设置资源的 请求(Requests) 和 限制(Limits),用于指定单个容器的资源使用范围,防止容器过度消耗节点资源。
Requests:容器启动时 调度器 将根据请求的资源量来决定将容器调度到哪个节点。请求的资源量是容器运行时所需的最小资源,所调度到的节点上确保容器至少可以获得这些资源。
Limits:限制是容器可以使用的最大资源量。如果容器超出了这个限制,Kubernetes 会采取一定措施,如限制 CPU 或杀死容器(内存溢出时会杀死容器)。
1.2 作用
- 提供资源请求值(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 三者的对比
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 提供默认值。
2、运行时资源限制:
- 容器运行时会受到 Resource Limits 的约束。
- 超过 CPU 限制时被限制计算能力;超过内存限制时可能被杀死。
3、命名空间资源控制:
- ResourceQuota 检查命名空间内的资源总量,超过总量- 限制时,拒绝创建新资源。