×

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

  • 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 Container Platform 通过将 `limit` 除以 `request` 来计算限制与请求的比率。此值应为大于 1 的非负整数。

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

如果 `Pod` 说明未指定容器资源内存或限制,则将限制范围对象中指定的容器的 `default` 或 `defaultRequest` 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` 说明未指定容器资源内存或限制,则将限制范围对象中指定的容器的 `default` 或 `defaultRequest` CPU 和内存值分配给容器。

在 Pod 的所有容器中,必须满足以下条件:

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

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

  • 容器限制与请求的比率必须小于或等于 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 对象中指定的镜像的最大大小。

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

为防止大小超过限制的 Blob 上传到注册表,必须配置注册表以强制执行配额。

镜像大小并不总是可以在上传镜像的清单中找到。对于使用 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 参数中 imagestream 说明中唯一镜像标签的最大数量。
3 imagestream 说明中 imagestream.status.tags 参数中唯一镜像引用的最大数量。

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

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

持久卷声明限制

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

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

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

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

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>