Estás consultando la documentación de Apigee y Apigee Hybrid.
No hay documentación equivalente de
Apigee Edge sobre este tema.
Síntoma
Al iniciarse, los pods de métricas permanecen en el estado CrashLoopBackoff. Esto puede provocar que haya lagunas periódicas en sus métricas o gráficos mientras se reinician los pods. Esto también puede provocar discrepancias con los datos de Analytics, ya que faltarán algunas secciones de datos.
Este problema puede producirse si tu instalación híbrida genera una gran cantidad de datos de métricas. Se puede generar una gran cantidad de datos debido a una carga de tráfico elevada (lo que da lugar a un gran número de recursos subyacentes, por ejemplo, MPs que emiten métricas) o a un gran número de recursos de Apigee (por ejemplo, proxies, destinos, entornos, políticas, etc.) que se monitorizan.
Mensajes de error
Cuando usas kubectl para ver los estados de los pods, observas que uno o varios MetricPods 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
...Posibles motivos
| Causa | Descripción | Instrucciones de solución de problemas aplicables a |
|---|---|---|
| Los pods de métricas se quedan sin memoria | Los pods de telemetría están en CrashLoopBackoff debido a que no tienen suficiente memoria | Apigee Hybrid |
Causa 1
Los pods de métricas se quedan sin memoria (OOM) con el motivo de error OOMKilled.
Diagnóstico
Comprueba que el problema se produce inspeccionando los registros del pod:
- Lista los pods para obtener el ID del pod de métricas que está fallando:
kubectl get pods -n APIGEE_NAMESPACE -l "app in (app, proxy, collector)"
- Consulta 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. Una salida como la siguiente indica que el contenedor está alcanzando repetidamente una condición de falta de memoria:
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
Resolución
- Consulta los límites actuales de los contenedores con el siguiente comando:
kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
-
Configure los límites de pods de métricas en el archivo
overrides.yamlcon 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 - Aplica los cambios con
helm upgrade:helm upgrade telemetry apigee-telemetry/ \ --install \ --namespace APIGEE_NAMESPACE \ -f OVERRIDES_FILE
Si sigues recibiendo el error OOM después de aumentar el límite, puedes aumentar el tamaño de los nodos subyacentes para permitir un mayor uso de la memoria.
Documentos relacionados
Gestionar componentes del plano del entorno de ejecución
Debe recoger información de diagnóstico
Recoge la siguiente información de diagnóstico y, a continuación, ponte en contacto con el equipo de Asistencia de Apigee:
Recoger datos del contenedor de Prometheus para solucionar problemas
Inicia el reenvío de puertos del contenedor de Prometheus. Repite el proceso con los pods de la aplicación 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 recoger 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 acepta tres argumentos posicionales.
- Número de puerto: indica el puerto desde el que has reenviado (por ejemplo, 8081).
- Directorio: directorio base de los archivos de salida.
- Número de caso: número de caso que se usa para el nombre del archivo generado.
Ejemplo de uso
./prometheus_gather.sh 8081 . 1510679