管理进程 ID 限制

概览

进程 ID (PID) 限制是针对节点和 pod 的 Kubernetes 资源限制,旨在防止创建过多的进程,以免影响节点稳定性。Apigee Hybrid 支持 Kubernetes 功能来设置进程 ID 限制。本文档提供了有关如何设置这些限制的说明,并针对特定平台上的 Apigee 服务提供了值建议。

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

进程 ID 限制的定义

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

节点 PID 限制包括 Kube 保留 PID 和系统保留 PID。可分配 PID 的总数是内核最大值减去 kube-reserved PID、system-reserved PID 和逐出阈值 PID:

内核 ID 上限
    - Kube 保留
    - 系统预留
    - 逐出阈值
= 可分配
  • 内核最大 ID 限制:由操作系统及其内核设置决定。由于 Apigee Hybrid 仅在 Linux 内核上运行,因此本指南将讨论基于 Linux 的 Kubernetes 节点限制。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 限制之前,请先验证节点是否已存在 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 文档。如果集群/节点是由用户管理的(而非完全由 Google 管理),则可以使用 Kubelet 配置 kube-reserved PID 限制和 system-reserved 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
AWS 上的 GKE 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

过程

对于 GKE 和非 GKE 平台,管理 Pod PID 限制的程序有所不同。

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 服务 (AKS) 节点池自定义节点配置
OpenShift 为 Red Hat OpenShift Service on AWS pod 设置更高的进程 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 值更新为所需范围内的值。