Pods do Apigee Metrics no estado CrashLoopBackOff

Está a ver a documentação do Apigee e do Apigee Hybrid.
Não existe nenhum equivalente Documentação do Apigee Edge para este tópico.

Sintoma

No arranque, os pods de métricas permanecem no estado CrashLoopBackoff. Isto pode causar lacunas periódicas nas suas métricas/gráficos à medida que os pods são reiniciados. Isto também pode causar discrepâncias com os dados do Analytics, uma vez que faltam algumas secções de dados.

Este problema pode ocorrer se a sua instalação híbrida produzir uma grande quantidade de dados de métricas. Pode ser produzido um grande volume de dados devido a uma carga de tráfego elevada (o que resulta num grande número de recursos subjacentes, por exemplo, MPs que emitem métricas) ou a um grande número de recursos do Apigee (por exemplo, proxies, destinos, ambientes, políticas, etc.) a serem monitorizados.

Mensagens de erro

Quando usa o kubectl para ver os estados dos pods, vê que um ou mais pods Metric estão no estado CrashLoopBackoff. Por exemplo:

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 possíveis

Causa Descrição Instruções de resolução de problemas aplicáveis a
Os pods de métricas estão sem memória Os pods de telemetria estão em CrashLoopBackoff devido a memória insuficiente Apigee Hybrid

Causa 1

Os pods de métricas estão sem memória (OOM) com o motivo do erro OOMKilled.

Diagnóstico

Verifique se o problema está a ocorrer inspecionando os registos do pod:

  1. Liste os pods para obter o ID do pod de métricas com falhas:
    kubectl get pods -n APIGEE_NAMESPACE -l "app in (app, proxy, collector)"
  2. Verifique o registo do pod com falhas:
    kubectl -n APIGEE_NAMESPACE describe pods POD_NAME

Por Exemplo:

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

Investigue a secção apigee-prometheus-agg do resultado. O resultado, como o seguinte, indica que o contentor está a atingir repetidamente uma condição 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

Resolução

  1. Verifique os limites atuais do contentor com o seguinte comando
    kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
    
  2. Configure os limites de pods de métricas no ficheiro overrides.yaml com as seguintes propriedades:
    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. Aplique as alterações com o helm upgrade:
    helm upgrade telemetry apigee-telemetry/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    Se continuar a encontrar o erro de falta de memória após aumentar o limite, pode aumentar o tamanho dos nós subjacentes para permitir uma maior utilização de memória.

Faça a gestão dos componentes do plano de tempo de execução

Tem de recolher informações de diagnóstico

Recolha as seguintes informações de diagnóstico e, em seguida, contacte o apoio técnico do Apigee:

Recolha dados do contentor do Prometheus para a resolução de problemas

Inicie o encaminhamento de portas para o contentor do Prometheus. Repita o processo para os pods de apps e de proxy. Por exemplo:

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

Use o script abaixo no respetivo cluster para recolher dados:

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

O script usa três argumentos posicionais.

  1. Número da porta: defina para a porta a partir da qual fez o encaminhamento (por exemplo, 8081).
  2. Diretório: diretório base para ficheiros de saída.
  3. Número do registo: número do registo, usado para o nome do ficheiro gerado.

Exemplo de utilização

./prometheus_gather.sh 8081 . 1510679