高效配置 Kubernetes 资源限制的实战技巧

在实际生产环境中,Pod的调度规则设置和Pod资源管理算是优化应用配置的的两大重要手段。前面文章已经讲解过Pod的多种调度规则。

今天讲解一下K8S的资源限制相关知识,篇幅有点长,请耐心看完。

一、资源限制

1. 概述

Kubernetes 允许你为每个容器(Pod 中的每个容器)设置资源的 请求(Requests) 和 限制(Limits),用于指定单个容器的资源使用范围,防止容器过度消耗节点资源。

Requests:容器启动时 调度器 将根据请求的资源量来决定将容器调度到哪个节点。请求的资源量是容器运行时所需的最小资源,所调度到的节点上确保容器至少可以获得这些资源。Limits:限制是容器可以使用的最大资源量。如果容器超出了这个限制,Kubernetes 会采取一定措施,如限制 CPU 或杀死容器(内存溢出时会杀死容器)。2. 作用限制(limits)容器使用的最大资源量。提供资源请求值(requests),确保容器启动时至少有一定的资源。防止单个容器过度使用资源而影响其他容器。3. 配置
复制
vim nginx-pod.yaml1.
复制
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx-container image: docker.m.daocloud.io/nginx:1.25 resources: # 定义资源限制 requests: # 资源请求 memory: "256Mi" # 容器至少需要 256 MiB 的内存 cpu: "500m" # 容器至少需要 500 毫核(0.5CPUlimits: # 资源限制 memory: "512Mi" # 容器最多可以使用 512 MiB 的内存 cpu: "1" # 容器最多可以使用 1CPU1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

查看Pod的资源限制:

复制
kubectl describe pod nginx-pod1.

二、资源配额

1. 概念

资源配额(Resource Quotas)是针对 命名空间 设置的资源总量限制。它控制一个命名空间内所有资源(如 Pod、服务、持久卷)的最大总量,确保资源在多个命名空间之间公平分配。

2. 作用限制命名空间内所有资源的总量。防止单个命名空间耗尽集群资源。适合多租户环境,帮助实现公平分配。3. 配额类型

资源配额可以包含以下几种资源类型的限制:

CPU 和内存:限制命名空间内所有容器的 CPU 和内存资源总量。Pod 数量:限制命名空间内允许创建的 Pod 数量。服务(Services):限制命名空间内允许创建的服务数量。副本控制器(Replicasets):限制命名空间内允许创建的副本控制器的数量。持久卷声明(PersistentVolumeClaims):限制命名空间内允许创建的持久卷声明的数量。镜像:限制命名空间内镜像的总数。4. 配置
复制
vim quota.yaml1.
复制
apiVersion: v1 kind: ResourceQuota metadata: name: quota namespace: test-quota spec: hard: # 硬限制,超出配额限制,将阻止创建对象资源 requests.cpu: "4" # 最多允许使用 4CPU。 requests.memory: "8Gi" # 最多允许使用 8 GiB 内存 limits.cpu: "8" # 最多允许使用 8CPU limits.memory: "16Gi" # 最多允许使用 16 GiB 内存 pods: "10" # 最多允许创建 10 个 Pod。1.2.3.4.5.6.7.8.9.10.11.12.

查看配额配置:

复制
[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 8Gi1.2.3.4.5.6.7.8.9.10.11.12.13.14.

你可以自行创建pod测试一下配额消耗情况。

注意事项:

配额是针对整个命名空间的,不直接影响单个 Pod 或容器。如果命名空间内的资源总量达到配额上限,则无法创建新的资源对象(如 Pod)。

三、限制范围

1. 概念

限制范围(LimitRange)是针对 命名空间 内的 容器或 Pod 设置默认的资源请求和限制。当用户未在 Pod 或容器中显式定义资源请求和限制时,LimitRange 会为这些资源设置默认值。此外,它还能设置最小和最大资源范围,防止用户配置不合理的资源请求或限制。

2. 作用为未设置资源请求和限制的容器设置默认值。限制资源请求和限制的最小值和最大值,防止配置不合理的资源规格。与 ResourceQuota 配合使用,确保命名空间内的资源分配合理。3. 配置
复制
vim limit-pod.yaml1.
复制
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请求为300m1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.

查看资源限制:

复制
[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 512Mi1.2.3.4.5.6.7.
4. 注意事项默认值:当容器没有设置 requests 或 limits 时,LimitRange 会应用默认值。最小值和 最大值 :约束资源请求和限制的范围。默认请求值 (defaultRequest):为未设置 requests 的容器设置默认的资源请求值。

四、三者的对比

特性

资源限制

资源配额

限制范围

应用范围

单个容器(Pod 的每个容器)

整个命名空间

命名空间内的每个容器或 Pod

作用层级

容器级别

命名空间级别

容器级别,但规则在命名空间级别生效

主要作用

限制单个容器的资源使用

限制命名空间的总资源使用量

提供默认值,并限制资源配置范围

使用场景

精细控制容器资源消耗

控制命名空间的资源总量,适合多租户场景

提供资源默认值,防止用户配置不合理

限制方式

超出限制时限制 CPU 或杀死内存溢出的容器

超出限制时拒绝创建新的资源

不符合范围或默认值的资源配置被拒绝

正面影响

精确控制单个容器资源使用量,保障容器性能

保障资源公平分配,避免资源耗尽

提供合理默认值,防止不合理配置

负面影响

配置不合理可能影响容器调度或性能,资源浪费

配额不足可能导致资源瓶颈,配置复杂

默认值不合理可能导致浪费或性能问题

典型配置场景

单个 Pod 运行敏感应用

防止命名空间独占集群资源

给初学者提供合理的默认值或防止配置错误

五、三者的联合使用

在实际生产环境中,通常会同时使用 Resource Limits、Resource Quotas 和 LimitRange 来实现资源管理的细粒度控制和全局约束。

1. 配置流程

(1) 定义 LimitRange:

为命名空间设置合理的默认资源请求和限制值。确保用户未指定资源时,自动应用默认配置。

(2) 设置 Resource Limits:

在每个 Pod 的容器级别设置具体的 requests 和 limits。保证关键服务拥有明确的资源保障和上限,防止意外使用超出范围。

(3) 配置 Resource Quotas:

为命名空间设置资源总量的硬限制。防止某个命名空间消耗过多的集群资源,影响其他租户。2. 工作流程

(1) Pod 调度时:

如果未定义 requests 和 limits,LimitRange 提供默认值。调度器根据 requests 选择合适的节点。

(2) 运行时资源限制:

容器运行时会受到 Resource Limits 的约束。超过 CPU 限制时被限制计算能力;超过内存限制时可能被杀死。

(3) 命名空间资源控制:

ResourceQuota 检查命名空间内的资源总量,超过总量- 限制时,拒绝创建新资源。

阅读剩余
THE END