Apigee Metrics-Pods im Status „CrashLoopBackOff“

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:

  1. 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)"
  2. 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

  1. Prüfen Sie die aktuellen Containerlimits mit dem folgenden Befehl:
    kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
    
  2. 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
    
  3. Wenden Sie die Änderungen mit helm upgrade an:
    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.

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.

  1. Portnummer: Legen Sie den Port fest, von dem Sie weitergeleitet haben (z.B. 8081).
  2. Verzeichnis: Basisverzeichnis für Ausgabedateien.
  3. Fallnummer: Fallnummer, die für den generierten Dateinamen verwendet wird.

Nutzungsbeispiel

./prometheus_gather.sh 8081 . 1510679