개요
프로세스 ID (PID) 한도는 노드 및 포드에 적용되는 Kubernetes 리소스 제약조건으로, 노드 안정성에 영향을 줄 수 있는 과도한 프로세스 생성을 방지합니다. Apigee Hybrid는 프로세스 ID 제한을 설정하는 Kubernetes 기능을 지원합니다. 이 문서에서는 이러한 제한을 설정하는 방법을 안내하고 특정 플랫폼의 Apigee 서비스에 대한 값 권장사항을 제공합니다.
Apigee Hybrid 사용자가 자체 클러스터를 관리하는 경우 Kubernetes에서 PID 한도를 설정하면 시스템 안정성, 보안, 리소스 관리를 개선할 수 있습니다. 이는 Kubernetes 권장사항과도 일치합니다.
프로세스 ID 제한 정의
프로세스 ID 한도에는 노드 PID 한도와 포드 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 또는 OS 시스템 데몬의 리소스 예약용입니다.
- 제거 기준점: 노드의 과부하를 알리는 한도입니다. 임계값이 충족되면 노드가 제거됩니다. 자세한 내용은 PID 기반 제거를 참고하세요.
- 할당 가능: 사용 가능한 PID 수입니다. 자세한 내용은 Kubernetes: Node Allocatable을 참고하세요. Kube-reserved 및 system-reserved는 노드 PID 한도 설정으로 구성할 수 있습니다.
포드 PID 제한은 노드에 구성하고 노드 내의 모든 포드에서 공유할 수 있습니다.
프로세스 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'
- 포드 PID 한도를 확인합니다. 다음 명령어를 사용하여 기존 포드 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-reserved PID 한도와 시스템 예약 PID 한도를 구성할 수 있습니다. Kubernetes 문서의 노드 PID 한도를 참고하세요.
도구
이 절차에서는 Kubelet을 사용하여 프로세스 ID 한도를 관리합니다. Kubelet은 포드와 컨테이너에서 실행되는 에이전트로, 포드가 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
포드 PID 한도 관리
제한 선택
PID 한도가 너무 낮게 설정되면 Pod가 시작되지 않을 수 있습니다. 너무 높게 설정하면 리소스 오작동을 감지하지 못할 수 있습니다. 적절한 한도를 선택할 때는 노드의 이전 동작과 서비스별 요구사항을 고려하는 것이 중요합니다.
GKE의 필수 값 범위는 [1024, 4194304]입니다. GKE 플랫폼에서는 Google Cloud console 측정항목 탐색기에서 Kubernetes 서비스 계정의 상태를 확인할 수 있습니다. Kubernetes 노드 - PID 사용량 측정항목을 선택하고 필터를 적용합니다. 이 측정항목은 프로세스 ID의 최근 사용량을 보여주며 PID 한도를 선택할 때 참조할 수 있습니다.
GKE 이외의 플랫폼에서는 다른 모니터링 옵션을 사용할 수 있습니다. 측정항목을 확인하려면 해당 플랫폼의 Kubernetes 문서를 참고하세요.
Apigee 포드의 프로세스 ID 요구사항
Apigee Hybrid는 apigee-data 및 apigee-runtime이라는 2개의 노드 풀을 사용합니다. 일부 Apigee 구성요소는 두 노드 풀에 모두 배포되므로 두 노드 풀의 포드 PID 한도는 동일해야 합니다. 또한 포드 PID 제한은 모든 Apigee 포드에 필요한 최대 PID 수보다 높아야 합니다. 필요한 Apigee 포드 PID 한도는 1, 000개로 GKE 플랫폼에 필요한 최소 개수보다 적습니다.
권장되는 포드 PID 한도
일부 플랫폼은 포드 PID 한도 수에 최솟값 요구사항을 적용합니다. 이 경우 최솟값 요구사항이 선택됩니다.
플랫폼 | 최소 포드 PID 제한 |
---|---|
Google Cloud 기반 GKE | 1024 |
GKE on AWS | 1024 |
Azure용 GKE | 1024 |
VMware용 Google Distributed Cloud(소프트웨어 전용) | 1024 |
베어메탈용 Google Distributed Cloud(소프트웨어 전용) | 1024 |
EKS | 1000 |
AKS | 1000 |
OpenShift | 1000 |
Rancher Kubernetes Engine(RKE) | 1000 |
절차
포드 PID 한도를 관리하는 절차는 GKE 플랫폼과 비GKE 플랫폼에서 다릅니다.
GKE 플랫폼
PID 한도 업데이트를 지원하는 GKE 플랫폼에는 다음이 포함됩니다.
- Google Cloud 기반 GKE: gcloud container node-pools를 참고하세요.
- AWS용 GKE: gcloud container aws node-pools를 참고하세요.
- Azure용 GKE: gcloud container azure node-pools를 참고하세요.
- VMware용 Google Distributed Cloud (소프트웨어 전용): gcloud container vmware node-pools를 참고하세요.
- 베어메탈용 Google Distributed Cloud (소프트웨어 전용): gcloud container bare-metal node-pools를 참고하세요.
포드 PID 한도는 노드 시스템 구성에 의해 제어됩니다. GKE의 필수 값 범위는 [1024, 4194304]입니다. 자세한 내용은 NodeKubeletConfig를 참고하세요.
-
다음 콘텐츠로 지정된 포드 PID 한도가 있는
node-config.yaml
이라는 노드 시스템 구성을 만듭니다.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 이외의 플랫폼의 경우 포드 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 한도 문제 해결
FailedScheduling
오류가 표시된 Pending
상태로 멈춘 포드
노드 또는 포드 PID 제한으로 인해 포드가 제거되거나 시작되지 못하면 포드가 Pending
상태로 중단되고 FailedScheduling
오류와 함께 실패합니다.
-
노드 열을 가져옵니다.
kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
-
PIDPressure
조건이 있는지 확인합니다.kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
-
또는 해당 포드의
ApigeeDeployment
를 확인합니다. 오류가 발생한 포드와 접두사가 동일한 결과에서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 값을 필요한 범위 내에 업데이트합니다.