×

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

  • 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 约束,则任何新容器都必须同时具有requestlimit 值。AWS 上的 Red Hat OpenShift Service 通过将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>