Pod Apigee Metrics dalam status CrashLoopBackOff

Anda sedang melihat dokumentasi Apigee dan Apigee Hybrid.
Tidak ada dokumentasi Apigee Edge yang setara untuk topik ini.

Gejala

Saat memulai, pod Metrik tetap dalam status CrashLoopBackoff. Hal ini dapat menyebabkan jeda berkala dalam metrik/grafik saat pod dimulai ulang. Hal ini juga dapat menyebabkan perbedaan dengan data Analytics karena beberapa bagian data tidak ada.

Masalah ini dapat terjadi jika penginstalan hybrid Anda menghasilkan data metrik dalam jumlah besar. Data dalam jumlah besar dapat dihasilkan karena beban traffic yang tinggi (sehingga menghasilkan sejumlah besar resource pokok, misalnya MP yang memancarkan metrik), atau sejumlah besar resource Apigee (misalnya, proxy, target, env, kebijakan, dll.) yang dipantau.

Pesan error

Saat menggunakan kubectl untuk melihat status pod, Anda akan melihat bahwa satu atau beberapa pod Metrik berada dalam status CrashLoopBackoff. Contoh:

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

Kemungkinan penyebab

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Pod metrik kehabisan memori Pod telemetri berada di CrashLoopBackoff karena memori tidak cukup Apigee hybrid

Penyebab 1

Pod Metrik Kehabisan Memori (OOM) dengan alasan error OOMKilled.

Diagnosis

Periksa apakah masalah terjadi dengan memeriksa log pod:

  1. Buat daftar pod untuk mendapatkan ID pod Metrik yang gagal:
    kubectl get pods -n APIGEE_NAMESPACE -l "app in (app, proxy, collector)"
  2. Periksa log pod yang gagal:
    kubectl -n APIGEE_NAMESPACE describe pods POD_NAME

Misalnya:

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

Selidiki bagian apigee-prometheus-agg dari output. Output seperti berikut menunjukkan bahwa container berulang kali mengalami kondisi 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

Resolusi

  1. Periksa batas container saat ini dengan perintah berikut
    kubectl -n APIGEE_NAMESPACE describe pods POD_NAME
    
  2. Konfigurasi batas pod metrik dalam file overrides.yaml Anda dengan properti berikut:
    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. Terapkan perubahan dengan helm upgrade:
    helm upgrade telemetry apigee-telemetry/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    Jika error OOM masih terjadi setelah meningkatkan batas, Anda dapat menaikkan ukuran node pokok untuk memungkinkan penggunaan memori yang lebih besar.

Mengelola komponen bidang runtime

Harus mengumpulkan informasi diagnostik

Kumpulkan informasi diagnostik berikut, lalu hubungi Dukungan Apigee:

Mengumpulkan Data dari Container Prometheus untuk Pemecahan Masalah

Mulai penerusan port untuk container prometheus. Ulangi untuk pod aplikasi dan proxy. Contoh:

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

Gunakan skrip di bawah dalam cluster mereka untuk mengumpulkan data:

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

Argumen:

Skrip ini menggunakan tiga argumen posisional.

  1. Nomor port: Setel ke port yang Anda teruskan dari (misalnya, 8081).
  2. Direktori: Direktori dasar untuk file output.
  3. Nomor kasus: Nomor kasus, digunakan untuk nama file yang dihasilkan.

Contoh Penggunaan

./prometheus_gather.sh 8081 . 1510679