總覽
程序 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 預留的 PID、系統預留的 PID 和驅逐門檻 PID:
核心 ID 上限 |
|
|
|
= 可分配 |
- 核心 ID 上限:取決於作業系統和核心設定。由於 Apigee Hybrid 只能在 Linux 核心上執行,本指南將討論 Kubernetes 節點的 Linux 限制。Linux 核心的程序 ID 數量上限為 4194304。
- kube-reserved 和 system-reserved:用於為 Kubernetes 或 OS 系統精靈預留資源。
- 逐出門檻:節點壓力信號的限制。達到門檻時,節點就會遭到驅逐。詳情請參閱「PID based eviction」。
- 可分配:可用的 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 限制。請使用下列指令檢查保留值。如果值為空值,則表示未設定值:
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 指標探索工具中查看 Kubernetes 服務帳戶的狀態。選取「Kubernetes Node - PID usage」(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 下限 |
---|---|
Google Cloud 中的 GKE | 1024 |
GKE on AWS | 1024 |
GKE on Azure | 1024 |
VMware 上的 Google Distributed Cloud (僅限軟體) | 1024 |
裸機上的 Google Distributed Cloud (僅限軟體) | 1024 |
EKS | 1000 |
AKS | 1000 |
OpenShift | 1000 |
Rancher Kubernetes Engine (RKE) | 1000 |
程序
管理 Pod PID 限制的程序在 GKE 和非 GKE 平台有所不同。
GKE 平台
支援 PID 限制更新的 GKE 平台包括:
- Google Cloud 上的 GKE:請參閱 gcloud container node-pools。
- GKE on AWS:請參閱 gcloud container aws node-pools。
- GKE on Azure:請參閱 gcloud container azure node-pools。
- VMware 上的 Google Distributed Cloud (僅限軟體):請參閱 gcloud container vmware node-pools
- 裸機上的 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 | 為 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 值更新為必要範圍內的值。