×

默认情况下,容器在 OpenShift Dedicated 集群上以无限制的计算资源运行。使用资源限额,您可以限制项目中特定对象的资源消耗。

  • Pod 和容器:您可以为 Pod 及其容器设置 CPU 和内存的最小和最大要求。

  • 镜像流:您可以设置 `ImageStream` 对象中镜像和标签数量的限制。

  • 镜像:您可以限制可以推送到内部注册表的镜像大小。

  • 持久卷声明 (PVC):您可以限制可以请求的 PVC 的大小。

如果 Pod 不满足资源限额施加的约束,则无法在命名空间中创建该 Pod。

关于资源限额

资源限额由 `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"

关于组件限制

以下示例显示每个组件的资源限额参数。为了清晰起见,这些示例被分解了。您可以根据需要为所有或任何组件创建一个 `LimitRange` 对象。

容器限制

资源限额允许您指定特定项目中每个 Pod 中的每个容器可以请求的最小和最大 CPU 和内存。如果在项目中创建容器,则 `Pod` 说明中的容器 CPU 和内存请求必须符合 `LimitRange` 对象中设置的值。如果不符合,则不会创建 Pod。

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

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

    如果 `LimitRange` 对象定义了 `max` CPU,则不需要在 `Pod` 说明中定义 CPU `request` 值。但是,您必须指定一个满足资源限额中指定的最大 CPU 约束的 CPU `limit` 值。

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

    如果 `LimitRange` 对象定义了 `maxLimitRequestRatio` 约束,则任何新容器都必须同时具有 `request` 和 `limit` 值。OpenShift Dedicated 通过将 `limit` 除以 `request` 来计算限制与请求的比率。此值应为大于 1 的非负整数。

    例如,如果一个容器在limit值中具有cpu: 500,在request值中具有cpu: 100,则cpu的限制与请求比率为5。此比率必须小于或等于maxLimitRequestRatio

如果Pod规范没有指定容器资源内存或限制,则会将限制范围对象中指定的容器的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规范中未指定,则容器可以使用的默认CPU量。
7 如果Pod规范中未指定,则容器可以使用的默认内存量。
8 如果Pod规范中未指定,则容器可以请求的默认CPU量。
9 如果Pod规范中未指定,则容器可以请求的默认内存量。
10 容器的最大限制与请求比率。

Pod限制

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

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

在Pod中的所有容器中,以下必须成立

  • 容器CPU或内存请求和限制必须大于或等于LimitRange对象中指定的Pod的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 容器的最大限制与请求比率。

镜像限制

LimitRange对象允许您指定可以推送到OpenShift镜像注册表中的镜像的最大大小。

将镜像推送到OpenShift镜像注册表时,以下必须成立

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

镜像LimitRange对象定义
apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "resource-limits" (1)
spec:
  limits:
    - type: openshift.io/Image
      max:
        storage: 1Gi (2)
1 LimitRange对象的名称。
2 可以推送到OpenShift镜像注册表中的镜像的最大大小。

镜像大小并不总是存在于上传镜像的清单中。对于使用Docker 1.10或更高版本构建并推送到v2注册表的镜像尤其如此。如果使用较旧的Docker守护程序提取此类镜像,则注册表会将镜像清单转换为缺少所有大小信息的schema v1。对镜像设置的存储限制不会阻止其上传。

问题正在解决中。

镜像流限制

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 imagestream.spec.tags参数中镜像流规范中唯一镜像标签的最大数量。
3 imagestream规范中imagestream.status.tags参数中唯一镜像引用的最大数量。

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

openshift.io/images资源表示记录在镜像流状态中的唯一镜像名称。它允许限制可以推送到OpenShift镜像注册表的镜像数量。内部和外部引用没有区别。

持久卷声明限制

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 可以在持久卷声明中请求的最大存储量。

创建限制范围

要将限制范围应用于项目

  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规范中未指定,请指定容器可以使用默认的CPU或内存量。
    5 可选。对于容器,如果Pod规范中未指定,请指定容器可以请求默认的CPU或内存量。
    6 可选。对于容器,请指定可以在Pod规范中指定的最大限制与请求比率。
    7 要设置镜像对象的限制,请设置可以推送到OpenShift镜像注册表的镜像的最大大小。
    8 要设置镜像流的限制,请根据需要设置ImageStream对象文件中可以包含的最大镜像标签和引用的数量。
    9 要设置持久卷声明的限制,请设置可以请求的最小和最大存储量。
  2. 创建对象

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

查看限制

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

您也可以使用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    -               -               -

删除限额范围

要移除任何活动的LimitRange对象,使其不再强制执行项目中的限制

  • 运行以下命令

    $ oc delete limits <limit_name>