暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K8S的资源管理:Resource limits,Resource quota和limitRange详解

390



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

今天讲解一下K8S的资源管理相关知识。内容包括以下几个部分:

  1. 资源限制Resource Limits

  2. 资源配额Resource quota

  3. 限制范围:limitRange

  4. 三者详细对比

  5. 三者如何联合使用


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


文章转载自运维李哥不背锅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论