Los pods de Apigee Metrics tienen el estado CrashLoopBackOff

Estás viendo la documentación de Apigee y Apigee hybrid.
No hay documentación de Apigee Edge equivalente para este tema.

Síntoma

Cuando se inician, los pods de Metrics permanecen en el estado CrashLoopBackoff. Esto puede provocar brechas periódicas en tus métricas o gráficos a medida que se reinician los Pods. Esto también puede causar discrepancias con los datos de Analytics, ya que faltan algunas secciones de datos.

Este problema puede ocurrir si tu instalación híbrida genera una gran cantidad de datos de métricas. Se puede producir una gran cantidad de datos debido a una carga de tráfico alta (lo que genera una gran cantidad de recursos subyacentes, por ejemplo, MPs que emiten métricas) o una gran cantidad de recursos de Apigee (por ejemplo, proxies, destinos, entornos, políticas, etcétera) que se supervisan.

Mensajes de error

Cuando usas kubectl para ver los estados de los Pods, verás que uno o más Pods de Metric están en el estado CrashLoopBackoff. Por ejemplo:

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
...

Causas posibles

Causa Descripción Instrucciones de solución de problemas aplicables para
Los pods de métricas se quedan sin memoria Los pods de telemetría están en CrashLoopBackoff debido a que no hay suficiente memoria Apigee Hybrid

Causa 1

Los Pods de métricas tienen errores de memoria insuficiente (OOM) con el motivo de error OOMKilled.

Diagnóstico

Para verificar que el problema se produzca, inspecciona los registros del Pod:

  1. Enumera los pods para obtener el ID del pod de Metrics que está fallando:
    kubectl get pods -n APIGEE_NAMESPACE -l "app in (app, proxy, collector)"
  2. Verifica el registro del Pod que falla:
    kubectl -n APIGEE_NAMESPACE describe pods POD_NAME

Por ejemplo:

kubectl describe -n apigee pods apigee-metrics-default-telemetry-proxy-1a2b3c4

Investiga la sección apigee-prometheus-agg del resultado. Un resultado como el siguiente indica que el contenedor alcanza repetidas veces una condición de 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

Solución

  1. Verifica los límites actuales del contenedor con el siguiente comando:
    kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
    
  2. Configura los límites de pods de métricas en tu archivo overrides.yaml con las siguientes propiedades:
    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. Aplica los cambios con helm upgrade:
    helm upgrade telemetry apigee-telemetry/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    Si el error de OOM persiste después de aumentar el límite, puedes aumentar el tamaño de los nodos subyacentes para permitir un mayor uso de memoria.

Administra los componentes del plano del entorno de ejecución

Se debe recopilar información de diagnóstico

Recopila la siguiente información de diagnóstico y, luego, comunícate con Asistencia de Apigee:

Recopila datos del contenedor de Prometheus para solucionar problemas

Inicia la redirección de puertos para el contenedor de Prometheus. Repite el proceso para los Pods de la app y del proxy. Por ejemplo:

kubectl port-forward -n apigee apigee-metrics-apigee-telemetry-app-1a2-b3c4-d5ef 8081:9090

Usa la siguiente secuencia de comandos en su clúster para recopilar datos:

#!/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

Argumentos:

La secuencia de comandos toma tres argumentos posicionales.

  1. Número de puerto: Configúralo en el puerto desde el que realizaste la redirección (p.ej., 8081).
  2. Directorio: Es el directorio base para los archivos de salida.
  3. Número de caso: Es el número de caso que se usa para el nombre del archivo generado.

Ejemplo de uso

./prometheus_gather.sh 8081 . 1510679