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

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

  • 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 值。OpenShift Container Platform 通过 limit 除以 request 来计算限制与请求的比率。这个值应该是大于 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 的镜像的最大大小。
注意

要防止超过限制的 Blob 上传到 registry,则必须将 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>