程序员和运维都怕的 OOM,其实都是资源限制没整明白

发表时间:2025-12-05 08:49

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
命名空间内的每个容器或 Pod
容器级别
命名空间级别
容器级别,但规则在命名空间级别生效
主要作用
限制单个容器的资源使用
限制命名空间的总资源使用量
提供默认值,并限制资源配置范围
使用场景
精细控制容器资源消耗
控制命名空间的资源总量,适合多租户场景
提供资源默认值,防止用户配置不合理
限制方式
超出限制时限制 CPU 或杀死内存溢出的容器
超出限制时拒绝创建新的资源
不符合范围或默认值的资源配置被拒绝
正面影响
精确控制单个容器资源使用量,保障容器性能
保障资源公平分配,避免资源耗尽
提供合理默认值,防止不合理配置
负面影响
配置不合理可能影响容器调度或性能,资源浪费
配额不足可能导致资源瓶颈,配置复杂
默认值不合理可能导致浪费或性能问题
对调度的影响
决定容器调度到节点的资源需求
无直接调度影响
提供默认值,间接影响调度
典型配置场景
单个 Pod 运行敏感应用
防止命名空间独占集群资源
给初学者提供合理的默认值或防止配置错误

5 三者的联合使用

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

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 检查命名空间内的资源总量,超过总量- 限制时,拒绝创建新资源。



图片

END

图片


联系邮箱:oradba@tianlinks.com                                                                    QQ:13101385     
联系地址:安徽省合肥市高新区文曲路800号创新产业园一期A4栋709-710室      联系电话:13866763731
tianlinks.com

扫码关注微信公众号