Menu Close

Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

第 25 章 设置限值范围

25.1. Limit Ranges 目的

限值范围由 LimitRange 对象定义,用于枚举 Pod、容器、镜像、镜像流和持久卷声明级别的项目中的 计算资源约束,并指定 pod、容器、镜像、镜像流或持久卷声明可以消耗的资源量。

要创建和修改资源的所有请求都会针对项目中的每个 LimitRange 对象进行评估。如果资源违反了任何限制,则会拒绝该资源。如果资源没有设置显式值,如果约束支持默认值,则默认值将应用到该资源。

对于 CPU 和内存限值,如果指定了最大值但没有指定最小限制,则资源可能会消耗比最大值更多的 CPU 和内存资源。

您可以使用临时存储技术预览功能为临时存储指定限值和请求。此功能默认为禁用。要启用此功能,请参阅配置临时存储

核心限制对象定义

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

1
限制范围对象的名称。
2
pod 可在所有容器中的节点上请求的最大 CPU 量。
3
pod 可在所有容器中的节点上请求的最大内存量。
4
pod 可在所有容器中的节点上请求的最小 CPU 量。如果没有设置 min 值,或者将 min 设置为 0,则结果为没有限制,pod 消耗的消耗可能会超过 max CPU 值。
5
pod 可在所有容器中的节点上请求的最小内存量。如果没有设置 min 值,或者将 min 设置为 0,则结果为没有限制,pod 消耗的消耗可能会超过 max 内存的值。
6
pod 中单个容器可以请求的最大 CPU 量。
7
pod 中单个容器可以请求的最大内存量。
8
pod 中单个容器可以请求的最小 CPU 量。如果没有设置 min 值,或者将 min 设置为 0,则结果为没有限制,pod 消耗的消耗可能会超过 max CPU 值。
9
pod 中单个容器可以请求的最小内存量。如果没有设置 min 值,或者将 min 设置为 0,则结果为没有限制,pod 消耗的消耗可能会超过 max 内存的值。
10
如果没有在 pod 规格中指定限制,则容器的默认 CPU 限值。
11
如果没有在 pod 规格中指定限制,容器的默认内存限值。
12
如果没有在 pod 规格中指定请求,容器的默认 CPU 请求。
13
如果没有在 pod 规格中指定请求,容器的默认内存请求。
14
容器最大的限制与请求的比率。

有关如何测量 CPU 和内存的更多信息,请参阅 计算资源

OpenShift Container Platform Limit Range 对象定义

apiVersion: "v1"
kind: "LimitRange"
metadata:
  name: "openshift-resource-limits"
spec:
  limits:
    - type: openshift.io/Image
      max:
        storage: 1Gi 1
    - type: openshift.io/ImageStream
      max:
        openshift.io/image-tags: 20 2
        openshift.io/images: 30 3
    - type: "Pod"
      max:
        cpu: "2" 4
        memory: "1Gi" 5
        ephemeral-storage: "1Gi" 6
     max:
        cpu: "1" 7
        memory: "1Gi" 8

1
可以推送到内部 registry 的最大镜像大小。
2
镜像流规格中定义的唯一镜像标签的最大数量。
3
镜像流状态规格中定义的最大镜像引用数量。
4
pod 可在所有容器中的节点上请求的最大 CPU 量。
5
pod 可在所有容器中的节点上请求的最大内存量。
6
如果启用了临时存储技术预览功能,pod 可在所有容器间请求的最大临时存储量。
7
pod 可在所有容器中的节点上请求的最小 CPU 量。如果您将 min 值设置为 0,或者将 min 设置为 0,则结果为没有限制,pod 消耗的消耗可能会超过 max CPU 的值。
8
pod 可在所有容器中的节点上请求的最小内存量。如果没有设置 min 值,或者将 min 设置为 0,则结果为没有限制,pod 消耗的消耗可能会超过 max 内存的值。

您可以在一个限制范围对象中指定核心和 OpenShift Container Platform 资源。为清晰起见,将单独在两个示例中显示这些参数。

25.1.1. 容器限制

支持的资源:

  • CPU
  • 内存

支持的限制:

对于每个容器,如果指定,则必须满足以下条件:

表 25.1. Container

约束行为

Min

Min[resource] 小于或等于 container.resources.requests[resource] (必需)小于或等于 container/resources.limits[resource] (可选)

如果配置定义了 min CPU,则请求值必须大于 CPU 值。如果没有设置 min 值,或者将 min 设置为 0,则结果为没有限制,pod 消耗的资源量可能会超过 max 值。

Max

container.resources.limits[resource] (必需)小于或等于 Max[resource]

如果配置定义了 max CPU,则不需要定义 CPU 请求值。但是,您必须设置一个满足限制范围中指定的最大 CPU 约束的限制。

MaxLimitRequestRatio

maxLimitRequestRatio[resource] 小于或等于(container.resources.limits[resource] / container.resources.requests[resource])

如果限制范围定义了 maxLimitRequestRatio 约束,则任何新容器都必须具有 requestlimit 值。另外,OpenShift Container Platform 通过将限制除以请求来计算 限制请求 的比率。结果应该是一个大于 1 的整数。

例如,如果容器有 cpu:500限制 值和 cpu:在 请求 值中,cpu 的 limit-to-request 比率为 5这个比例必须小于或等于 maxLimitRequestRatio

支持的默认值:

默认值 [resource]
如果没有指定值,则默认为 container.resources.limit[resource]
默认请求[资源]
如果没有指定值,则默认为 container.resources.requests[resource]

25.1.2. Pod 限制

支持的资源:

  • CPU
  • 内存

支持的限制:

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

表 25.2. Pod

约束强制行为

Min

Min[resource] 小于或等于 container.resources.requests[resource] (必需)小于或等于 container.resources.limits[resource]。如果没有设置 min 值,或者将 min 设置为 0,则结果为没有限制,pod 消耗的资源量可能会超过 max 值。

Max

container.resources.limits[resource] (必需)小于或等于 Max[resource]

MaxLimitRequestRatio

maxLimitRequestRatio[resource] 小于或等于(container.resources.limits[resource] / container.resources.requests[resource])。

25.1.3. 镜像限制

支持的资源:

  • 存储

资源类型名称:

  • openshift.io/Image

对于镜像,如果指定,则必须满足以下条件:

表 25.3. Image

约束行为

Max

image.dockerimagemetadata.size 小于或等于 Max[resource]

注意

要防止超过限制的 Blob 上传到 registry,必须将 registry 配置为强制实施配额。The REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_ENFORCEQUOTA 环境变量必须设置为 true。默认情况下,新部署的环境变量设置为 true

警告

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

这个问题正在被决。

25.1.4. 镜像流限制

支持的资源:

  • openshift.io/image-tags
  • openshift.io/images

资源类型名称:

  • openshift.io/ImageStream

每个镜像流,如果指定,则必须满足以下条件:

表 25.4. ImageStream

约束行为

Max[openshift.io/image-tags]

length(uniqueimagetags(imagestream.spec.tags) 小于或等于 Max[openshift.io/image-tags]

uniqueimagetags 返回对给定 spec 标签的镜像的唯一引用。

Max[openshift.io/images]

length(uniqueimages(imagestream.status.tags) 小于或等于 Max[openshift.io/images]

uniqueimages 返回状态标签中找到的唯一镜像名称。名称等于镜像的摘要。

25.1.4.1. 镜像参考计数

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

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

25.1.5. PersistentVolumeClaim 限制

支持的资源:

  • 存储

支持的限制:

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

表 25.5. Pod

约束强制行为

Min

Min[resource] <= claim.spec.resources.requests[resource](必需)

Max

claim.spec.resources.requests[resource] (必需)<= Max[resource]

限制范围对象定义

{
  "apiVersion": "v1",
  "kind": "LimitRange",
  "metadata": {
    "name": "pvcs" 1
  },
  "spec": {
    "limits": [{
        "type": "PersistentVolumeClaim",
        "min": {
          "storage": "2Gi" 2
        },
        "max": {
          "storage": "50Gi" 3
        }
      }
    ]
  }
}

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