搜索

1.2. pod 和容器的资源管理

download PDF

指定 pod 时,您可以指定容器需要的每个资源量。要指定的最常见资源是 CPU 和内存 (RAM)。

当您为 Pod 中容器指定资源请求时,kubernetes-scheduler 会使用此信息分配节点来放置 Pod。

当您为容器、kubelet 或节点代理指定资源限值时,会强制实施这些限制,以便允许正在运行的容器使用该资源比您设置的限制更多。kubelet 还至少保留针对该容器使用的系统资源的请求数量。

1.2.1. 请求和限值

如果运行 pod 的节点有足够的可用资源,容器可以使用超过其对该资源的请求的资源。但是,容器不允许使用超过其资源的限值。

例如,如果您为容器设置了 256 MiB 的内存请求,并且该容器位于调度到具有 8GiB 内存且没有其他 pod 的节点的 pod 中,则容器可以尝试使用更多 RAM。

如果为该容器设置了 4GiB 的内存限值,kubelet 和容器运行时会强制实施限制。运行时可防止容器使用超过配置的资源限值。

如果容器中的进程尝试消耗超过允许的内存量,系统内核会终止尝试分配的进程,并显示 Out Of Memory (OOM) 错误。

您可以通过两种方式实施限制:

  • 通过重新主动:系统在看到违反情况后进行干预。
  • 通过强制:系统可防止容器超过限制。

不同的运行时可以有不同的方法来实施相同的限制。

注意

如果您为资源指定限制,但没有指定任何请求,且没有为该资源应用一个默认请求,则 Kubernetes 会复制您指定的限制,并将它用作资源的请求值。

1.2.2. 资源类型

CPU 和内存都是资源类型。资源类型具有一个基本单元。CPU 代表计算处理,并以 Kubernetes CPU 单位指定。内存以字节为单位指定。

CPU 和内存统称为计算资源或资源。计算资源是可请求、分配和消耗的可测量数量。它们与 API 资源不同。API 资源(如 pod 和服务)是可通过 Kubernetes API 服务器读取和修改的对象。

1.2.3. 为 pod 和容器指定资源请求和限值

对于每个容器,您可以指定资源限值和请求,包括:

spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory

虽然您只能为单个容器指定请求和限值,但考虑 pod 的整体资源请求和限值也很有用。对于特定资源,Pod 资源请求和限值是 Pod 中每个容器这个类型的资源请求/限制总和。

1.2.4. Kubernetes 中的资源单元

CPU 资源单元

CPU 资源的限制和请求以 CPU 单位计算。在 Kubernetes 中,一个 CPU 单元等于一个物理处理器内核,或一个虚拟内核,具体取决于节点是物理主机还是在物理机中运行的虚拟机。

允许部分请求。当您定义将 spec.containers[].resources.requests.cpu 设置为 0.5 的容器时,如果请求 1.0 CPU,则请求一半时间作为 CPU 时间。对于 CPU 资源单元,数量表达式 0.1 等同于表达式 100m,它可以显示为一百个 millicpu 或一百个 millicores。millicpu 和 millicores 实际是相同的。CPU 资源始终指定为绝对数量的资源,而不是作为相对数量指定。例如,500m CPU 代表容器在单核、双核或 48 核机器上运行的计算能力。

注意

要指定小于 1.0 或 1000m 的 CPU 单元,您必须使用 milliCPU 格式。例如,使用 5m,而不是 0.005 CPU。

内存资源单元

内存的限制和请求以字节为单位。您可以使用这些数量后缀之一将内存表示为普通整数或固定点号: E、P、T、G、M、k。您还可以使用两的指数:Ei、Pi、Ti、Gi、Mi Ki。例如,以下代表相同的值:

128974848, 129e6, 129M,  128974848000m, 123Mi

请注意它们的后缀。如果您请求 400m 内存,则请求为 0.4 字节,而不是 400 兆字节 (400Mi) 或 400 MB (400M)。

CPU 和内存规格示例

以下集群有足够的可用资源来调度带有专用 100m CPU 和 250Mi 的任务 pod。集群也可以超过该专用用量,最多 2000m CPU 和 2Gi 内存。

spec:
  task_resource_requirements:
    requests:
      cpu: 100m
      memory: 250Mi
    limits:
      cpu: 2000m
      memory: 2Gi

自动化控制器不会调度使用超过限制集的资源的作业。如果任务 pod 使用的资源超过限制集,则容器会受 Kubernetes 和重启的 OOMKilled。

1.2.5. 资源请求的大小建议

所有使用容器组的作业都使用相同的 pod 规格。pod 规格包括运行作业的 pod 的资源请求。

所有作业都使用相同的资源请求。pod 规格中特定作业的指定资源请求会影响 Kubernetes 根据 worker 节点上可用的资源调度作业 pod。这些是默认值。

  • 一个分叉通常需要 100Mb 内存。这通过使用 system_task_forks_mem 设置。如果您的作业有五个分叉,则作业 pod 规格必须请求 500Mb 内存。
  • 对于具有特别高 fork 值或需要更大的资源请求的作业模板,您应该使用不同的 pod 规格创建单独的容器组,以指示更大的资源请求。然后,您可以将它分配给作业模板。例如,一个 fork 值为 50 的作业模板必须与请求 5GB 内存的容器组配对。
  • 如果某个作业的 fork 值足够大,没有单个 pod 可以包含该作业,请使用作业分片功能。这会分割清单,使单个作业"slices"适合由容器组调配的自动化 pod。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.