概览
进程 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 上限 |
|
|
|
= 可分配 |
- 内核最大 ID 限制:由操作系统及其内核设置决定。由于 Apigee Hybrid 仅在 Linux 内核上运行,因此本指南将讨论基于 Linux 的 Kubernetes 节点限制。Linux 内核的进程 ID 数量上限为 4194304。
- kube-reserved 和 system-reserved:用于为 Kubernetes 或操作系统守护程序预留资源。
- 逐出阈值:表示节点压力的限制。达到阈值时,节点将被逐出。如需了解详情,请参阅基于 PID 的逐出。
- 可分配:可用的 PID 数量。如需了解详情,请参阅 Kubernetes:节点可分配资源。可以使用节点 PID 限制设置来配置 kube-reserved 和 system-reserved。
可以为节点配置 pod PID 限制,并在节点内的所有 pod 之间共享。
准备管理进程 ID 限制
这些过程使用下列环境变量:
export PROJECT_ID=MY_PROJECT_IDexport CLUSTER_NAME=MY_CLUSTER_NAME
export LOCATION=MY_CLUSTER_LOCATION
export APIGEE_NAMESPACE=MY_APIGEE_NAMESPACE # Default: apigee
验证访问权限
在配置进程 ID 限制之前,请确保您有权修改 Kubernetes 集群。
以下步骤适用于在 GKE 上进行的安装。对于其他平台,请参阅相应平台的文档。
-
检查 IAM 政策中是否包含 roles/container.clusterAdmin:
gcloud projects get-iam-policy ${PROJECT_ID} \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:your_account_email"
- 如果您没有相应访问权限,请为您的账号添加相应角色:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member user:your_account_email \ --role roles/container.clusterAdmin
验证现有的 PID 限制
在配置新的 PID 限制之前,请先验证节点是否已存在 PID 限制。
-
从集群中获取一个节点以检查值。您需要检查
apigee-data
和apigee-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 -
从上一步的输出中导出节点名称。先针对
apigee-data
节点运行下一步,然后再次针对apigee-runtime
节点运行下一步:代码
export NODE_NAME=MY_NODE_NAME
示例
export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
- 检查节点 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'
- 检查 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。
过程
-
创建名为
kubelet-config.yaml
的 Kubelet 配置文件。apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration kubeReserved: pid: PID_VALUE # Example: 1000
如需详细了解配置,请参阅 Kubernetes 文档中的 Kube Reserved。
-
应用 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 限制时作为参考。
在非 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 限制的数量达到最小值,在这种情况下,系统会选择最小值要求。
平台 | 最低 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 平台包括:
- GKE on Google Cloud:请参阅 gcloud container node-pools。
- GKE on AWS:请参阅 gcloud container aws node-pools。
- GKE on Azure:请参阅 gcloud container azure node-pools。
- Google Distributed Cloud on VMware(纯软件):请参阅 gcloud container vmware node-pools
- Google Distributed Cloud on Bare Metal(纯软件):请参阅 gcloud container bare-metal node-pools
Pod PID 限制由节点系统配置控制。GKE 对该值有必需的范围:[1024, 4194304]。如需了解详情,请参阅 NodeKubeletConfig。
-
创建一个名为
node-config.yaml
的节点系统配置,其中包含以下内容,并指定了 pod PID 限制:kubeletConfig: podPidsLimit: POD_PID_VALUE # Example: 1024
-
将配置应用于 apigee
apigee-data
和apigee-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
字段设置。
-
创建一个名为
kubelet-config.yaml
且包含以下内容的 Kubelet 配置文件:apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration podPidsLimit: POD_PID_VALUE # Example: 1024
-
应用配置。 设置 podPidsLimit 需要重启受影响的节点,这可能会导致停机:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
- 验证配置: 如需了解相关说明,请参阅验证现有的 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
错误而失败。
-
获取“节点”列:
kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
-
检查是否存在
PIDPressure
条件:kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
-
或者,检查相应 pod 的
ApigeeDeployment
。从与出错 pod 具有相同前缀的结果中获取ApigeeDeployment
。kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE}
-
检查最近的
Events
是否包含与 PID 相关的错误消息:kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME}
- 如果确认原因是 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 值更新为所需范围内的值。