管理进程 ID 限制

概览

进程 ID (PID) 限制是 Kubernetes 对节点和 pod 施加的资源约束,用于防止过度创建进程,因为这可能会影响节点稳定性。Apigee Hybrid 支持使用 Kubernetes 功能设置进程 ID 限制。本文档介绍了如何设置这些限制,并提供了针对特定平台上的 Apigee 服务的值建议。

Apigee Hybrid 用户管理自己的集群时,在 Kubernetes 中设置 PID 限制可以提高系统稳定性、安全性和资源管理能力。这也符合 Kubernetes 最佳实践。

进程 ID 限制的定义

进程 ID 限制包括节点 PID 限制和 Pod PID 限制。

节点 PID 限制包括 Kube 预留的 PID 和系统预留的 PID。可分配的 PID 总数等于内核上限减去 kube 预留的 PID 减去系统预留的 PID 减去驱逐阈值 PID:

内核 ID 上限
    - Kube 预留
    - 系统预留
    - 驱逐阈值
= 可分配
  • 内核 ID 上限:由操作系统及其内核设置决定。由于 Apigee Hybrid 仅在 Linux 内核上运行,因此本指南将介绍 Kubernetes 节点上的基于 Linus 的限制。Linux 内核的进程 ID 数上限为 4194304。
  • Kube-reservedsystem-reserved:用于为 Kubernetes 或操作系统系统守护程序预留资源。
  • 驱逐阈值:用于指示节点压力的限制。达到阈值后,系统会驱逐该节点。如需了解详情,请参阅基于 PID 的驱逐
  • 可分配:可用的 PID 数量。如需了解详情,请参阅 Kubernetes:节点可分配。您可以使用节点 PID 限制设置配置 Kube-reserved 和 system-reserved。

您可以为节点配置 Pod PID 限制,并在节点内的所有 Pod 之间共享该限制。

准备管理进程 ID 限制

这些过程使用以下环境变量:

export PROJECT_ID=MY_PROJECT_ID
export CLUSTER_NAME=MY_CLUSTER_NAME
export LOCATION=MY_CLUSTER_LOCATION
export APIGEE_NAMESPACE=MY_APIGEE_NAMESPACE # Default: apigee

验证访问权限

在配置进程 ID 限制之前,请确保您有权修改 Kubernetes 集群。

以下步骤适用于在 GKE 上进行安装。对于其他平台,请参阅您所用平台的文档。

  1. 检查您是否在 IAM 政策中拥有 roles/container.clusterAdmin:
    gcloud projects get-iam-policy ${PROJECT_ID}  \
     --flatten="bindings[].members" \
     --format='table(bindings.role)' \
     --filter="bindings.members:your_account_email"
    
  2. 如果您没有此权限,请为您的账号添加相应角色:
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
     --member user:your_account_email \
     --role roles/container.clusterAdmin

验证现有的 PID 限制

在配置新限制之前,请先验证节点是否存在现有 PID 限制。

  1. 从集群中获取节点以检查值。您需要检查 apigee-dataapigee-runtime 节点池中的节点:
    kubectl get nodes -n ${APIGEE_NAMESPACE}
    

    您的输出应如下所示:

    NAME                                      STATUS   ROLES    AGE    VERSION
    gke-my-hybrid-apigee-data-0a1b2c3d-efgh      Ready       2d8h   v1.31.5-gke.1169000
    gke-my-hybrid-apigee-runtime-1b2c3d4e-fghi   Ready       2d8h   v1.31.5-gke.1169000
    
  2. 从上一步的输出中导出节点名称。首先针对 apigee-data 节点运行此后续步骤,然后针对 apigee-runtime 节点再次运行:

    代码

    export NODE_NAME=MY_NODE_NAME
    

    示例

    export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
    
  3. 请查看节点 PID 限制。使用以下命令检查预留值。如果值为 null,则表示未配置该值:
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.kubeReserved'
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.systemReserved'
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.evictionHard'
    
  4. 检查 pod PID 限制。使用以下命令检查现有的 Pod PID 限制。如果返回值为 -1 或空,则表示未设置限制:
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.podPidsLimit'
    

管理进程 ID 限制

管理节点 PID 限制

对于在 GKE 上进行的安装,Kubernetes 节点的基础架构资源由内部管理,您无需对其进行配置。如需查看当前容量和可分配资源,请参阅 Google Kubernetes Engine 文档中的节点可分配资源

对于非 GKE 平台,请参阅相应平台的 Kubernetes 文档。如果集群/节点由用户管理(而非完全由系统管理),则可以使用 Kubelet 配置 kube 预留的 PID 限制和系统预留的 PID 限制。请参阅 Kubernetes 文档中的节点 PID 限制

工具

此过程使用 Kubelet 来管理进程 ID 限制。Kubelet 是运行在 pod 和容器上的代理,用于确保它们按照 PodSpec 运行。如果您需要安装 Kubelet,请按照 Kubernetes 文档中的说明操作:安装 kubeadm、kubelet 和 kubectl

过程

  1. 创建一个名为 kubelet-config.yaml 的 Kubelet 配置文件。
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    kubeReserved:
     pid: PID_VALUE # Example: 1000
    

    如需详细了解相关配置,请参阅 Kubernetes 文档中的 Kube Reserved

  2. 应用 Kubelet 配置:
    kubelet --config PATH_TO_KUBELET_CONFIG_YAML
    

管理 Pod PID 限制

选择上限

如果 PID 限制设置得过低,可能会导致 Pod 无法启动。如果设置得过高,则可能会无法检测资源异常行为。选择合适的限制时,请务必考虑节点的先前行为和任何服务专用要求。

GKE 对此值的范围有要求:[1024, 4194304]。在 GKE 平台上,您可以在 Google Cloud console Metrics Explorer 中查看 Kubernetes 服务账号的状态。选择 Kubernetes 节点 - PID 使用情况指标并应用过滤条件。此指标显示的是进程 ID 的近期使用情况,可在选择 PID 限制时参考。

Metrics Explorer

在非 GKE 平台上,可能有不同的监控选项。如需查看指标,请参阅相应平台的 Kubernetes 文档。

Apigee pod 的进程 ID 要求

Apigee Hybrid 使用 2 个节点池,即 apigee-data 和 apigee-runtime。由于部分 Apigee 组件部署在两个节点池中,因此这两个节点池的 Pod PID 限制应相同。Pod PID 限制还应高于所有 Apigee Pod 所需的 PID 数量上限。所需的 Apigee pod PID 限制为 1000,低于 GKE 平台的最低要求数量。

某些平台会对 Pod PID 数量限制强制执行最小值要求,在这种情况下,系统会选择最小值要求。

平台 Pod PID 下限
GKE on Google Cloud 1024
GKE on AWS 1024
GKE on Azure 1024
Google Distributed Cloud on VMware(纯软件) 1024
Google Distributed Cloud on Bare Metal(纯软件) 1024
EKS 1000
AKS 1000
OpenShift 1000
Rancher Kubernetes Engine (RKE) 1000

过程

管理 Pod PID 限制的流程因 GKE 平台和非 GKE 平台而异。

GKE 平台

支持 PID 限制更新的 GKE 平台包括:

Pod PID 限制由节点系统配置控制。GKE 对此值的范围有要求:[1024, 4194304]。如需了解详情,请参阅 NodeKubeletConfig

  1. 创建一个名为 node-config.yaml 且具有指定 pod PID 限制的节点系统配置,其中包含以下内容:
    kubeletConfig:
     podPidsLimit: POD_PID_VALUE # Example: 1024
    
  2. 将配置应用于 apigee apigee-dataapigee-runtime 节点池。应用配置后,节点将开始使用零停机节点升级策略之一进行发布。
    gcloud container OPTIONAL_HOST_PLATFORM node-pools update NODE_POOL_NAME \
       --cluster CLUSTER_NAME \
       --region CLUSTER_LOCATION \
       --system-config-from-file=node-config.yaml \
       --project PROJECT_ID
    

非 GKE 平台

对于非 GKE 平台,Pod PID 限制由 kubelet 控制。此限制由 kubelet 配置文件中的 podPidsLimit 字段设置。

  1. 创建一个名为 kubelet-config.yaml 且包含以下内容的 Kubelet 配置文件:
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    podPidsLimit: POD_PID_VALUE # Example: 1024
    
  2. 应用配置。设置 podPidsLimit 需要重新启动受影响的节点,这可能会导致停机:
    kubelet --config PATH_TO_KUBELET_CONFIG_YAML
    
  3. 验证配置。如需了解相关说明,请参阅验证现有 PID 限制

Pod PID 限制配置命令和工具建议因平台而异。如需了解详细命令,请参阅各个平台的文档。以下是一些非 GKE 平台的文档链接,供您参考。请注意,这些日期可能会发生变化:

平台 文档
EKS 使用启动模板自定义托管节点
AKS 为 Azure Kubernetes Service (AKS) 节点池自定义节点配置
OpenShift 在 AWS 容器上为 Red Hat OpenShift 服务设置更高的进程 ID 限制的风险
Rancher Kubernetes Engine (RKE) 使用 Kubectl 和 kubeconfig 访问集群

排查进程 ID 限制问题

Pod 卡在 Pending 状态,并显示 FailedScheduling 错误

当节点或 Pod PID 限制逐出或限制 pod 启动时,pod 将卡在 Pending 状态,并因 FailedScheduling 错误而失败。

  1. 获取“节点”列:
    kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
    
  2. 检查是否存在 PIDPressure 条件:
    kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
    
  3. 或者,检查相应 pod 的 ApigeeDeployment。从与出错 pod 具有相同前缀的结果中获取 ApigeeDeployment
    kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE}
    
  4. 检查近期的 Events 是否包含与 PID 相关的错误消息:
    kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME}
    
  5. 如果确认原因是 PID 限制,请按照管理节点 PID 限制中的步骤将 PID 限制更新为更高的值。

podPidsLimit”无效

为 GKE 设置限制时,如果 podPidsLimit 超出限制,系统会提示错误:

ERROR: (gcloud.container.node-pools.update) ResponseError: code=400, message=Invalid podPidsLimit : value must be 1024 <= podPidsLimit <= 4194304.

将 podPidsLimit 值更新为在所需范围内。