Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Für dieses Thema gibt es keine entsprechende Apigee Edge-Dokumentation.
Symptom
Während des Starts verbleiben die Messwert-Pods im Status „CrashLoopBackoff“. Dies kann zu regelmäßigen Lücken in Ihren Messwerten/Diagrammen führen, da die Pods neu gestartet werden. Dies kann auch zu Abweichungen bei Analytics-Daten führen, da einige Datenbereiche fehlen.
Dieses Problem kann auftreten, wenn bei Ihrer Hybridinstallation eine große Menge an Messwertdaten generiert wird. Eine große Datenmenge kann durch eine hohe Traffic-Last (die zu einer großen Anzahl zugrunde liegender Ressourcen führt, z. B. MPs, die Messwerte ausgeben) oder durch eine große Anzahl von Apigee-Ressourcen (z. B. Proxys, Ziele, Umgebungen, Richtlinien usw.) entstehen, die überwacht werden.
Fehlermeldungen
Wenn Sie den Pod-Status mit kubectl aufrufen, sehen Sie, dass sich ein oder mehrere Messwert-Pods im Status „CrashLoopBackoff“ befinden. Beispiel:
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
...Mögliche Ursachen
| Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
|---|---|---|
| Messwert-Pods haben keinen Arbeitsspeicher mehr | Telemetrie-Pods befinden sich aufgrund von unzureichendem Arbeitsspeicher im Status „CrashLoopBackoff“ | Apigee Hybrid |
Ursache 1
Für die Messwert-Pods ist der Arbeitsspeicher aufgrund des Fehlergrunds OOMKilled nicht ausreichend.
Diagnose
Prüfen Sie anhand der Pod-Logs, ob das Problem auftritt:
- Listen Sie die Pods auf, um die ID des Messwert-Pods zu erhalten, der fehlschlägt:
kubectl get pods -n APIGEE_NAMESPACE -l "app in (app, proxy, collector)"
- Prüfen Sie das Log des fehlerhaften Pods:
kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
Beispiel:
kubectl describe -n apigee pods apigee-metrics-default-telemetry-proxy-1a2b3c4
Sehen Sie sich den Abschnitt „apigee-prometheus-agg“ der Ausgabe an. Eine Ausgabe wie die folgende weist darauf hin, dass der Container wiederholt den OOM-Zustand erreicht:
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
Lösung
- Prüfen Sie die aktuellen Containerlimits mit dem folgenden Befehl:
kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
-
Konfigurieren Sie die Pod-Limits für Messwerte in Ihrer
overrides.yaml-Datei mit den folgenden Attributen: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 - Wenden Sie die Änderungen mit
helm upgradean:helm upgrade telemetry apigee-telemetry/ \ --install \ --namespace APIGEE_NAMESPACE \ -f OVERRIDES_FILE
Wenn der OOM-Fehler nach dem Erhöhen des Limits weiterhin auftritt, können Sie die zugrunde liegenden Knoten vergrößern, um mehr Arbeitsspeicher zu ermöglichen.
Zugehörige Dokumente
Komponenten der Laufzeitebene verwalten
Erfassen von Diagnoseinformationen erforderlich
Sammeln Sie die folgenden Diagnoseinformationen und wenden Sie sich dann an den Apigee-Support:
Daten aus dem Prometheus-Container zur Fehlerbehebung erfassen
Starten Sie die Portweiterleitung für den Prometheus-Container. Wiederholen Sie den Vorgang für App- und Proxy-Pods. Beispiel:
kubectl port-forward -n apigee apigee-metrics-apigee-telemetry-app-1a2-b3c4-d5ef 8081:9090
Verwenden Sie das folgende Script in Ihrem Cluster, um Daten zu erheben:
#!/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
Argumente:
Das Skript verwendet drei Positionsargumente.
- Portnummer: Legen Sie den Port fest, von dem Sie weitergeleitet haben (z.B. 8081).
- Verzeichnis: Basisverzeichnis für Ausgabedateien.
- Fallnummer: Fallnummer, die für den generierten Dateinamen verwendet wird.
Nutzungsbeispiel
./prometheus_gather.sh 8081 . 1510679