8.3. 使用限制范围限制资源消耗


默认情况下,容器在 Red Hat OpenShift Service on AWS 集群上使用无限的计算资源运行。通过限制范围,您可以限制项目中特定对象的资源消耗:

  • pod 和容器:您可以为 pod 及其容器设置 CPU 和内存的最小和最大要求。
  • 镜像流:您可以设置 ImageStream 对象中的镜像和标签数量的限制。
  • 镜像:您可以限制可推送到内部 registry 的镜像大小。
  • 持久性卷声明(PVC):您可以限制请求的 PVC 的大小。

如果 pod 未满足限制范围强制的限制,则无法在命名空间中创建 pod。

8.3.1. 关于限制范围

LimitRange 对象定义的限值范围限制项目中的资源消耗。在项目中,您可以为 pod、容器、镜像、镜像流或持久性卷声明(PVC)设置特定资源限值。

要创建和修改资源的所有请求都会针对项目中的每个 LimitRange 对象进行评估。如果资源违反了任何限制,则会拒绝该资源。

以下显示了所有组件的限制范围对象: pod、容器、镜像、镜像流或 PVC。您可以在同一对象中为这些组件的一个或多个组件配置限值。您可以为每个要控制资源的项目创建不同的限制范围对象。

容器的限制范围对象示例

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits"
spec:
  limits:
    - type: "Container"
      max:
        cpu: "2"
        memory: "1Gi"
      min:
        cpu: "100m"
        memory: "4Mi"
      default:
        cpu: "300m"
        memory: "200Mi"
      defaultRequest:
        cpu: "200m"
        memory: "100Mi"
      maxLimitRequestRatio:
        cpu: "10"

8.3.1.1. 关于组件限制

以下示例显示每个组件的限制范围参数。为清楚起见,示例已被分隔。您可以根据需要为任何或所有组件创建一个 LimitRange 对象。

8.3.1.1.1. 容器限制

通过限制范围,您可以指定 pod 中每个容器可以请求的特定项目的最小和最大 CPU 和内存。如果在项目中创建容器,则 Pod spec 中的容器 CPU 和内存请求必须符合 LimitRange 对象中设置的值。如果没有,则 pod 不会被创建。

  • 对于在 LimitRange 对象中指定的容器,容器 CPU 或内存请求和限制必须大于或等于 min 资源约束。
  • 容器 CPU 或内存请求和限制必须小于或等于 LimitRange 对象中指定的容器的 max 资源约束。

    如果 LimitRange 对象定义了 max CPU,则不需要在 Pod spec 中定义 CPU 请求(request) 值。但您必须指定一个 CPU limit 值,它需要满足在限制范围中指定的最大 CPU 限值。

  • 容器限制与请求的比例必须小于或等于 LimitRange 对象中指定的容器的 maxLimitRequestRatio 值。

    如果 LimitRange 对象定义了 maxLimitRequestRatio 约束,则任何新容器都必须同时具有 requestlimit 值。Red Hat OpenShift Service on AWS 通过以请求 划分 来计算 限制与请求的比率。这个值应该是大于 1 的非负整数。

    例如,如果容器的 limit 值中包括 cpu: 500request 值中包括 cpu: 100,则 cpu 的限制与请求的比率是 5。这个比例必须小于或等于 maxLimitRequestRatio

如果 Pod spec 没有指定容器资源内存或限制,则将限制范围对象中指定的容器的 defaultdefaultRequest CPU 和内存值分配给容器。

容器 LimitRange 对象定义

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: "Container"
      max:
        cpu: "2" 2
        memory: "1Gi" 3
      min:
        cpu: "100m" 4
        memory: "4Mi" 5
      default:
        cpu: "300m" 6
        memory: "200Mi" 7
      defaultRequest:
        cpu: "200m" 8
        memory: "100Mi" 9
      maxLimitRequestRatio:
        cpu: "10" 10

1
LimitRange 对象的名称。
2
pod 中单个容器可以请求的最大 CPU 量。
3
pod 中单个容器可以请求的最大内存量。
4
pod 中单个容器可以请求的最小 CPU 量。
5
pod 中单个容器可以请求的最小内存量。
6
如果未在 Pod spec 中指定,容器可以使用的默认 CPU 量。
7
如果未在 Pod spec 中指定,容器可以使用的默认内存量。
8
如果没有在 Pod spec 中指定,容器可以请求的默认 CPU 量。
9
如果未在 Pod spec 中指定,容器可以请求的默认内存量。
10
容器最大的限制与请求的比率。
8.3.1.1.2. Pod 限值

限制范围允许您为给定项目中所有 pod 的容器指定最小和最大 CPU 和内存限值。要在项目中创建容器,Pod spec 中的容器 CPU 和内存请求必须符合 LimitRange 对象中设置的值。如果没有,则 pod 不会被创建。

如果 Pod spec 没有指定容器资源内存或限制,则将限制范围对象中指定的容器的 defaultdefaultRequest CPU 和内存值分配给容器。

在 pod 中的所有容器中,需要满足以下条件:

  • 对于在 LimitRange 对象中指定的 pod,容器 CPU 或内存请求和限制必须大于或等于 min 资源约束。
  • 容器 CPU 或内存请求和限制必须小于或等于 LimitRange 对象中指定的 pod 的 max 资源约束。
  • 容器限制与请求的比例必须小于或等于 LimitRange 对象中指定的 maxLimitRequestRatio 约束。

Pod LimitRange 对象定义

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: "Pod"
      max:
        cpu: "2" 2
        memory: "1Gi" 3
      min:
        cpu: "200m" 4
        memory: "6Mi" 5
      maxLimitRequestRatio:
        cpu: "10" 6

1
限制范围对象的名称。
2
pod 可在所有容器间请求的最大 CPU 量。
3
pod 可在所有容器间请求的最大内存量。
4
pod 可在所有容器间请求的最小 CPU 量。
5
pod 可在所有容器间请求的最小内存量。
6
容器最大的限制与请求的比率。
8.3.1.1.3. 镜像限制

LimitRange 对象允许您指定可推送到 OpenShift 镜像 registry 的镜像的最大大小。

将镜像推送到 OpenShift 镜像 registry 时,必须满足以下条件:

  • 镜像的大小必须小于或等于 LimitRange 对象中指定的镜像的最大值

镜像 LimitRange 对象定义

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: openshift.io/Image
      max:
        storage: 1Gi 2

1
LimitRange 对象的名称。
2
可推送到 OpenShift 镜像 registry 的镜像的最大大小。
警告

在上传的镜像清单中,镜像大小并非始终可用。这对使用 Docker 1.10 或更高版本构建并推送到 v2 registry 的镜像来说尤为如此。如果这样的镜像使用旧的 Docker 守护进程拉取,由 registry 将镜像清单转换为 schema v1 时缺少了所有与大小相关的信息。镜像没有设置存储限制会阻止镜像被上传。

这个问题正在被决。

8.3.1.1.4. 镜像流限值

LimitRange 对象允许您为镜像流指定限值。

对于每个镜像流,需要满足以下条件:

  • ImageStream 规格中镜像标签的数量必须小于或等于 LimitRange 对象中的 openshift.io/image-tags 约束。
  • ImageStream 规格中对镜像的唯一引用数量必须小于或等于限制范围对象中的 openshift.io/images 约束。

镜像流 LimitRange 对象定义

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: openshift.io/ImageStream
      max:
        openshift.io/image-tags: 20 2
        openshift.io/images: 30 3

1
LimitRange 对象的名称。
2
镜像流 spec 中 imagestream.spec.tags 参数中唯一镜像标签的最大数量。
3
镜像流 specimagestream.status.tags 参数中唯一镜像引用的最大数量。

openshift.io/image-tags 资源代表唯一镜像引用。可能的引用是 ImageStreamTagImageStreamImageDockerImage。可以使用 oc tagoc import-image 命令创建标签。内部和外部引用之间没有区别。但是,ImageStream 规格中标记的每个唯一引用仅计算一次。它不以任何方式限制推送到内部容器镜像 registry,但对标签限制很有用。

openshift.io/images 资源代表镜像流状态中记录的唯一镜像名称。它允许对可以推送到 OpenShift 镜像 registry 的多个镜像进行限制。内部和外部引用无法区分。

8.3.1.1.5. 持久性卷声明(PVC)限制

LimitRange 对象允许您限制持久性卷声明(PVC)中请求的存储。

在一个项目中的所有持久性卷声明中,必须满足以下条件:

  • 持久性卷声明(PVC)中的资源请求必须大于或等于 LimitRange 对象中指定的 PVC 的 min 约束。
  • 持久性卷声明(PVC)中的资源请求必须小于或等于 LimitRange 对象中指定的 PVC 的 max 约束。

PVC LimitRange 对象定义

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" 1
spec:
  limits:
    - type: "PersistentVolumeClaim"
      min:
        storage: "2Gi" 2
      max:
        storage: "50Gi" 3

1
LimitRange 对象的名称。
2
持久性卷声明中可请求的最小存储量。
3
在持久性卷声明中请求的最大存储量。

8.3.2. 创建限制范围

将限制范围应用到一个项目:

  1. 使用您的所需规格创建 LimitRange 对象:

    apiVersion: "v1"
    kind: "LimitRange"
    metadata:
      name: "resource-limits" 1
    spec:
      limits:
        - type: "Pod" 2
          max:
            cpu: "2"
            memory: "1Gi"
          min:
            cpu: "200m"
            memory: "6Mi"
        - type: "Container" 3
          max:
            cpu: "2"
            memory: "1Gi"
          min:
            cpu: "100m"
            memory: "4Mi"
          default: 4
            cpu: "300m"
            memory: "200Mi"
          defaultRequest: 5
            cpu: "200m"
            memory: "100Mi"
          maxLimitRequestRatio: 6
            cpu: "10"
        - type: openshift.io/Image 7
          max:
            storage: 1Gi
        - type: openshift.io/ImageStream 8
          max:
            openshift.io/image-tags: 20
            openshift.io/images: 30
        - type: "PersistentVolumeClaim" 9
          min:
            storage: "2Gi"
          max:
            storage: "50Gi"
    1
    LimitRange 对象指定一个名称。
    2
    要为 pod 设置限值,请根据需要指定最小和最大 CPU 和内存请求。
    3
    要为容器设置限值,请根据需要指定最小和最大 CPU 和内存请求。
    4
    可选。对于容器,如果没有在 Pod spec 中指定,则指定容器可以使用的默认 CPU 或内存量。
    5
    可选。对于容器,如果没有在 Pod spec 中指定,则指定容器可以请求的默认 CPU 或内存量。
    6
    可选。对于容器,指定 Pod spec 中可指定的最大限制与请求比例。
    7
    要为镜像对象设置限值,请设置可推送到 OpenShift 镜像 registry 的镜像的最大大小。
    8
    要为镜像流设置限值,请根据需要设置 ImageStream 对象文件中的最大镜像标签和引用数。
    9
    要为持久性卷声明设置限制,请设置可请求的最小和最大存储量。
  2. 创建对象:

    $ oc create -f <limit_range_file> -n <project> 1
    1
    指定您创建的 YAML 文件的名称以及要应用限制的项目。

8.3.3. 查看限制

您可以通过在 web 控制台中导航到项目的 Quota 页面来查看项目中定义的任何限制。

您还可以使用 CLI 查看限制范围详情:

  1. 获取项目中定义的 LimitRange 对象列表。例如,对于名为 demoproject 的项目:

    $ oc get limits -n demoproject
    NAME              CREATED AT
    resource-limits   2020-07-15T17:14:23Z
  2. 描述您感兴趣的 LimitRange 对象,如 resource-limits 限制范围:

    $ oc describe limits resource-limits -n demoproject
    Name:                           resource-limits
    Namespace:                      demoproject
    Type                            Resource                Min     Max     Default Request Default Limit   Max Limit/Request Ratio
    ----                            --------                ---     ---     --------------- -------------   -----------------------
    Pod                             cpu                     200m    2       -               -               -
    Pod                             memory                  6Mi     1Gi     -               -               -
    Container                       cpu                     100m    2       200m            300m            10
    Container                       memory                  4Mi     1Gi     100Mi           200Mi           -
    openshift.io/Image              storage                 -       1Gi     -               -               -
    openshift.io/ImageStream        openshift.io/image      -       12      -               -               -
    openshift.io/ImageStream        openshift.io/image-tags -       10      -               -               -
    PersistentVolumeClaim           storage                 -       50Gi    -               -               -

8.3.4. 删除限制范围

要删除任何活跃的 LimitRange 对象,使其不再在项目中强制实施限制:

  • 运行以下命令:

    $ oc delete limits <limit_name>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.