Apigee 및 Apigee Hybrid 문서입니다.
이 주제에 해당하는 Apigee Edge 문서가 없습니다.
증상
시작하면 측정항목 포드가 CrashLoopBackoff 상태로 유지됩니다. 이로 인해 포드가 다시 시작될 때 측정항목/그래프에 주기적인 격차가 발생할 수 있습니다. 또한 데이터의 일부 섹션이 누락되어 분석 데이터와 불일치가 발생할 수도 있습니다.
이 문제는 하이브리드 설치에서 많은 양의 측정항목 데이터를 생성하는 경우 발생할 수 있습니다. 트래픽 부하(예: 측정항목을 내보내는 MP와 같은 기본 리소스가 많음)가 높거나 모니터링되는 Apigee 리소스(예: 프록시, 대상, 환경, 정책 등)가 많으면 많은 양의 데이터가 생성될 수 있습니다.
오류 메시지
kubectl을 사용하여 포드 상태를 보면 하나 이상의 측정항목 포드가 CrashLoopBackoff 상태가 됩니다. 예를 들면 다음과 같습니다.
kubectl get pods -n NAMESPACE
NAME READY STATUS RESTARTS AGE
apigee-metrics-default-telemetry-proxy-1a2b3c4 0/1 CrashLoopBackoff 10 10m
apigee-metrics-adapter-apigee-telemetry-a2b3c4d 0/1 CrashLoopBackoff 10 10m
...가능한 원인
| 원인 | 설명 | 다음에 관한 문제 해결 안내 |
|---|---|---|
| 측정항목 포드의 메모리 부족 | 메모리가 부족하여 원격 분석 포드가 CrashLoopBackoff 상태임 | Apigee Hybrid |
원인 1
측정항목 포드에 오류 이유 OOMKilled와 함께 메모리 부족(OOM)이 발생합니다.
진단
포드 로그를 검사하여 문제가 발생하는지 확인합니다.
- 포드를 나열하여 실패한 측정항목 포드의 ID를 가져옵니다.
kubectl get pods -n APIGEE_NAMESPACE -l "app in (app, proxy, collector)"
- 실패한 포드의 로그를 확인합니다.
kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
예를 들면 다음과 같습니다.
kubectl describe -n apigee pods apigee-metrics-default-telemetry-proxy-1a2b3c4
출력의 apigee-prometheus-agg 섹션을 조사합니다. 다음과 같은 출력은 컨테이너가 OOM 조건을 반복적으로 충족함을 나타냅니다.
Containers:
apigee-prometheus-agg:
Container ID: docker://cd893dbb06c2672c41a7d6f3f7d0de4d76742e68cef70d4250bf2d5cdfcdeae6
Image: us.gcr.io/apigee-saas-staging-repo/thirdparty/apigee-prom-prometheus/master:v2.9.2
Image ID: docker-pullable://us.gcr.io/apigee-saas-staging-repo/thirdparty/apigee-prom-prometheus/master@sha256:05350e0d1a577674442046961abf56b3e883dcd82346962f9e73f00667958f6b
Port: 19090/TCP
Host Port: 0/TCP
Args:
--config.file=/etc/prometheus/agg/prometheus.yml
--storage.tsdb.path=/prometheus/agg/
--storage.tsdb.retention=48h
--web.enable-admin-api
--web.listen-address=127.0.0.1:19090
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Wed, 21 Oct 2020 16:53:42 +0000
Finished: Wed, 21 Oct 2020 16:54:28 +0000
Ready: False
Restart Count: 1446
Limits:
cpu: 500m
memory: 512Mi
Requests:
cpu: 100m
memory: 256Mi
해결 방법
- 다음 명령어를 사용하여 현재 컨테이너 한도를 확인합니다.
kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
-
다음 속성을 사용하여
overrides.yaml파일에서 측정항목 포드 한도를 구성합니다.metrics: aggregator: # The apigee-prometheus-agg container in the "proxy" pod resources: limits: memory: 32Gi # default: 3Gi app: # The apigee-prometheus-app container in the "app" pod resources: limits: memory: 16Gi # default: 1Gi helm upgrade를 사용하여 변경사항을 적용합니다.helm upgrade telemetry apigee-telemetry/ \ --install \ --namespace APIGEE_NAMESPACE \ -f OVERRIDES_FILE
한도를 늘린 후에도 OOM 오류가 계속 발생하면 기본 노드의 크기를 늘려 메모리 사용량을 늘릴 수 있습니다.
관련 문서
진단 정보 수집 필요
다음 진단 정보를 수집한 후 Apigee 지원팀에 문의합니다.
문제 해결을 위해 Prometheus 컨테이너에서 데이터 수집
Prometheus 컨테이너의 포트 전달을 시작합니다. 앱 및 프록시 포드 모두에서 반복합니다. 예를 들면 다음과 같습니다.
kubectl port-forward -n apigee apigee-metrics-apigee-telemetry-app-1a2-b3c4-d5ef 8081:9090
클러스터 내에서 아래 스크립트를 사용하여 데이터를 수집합니다.
#!/bin/bash
set -e
# check if jq is installed
jq --version &> /dev/null
if [ $? -ne 0 ]; then
echo "jq not installed"
exit 1
fi
# check if curl is installed
curl --version &> /dev/null
if [ $? -ne 0 ] ; then
echo "curl not installed"
exit 1
fi
# Simple check for missing arguments
if [[ $# -eq 0 ]] ; then
echo 'No arguments provided'
exit 1
fi
# Simple check for missing arguments
if [[ $# -ne 3 ]]; then
echo 'Illegal number of arguments'
exit 1
fi
FORWARDED_PORT=${1}
DEST_DIR=${2}
CASE_NUMBER=${3}
DIR_FULL_PATH=${DEST_DIR}/${CASE_NUMBER}_$(date +%Y_%m_%d_%H_%M_%S)
CURRENT_DATE=$(date +%Y-%m-%d)
# we set the default start date for query at 10 days before current date
START_DATE=$(date +%Y-%m-%d -d "10 days ago")
mkdir -pv ${DIR_FULL_PATH}
set -x
curl -s '127.0.0.1:'${FORWARDED_PORT}'/status' | tee ${DIR_FULL_PATH}/prometheus_status_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/config' | tee ${DIR_FULL_PATH}/prometheus_config_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/targets' | tee ${DIR_FULL_PATH}/prometheus_targets_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/status/config' | jq . | tee ${DIR_FULL_PATH}/prometheus_status_config_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/heap' --output ${DIR_FULL_PATH}/prometheus_heap_$(date +%Y.%m.%d_%H.%M.%S).hprof
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/heap?debug=1' | tee ${DIR_FULL_PATH}/prometheus_heap_$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/goroutine' --output ${DIR_FULL_PATH}/prometheus_goroutine_$(date +%Y.%m.%d_%H.%M.%S)
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/goroutine?debug=1' | tee ${DIR_FULL_PATH}/prometheus_goroutine_$(date +%Y.%m.%d_%H.%M.%S).txt
curl -s '127.0.0.1:'${FORWARDED_PORT}'/debug/pprof/profile?seconds=10' --output ${DIR_FULL_PATH}/prometheus_profile_10_seconds_$(date +%Y.%m.%d_%H.%M.%S)
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/query?query=topk(30%2C%20count%20by%20(__name__)(%7B__name__%3D~%22.%2B%22%7D))&timeout=5s&start='${START_DATE}'T00:00:00.000Z&end='${CURRENT_DATE}'T23:59:59.00Z&step=15s' | jq . | tee ${DIR_FULL_PATH}/prometheus_topk_count_by_name_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/query?query=topk(30%2C%20count%20by%20(__name__%2C%20job)(%7B__name__%3D~%22.%2B%22%7D))&timeout=5s&start='${START_DATE}'T00:00:00.000Z&end='${CURRENT_DATE}'T23:59:59.00Z&step=15s' | jq . | tee ${DIR_FULL_PATH}/prometheus_topk_group_by_job_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
curl -s '127.0.0.1:'${FORWARDED_PORT}'/api/v1/query?query=topk(30%2C%20count%20by%20(job)(%7B__name__%3D~%22.%2B%22%7D))&timeout=5s&start='${START_DATE}'T00:00:00.000Z&end='${CURRENT_DATE}'T23:59:59.00Z&step=15s' | jq . | tee ${DIR_FULL_PATH}/prometheus_topk_job_most_timeseries_$(hostname)-$(date +%Y.%m.%d_%H.%M.%S).json
set +x
ls -latrh ${DIR_FULL_PATH}
tar -cvzf ${DIR_FULL_PATH}.tar.gz ${DIR_FULL_PATH}/
exit 0
인수:
스크립트는 세 개의 위치 인수를 사용합니다.
- 포트 번호: 전달한 포트로 설정합니다(예: 8081).
- 디렉터리: 출력 파일의 기본 디렉터리입니다.
- 케이스 번호: 생성된 파일 이름에 사용되는 케이스 번호입니다.
사용 예시
./prometheus_gather.sh 8081 . 1510679