6.9. 为 OpenShift Container Platform 集群中的节点分配资源


为提供更可靠的调度并最大程度减少节点资源过量使用,请保留一部分 CPU 和内存资源供底层节点组件(如 kubeletkube-proxy )以及其余系统组件(如 sshdNetworkManager )使用。通过指定要保留的资源,您可以为调度程序提供有关节点可用于 pod 使用的剩余 CPU 和内存资源的更多信息。您可以允许 OpenShift Container Platform 为您的节点自动决定最佳的 system-reserved CPU 和内存资源,也可以为节点手动决定并设置最佳资源

重要

要手动设置资源值,您必须使用 kubelet 配置 CR。您不能使用机器配置 CR。

6.9.1. 了解如何为节点分配资源

OpenShift Container Platform 中为节点组件保留的 CPU 和内存资源基于两个节点设置:

Expand
设置描述

kube-reserved

此设置不会用于 OpenShift Container Platform。将您要保留的 CPU 和内存资源添加到 system-reserved 设置中。

system-reserved

此设置标识要为节点组件和系统组件(如 CRI-O 和 Kubelet)保留的资源。默认设置取决于 OpenShift Container Platform 和 Machine Config Operator 版本。确认 machine-config-operator 仓库中的默认 systemReserved 参数。

如果没有设置标志,则使用默认值。如果未设置任何标记,则分配的资源设置为引入可分配资源前的节点容量。

注意

任何使用 reservedSystemCPUs 参数特别保留的 CPU 都无法使用 kube-reservedsystem-reserved 进行分配。

分配的资源数量根据以下公式来计算:

[Allocatable] = [Node Capacity] - [system-reserved] - [Hard-Eviction-Thresholds]
Copy to Clipboard Toggle word wrap
注意

Allocatable 提供的 Hard-Eviction-Thresholds 可提高系统可靠性,因为 Allocatable 的值在节点级别强制实施。

如果 Allocatable 为负值,它会被设为 0

每个节点报告容器运行时和 kubelet 使用的系统资源。为简化配置 system-reserved 参数,请使用节点概述 API 查看用于节点的资源。节点概述位于 /api/v1/nodes/<node\" /proxy/stats/summary

6.9.1.2. 节点如何强制实施资源限制

节点可以根据配置的可分配值限制 pod 可消耗的资源总量。此功能可以防止 pod 使用系统服务(如容器运行时和节点代理)所需的 CPU 和内存资源,从而显著提高节点可靠性。为提高节点可靠性,管理员应该根据目标保留资源使用。

节点使用一个新的 cgroup 分级结构来强制实施对资源的约束。它可以强制实现对服务质量的要求。所有 pod 都在专用的 cgroup 层次结构中启动,与系统守护进程隔离。

管理员应该像对待具有保证服务质量的 pod 一样对待系统守护进程。系统守护进程可能会在其限定控制组中爆发,此行为需要作为集群部署的一个部分进行管理。通过在 system-reserved 中指定 CPU 和内存资源量,为系统守护进程保留 CPU 和内存资源。

强制实施 system-reserved 限制可防止关键系统服务接收 CPU 和内存资源。因此,关键系统服务可能会被内存不足 killer 结束。我们的建议是,只在您为节点进行了详细配置后,强制实施 system-reserved,且您可以确定,如果关键系统服务因为该组中的任何进程导致内存不足 killer 终止它时,可以恢复。

6.9.1.3. 了解驱除阈值

如果某个节点面临内存压力,这可能会影响整个节点以及该节点上运行的所有 pod。例如,使用超过保留内存量的系统守护进程可触发内存不足事件。为避免系统耗尽或降低内存不足事件的可能性,节点会提供处理资源不足情况的功能。

您可以使用 --eviction-hard 标记保留一些内存。每当节点上的内存可用量低于该绝对值或百分比时,节点会尝试驱除 pod。如果节点上没有系统守护进程,pod 的内存会被限制在 capacity - eviction-hard 内。因此,pod 不能使用作为达到内存不足状态前驱除缓冲量而预留的资源。

下例演示了节点内存可分配量的影响:

  • 节点容量为 32Gi
  • --system-reserved 为 3Gi
  • --eviction-hard 设置为 100Mi

对于这个节点,有效节点可分配量的值是 28.9Gi。如果节点和系统组件使用其所有保留量,则 pod 的可用内存为 28.9Gi,并且 kubelet 会在超过这个阈值时驱除 pod。

如果您通过顶级 cgroup 强制实施节点可分配量 (28.9Gi),那么 pod 永不会超过 28.9Gi。除非系统守护进程消耗的内存超过 3.1Gi,否则不会执行驱除。

如果系统守护进程没有用尽其所有保留量,那么在上例中,pod 会在节点开始驱除前面临被其限定 cgroup 执行 memcg OOM 终止的问题。为了在这种情况下更好地强制实施 QoS,节点会对所有 pod 的顶级 cgroup 应用硬驱除阈值,即 Node Allocatable + Eviction Hard Thresholds

如果系统守护进程没有用尽所有保留量,每当 pod 消耗的内存超过 28.9Gi 时,节点就会驱除 pod。如果不及时驱除,消耗的内存超过 29Gi 时就会对 pod 执行 OOM 终止。

6.9.1.4. 调度程序如何确定资源可用性

调度程序使用 node.Status.Allocatable(而非 node.Status.Capacity)的值来决定节点是否成为 pod 调度的候选者。

在默认情况下,节点会将其机器容量报告为可完全被集群调度。

6.9.2. 了解进程 ID 限制

进程标识符(PID)是由 Linux 内核分配给系统中当前运行的每个进程或线程的唯一标识符。在 Linux 内核中限制了可以在系统中同时运行的进程数量为 4,194,304。这个数字也可能会受到限制访问其他系统资源(如内存、CPU 和磁盘空间)的影响。

在 OpenShift Container Platform 中,在集群中调度作业前,请考虑以下两个对进程 ID (PID) 使用的限制:

  • 每个 pod 的最大 PID 数量。

    OpenShift Container Platform 4.11 及更高版本中的默认值为 4,096。这个值由节点上设置的 podPidsLimit 参数控制。

    您可以通过在 chroot 环境中运行以下命令来查看节点上的当前 PID 限制:

    sh-5.1# cat /etc/kubernetes/kubelet.conf | grep -i pids
    Copy to Clipboard Toggle word wrap

    输出示例

    "podPidsLimit": 4096,
    Copy to Clipboard Toggle word wrap

    您可以使用 KubeletConfig 对象更改 podPidsLimit。请参阅"创建 KubeletConfig CR 以编辑 kubelet 参数"。

    容器从父 pod 继承 podPidsLimit 值,因此内核会强制实施两个限制中的最低值。例如,如果容器 PID 限制设置为最大值,但 Pod PID 限制为 4096,则 pod 中每个容器的 PID 限制限制为 4096。

  • 每个节点的最大 PID 数量。

    默认值取决于节点资源。在 OpenShift Container Platform 中,这个值由 kubelet 配置中的 systemReserved 参数控制,它根据节点的总资源在每个节点中保留 PID。如需更多信息,请参阅"在 OpenShift Container Platform 集群中为节点查找资源"。

当 pod 超过每个 pod 允许的最大 PID 数量时,pod 可能会无法正常工作,并可能会从节点中驱除。如需更多信息,请参阅 Kubernetes 文档中的驱除信号和阈值

当节点超过每个节点允许的最大 PID 数量时,节点可能会变得不稳定,因为新进程无法分配 PID。如果在不创建额外的进程的情况下现有进程无法完成,则整个节点可能会不可用,需要重启。这种情况可能会导致数据丢失,具体取决于正在运行的进程和应用程序。达到这个阈值时,客户管理员和红帽站点可靠性工程团队会获得通知,在集群日志中会出现 Worker node is experiencing PIDPressure 警告。

pod 的 podPidsLimit 参数控制可在该 pod 中同时运行的最大进程和线程数。

您可以将 podPidsLimit 的值从默认值 4,096 增加到最多 16,384。更改这个值可能会导致应用程序停机,因为更改 podPidsLimit 需要重新引导受影响的节点。

如果您每个节点运行大量 pod,且节点上有高 podPidsLimit 值,则风险超过节点的最大 PID。

要查找您可以在单一节点上运行的最大 pod 数量,而不超过节点的 PID 最大,请将 3,650,000 除以 podPidsLimit 的值。例如,如果您的 podPidsLimit 值是 16,384,并且您希望使用的 pod 数量与进程 ID 数接近,您可以在单个节点上安全地运行 222 个 pod。

注意

即使 podPidsLimit 值被正确设置,内存、CPU 和可用存储也可能会限制可以同时运行的 pod 的最大数量。

6.9.3. 自动为节点分配资源

OpenShift Container Platform 可以自动决定与特定机器配置池关联的节点的最佳 system-reserved CPU 和内存资源,并在节点启动时使用这些值更新节点。默认情况下,system-reserved CPU 为 500msystem-reserved 内存为 1Gi

要在节点上自动决定并分配 system-reserved 资源,请创建一个 KubeletConfig 自定义资源(CR)来设置 autoSizingReserved: true 参数。各个节点上的脚本根据每个节点上安装的 CPU 和内存容量,计算相应保留资源的最佳值。该脚本考虑了增加的容量要求保留资源的相应增加。

自动确定最佳的 system-reserved 设置可确保集群高效运行,并防止因为 CRI-O 和 kubelet 等系统组件的资源丢失而出现节点故障,而无需手动计算和更新值。

此功能默认为禁用。

先决条件

  1. 输入以下命令为您要配置的节点类型获取与静态 MachineConfigPool 对象关联的标签:

    $ oc edit machineconfigpool <name>
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc edit machineconfigpool worker
    Copy to Clipboard Toggle word wrap

    输出示例

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 
    1
    
      name: worker
    #...
    Copy to Clipboard Toggle word wrap

    1
    标签会出现在 Labels 下。
    提示

    如果没有适当的标签,请添加键/值对,例如:

    $ oc label machineconfigpool worker custom-kubelet=small-pods
    Copy to Clipboard Toggle word wrap

流程

  1. 为配置更改创建自定义资源(CR):

    资源分配 CR 的示例配置

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: dynamic-node 
    1
    
    spec:
      autoSizingReserved: true 
    2
    
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 
    3
    
    #...
    Copy to Clipboard Toggle word wrap

    1
    为 CR 分配一个名称。
    2
    autoSizingReserved 参数设置为 true,以允许 OpenShift Container Platform 在与指定标签关联的节点上自动决定并分配 system-reserved 资源。要在这些节点上禁用自动分配,请将此参数设置为 false
    3
    指定您在"先决条件"部分中配置的机器配置池中的标签。您可以为机器配置池选择任何所需的标签,如 custom-kubelet: small-pods 或默认标签 pools.operator.machineconfiguration.openshift.io/worker: ""

    前面的示例在所有 worker 节点上启用自动资源分配。OpenShift Container Platform 排空节点、应用 kubelet 配置并重启节点。

  2. 运行以下命令来创建 CR:

    $ oc create -f <file_name>.yaml
    Copy to Clipboard Toggle word wrap

验证

  1. 输入以下命令登录到您配置的节点:

    $ oc debug node/<node_name>
    Copy to Clipboard Toggle word wrap
  2. /host 设置为 debug shell 中的根目录:

    # chroot /host
    Copy to Clipboard Toggle word wrap
  3. 查看 /etc/node-sizing.env 文件:

    输出示例

    SYSTEM_RESERVED_MEMORY=3Gi
    SYSTEM_RESERVED_CPU=0.08
    Copy to Clipboard Toggle word wrap

    kubelet 使用 /etc/node-sizing.env 文件中的 system-reserved 值。在上例中,worker 节点分配了 0.08 CPU 和 3 Gi 内存。显示最佳值可能需要几分钟时间。

6.9.4. 手动为节点分配资源

OpenShift Container Platform 支持对 CPU 和内存资源类型执行分配。还支持 ephemeral-resource 资源类型。对于 cpu 类型,您可以以内核数为单位指定资源数量,如 200m0.51。对于 memoryephemeral-storage,您可以指定资源数量(以字节为单位),如 200Ki50Mi5Gi。默认情况下,system-reserved CPU 为 500msystem-reserved 内存为 1Gi

作为管理员,您可以通过一组 <resource_type>=<resource_quantity> 对(如 cpu=200m,memory=512Mi)来设置这些值。

重要

您必须使用 kubelet 配置 CR 来手动设置资源值。您不能使用机器配置 CR。

有关推荐的 system-reserved 值的详情,请参考推荐的 system-reserved 值

先决条件

  1. 输入以下命令为您要配置的节点类型获取与静态 MachineConfigPool CRD 关联的标签:

    $ oc edit machineconfigpool <name>
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc edit machineconfigpool worker
    Copy to Clipboard Toggle word wrap

    输出示例

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 
    1
    
      name: worker
    #...
    Copy to Clipboard Toggle word wrap

    1
    标签会出现在 Labels 下。
    提示

    如果标签不存在,请添加键/值对,例如:

    $ oc label machineconfigpool worker custom-kubelet=small-pods
    Copy to Clipboard Toggle word wrap

流程

  1. 为配置更改创建自定义资源 (CR)。

    资源分配 CR 的示例配置

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: set-allocatable 
    1
    
    spec:
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 
    2
    
      kubeletConfig:
        systemReserved: 
    3
    
          cpu: 1000m
          memory: 1Gi
    #...
    Copy to Clipboard Toggle word wrap

    1
    为 CR 分配一个名称。
    2
    指定机器配置池中的标签。
    3
    为节点组件和系统组件指定要保留的资源。
  2. 运行以下命令来创建 CR:

    $ oc create -f <file_name>.yaml
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat