×

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

在 AWS 上的 Red Hat OpenShift 服务 4.11 及更高版本中,默认情况下,Pod 最多可以有 4,096 个 PID。如果您的工作负载需要更多 PID,您可以通过配置 KubeletConfig 对象来增加允许的最大 PID 数量。

运行低于 4.11 版本的 AWS 上的 Red Hat OpenShift 服务集群使用默认 PID 限制为 1024

了解进程 ID 限制

在 AWS 上的 Red Hat OpenShift 服务中,在您计划在集群上运行工作之前,请考虑这两个受支持的进程 ID (PID) 使用限制

  • 每个 Pod 的最大 PID 数量。

    在 AWS 上的 Red Hat OpenShift 服务 4.11 及更高版本中,默认值为 4,096。此值由节点上设置的 podPidsLimit 参数控制。

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

    默认值取决于 节点资源。在 AWS 上的 Red Hat OpenShift 服务中,此值由 --system-reserved 参数控制,该参数根据节点的总资源在每个节点上预留 PID。

当 Pod 超过每个 Pod 允许的最大 PID 数量时,Pod 可能无法正常运行,并可能从节点中逐出。有关更多信息,请参阅 Kubernetes 文档中的逐出信号和阈值

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

为 AWS 上的 Red Hat OpenShift 服务 Pod 设置更高的进程 ID 限制的风险

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

您可以将 podPidsLimit 的值从默认值 4,096 增加到最大值 16,384。更改此值可能会导致应用程序出现停机时间,因为更改 podPidsLimit 需要重新启动受影响的节点。

如果每个节点运行大量 Pod,并且节点上的 podPidsLimit 值很高,则您有可能会超过节点的 PID 最大值。

要查找在不超过节点的 PID 最大值的情况下可以在单个节点上同时运行的 Pod 最大数量,请将 3,650,000 除以您的 podPidsLimit 值。例如,如果您的 podPidsLimit 值为 16,384,并且您预计 Pod 将使用接近该数量的进程 ID,则您可以在单个节点上安全地运行 222 个 Pod。

即使 podPidsLimit 值设置正确,内存、CPU 和可用存储空间也可能会限制可以同时运行的 Pod 的最大数量。有关更多信息,请参阅“规划您的环境”和“限制和可扩展性”。

在现有的 AWS 上的 Red Hat OpenShift 服务集群上设置更高的进程 ID 限制

您可以通过创建或编辑更改 --pod-pids-limit 参数的 KubeletConfig 对象,在现有的 AWS 上的 Red Hat OpenShift 服务 (ROSA) 集群上设置更高的 podPidsLimit

更改现有集群上的 podPidsLimit 将触发集群中的非控制平面节点一次重新启动一个。请在集群使用高峰时间之外进行此更改,并在所有节点重新启动之前避免升级或休眠您的集群。

先决条件
  • 您拥有一个 AWS 上的 Red Hat OpenShift 服务集群。

  • 您已安装 ROSA CLI (rosa)。

  • 您已安装 OpenShift CLI (oc)。

  • 您已使用 ROSA CLI 登录到您的 Red Hat 帐户。

步骤
  1. 创建或编辑KubeletConfig对象以更改PID限制。

    • 如果这是您第一次更改默认PID限制,请创建KubeletConfig对象并通过运行以下命令设置--pod-pids-limit

      $ rosa create kubeletconfig -c <cluster_name> --name <kubeletconfig_name> --pod-pids-limit=<value>
      在ROSA Classic集群中,--name参数是可选的,因为每个ROSA Classic集群只支持一个KubeletConfig对象。

      例如,以下命令为集群my-cluster设置每个Pod最多16,384个PID

      $ rosa create kubeletconfig -c my-cluster --name set-high-pids --pod-pids-limit=16384
    • 如果您之前创建了KubeletConfig对象,请编辑现有的KubeletConfig对象并通过运行以下命令设置--pod-pids-limit

      $ rosa edit kubeletconfig -c <cluster_name> --name <kubeletconfig_name> --pod-pids-limit=<value>

    这将触发工作节点的集群范围滚动重启。

  2. 通过运行以下命令验证所有工作节点是否已重启

    $ oc get machineconfigpool
    示例输出
    NAME      CONFIG                    UPDATED  UPDATING   DEGRADED  MACHINECOUNT  READYMACHINECOUNT  UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT  AGE
    master    rendered-master-06c9c4…   True     False      False     3             3                  3                   0                     4h42m
    worker    rendered-worker-f4b64…    True     False      False     4             4                  4                   0                     4h42m
验证

集群中的每个节点重启后,您可以验证新设置是否已生效。

  • 检查KubeletConfig对象中的Pod Pids限制

    $ rosa describe kubeletconfig --cluster=<cluster_name>

    新的PID限制将显示在输出中,如下例所示

    示例输出
    Pod Pids Limit:                       16384

从集群中删除自定义配置

您可以通过删除包含配置详细信息的KubeletConfig对象来从集群中删除自定义配置。

先决条件
  • 您拥有一个现有的 Red Hat OpenShift Service on AWS 集群。

  • 您已安装ROSA CLI (rosa)。

  • 您已使用ROSA CLI登录到您的Red Hat帐户。

步骤
  • 通过删除相关的自定义KubeletConfig对象来从集群中删除自定义配置

    $ rosa delete kubeletconfig --cluster <cluster_name> --name <kubeletconfig_name>
验证步骤
  • 确认集群中未列出自定义KubeletConfig对象

    $ rosa describe kubeletconfig --name <cluster_name>