概览
进程 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 上限 |
|
|
|
= 可分配 |
- 内核 ID 上限:由操作系统及其内核设置决定。由于 Apigee Hybrid 仅在 Linux 内核上运行,因此本指南将介绍 Kubernetes 节点上的基于 Linus 的限制。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 限制。
-
从集群中获取节点以检查值。您需要检查
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 文档。如果集群/节点由用户管理(而非完全由系统管理),则可以使用 Kubelet 配置 kube 预留的 PID 限制和系统预留的 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 |
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 平台包括:
- 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
- Bare Metal 上的 Google Distributed Cloud(纯软件):请参阅 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 Service (AKS) 节点池自定义节点配置 |
OpenShift | 在 AWS 容器上为 Red Hat OpenShift 服务设置更高的进程 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 值更新为在所需范围内。