Prometheus: ошибки «federation failed: broken pipe» и «Received SIGTERM, exiting gracefully» — постоянные рестарты

Thank you for reading this post, don't forget to subscribe!

Име­ет­ся Prometheus сер­вер, запу­щен­ный через Prometheus Operator в Kubernetes-кластере,

Prometheus сер­ве­ра в каж­дом Kubernetes-кла­сте­ре через Prometheus federation отправ­ля­ют дан­ные на цен­траль­ный сервер.

При боль­ших нагруз­ках, напри­мер на нашем Kubernetes Dev кла­сте­ре, где очень мно­го подов, Prometheus начи­на­ет падать с ошибками:

Либо посто­ян­но ухо­дит в рестарт:

А при уда­ле­нии — зави­са­ет в ста­ту­се Terminating:

federation failed: write: broken pipe

Сна­ча­ла раз­бе­рём­ся с broken pipe.

Воз­ни­ка­ет она из-за того, что при пере­да­че боль­ших дан­ных в federation цен­траль­ный Prometehus-сер­вер, кото­рый дела­ет запрос к сво­им тар­ге­там, роль кото­рых выпол­ня­ют Prometehus-инстан­сы в Kubernetes-кла­сте­рах, слиш­ком дол­го ожи­да­ет от них завер­ше­ния пере­да­чи, и закры­ва­ет соединение.

Для реше­ния — изме­ним пара­метр scrape_timeout в фай­ле /etc/prometheus.yaml ,у кото­ро­го дефолт­ное зна­че­ние 10 секунд:

И резуль­тат:

 

Received SIGTERM, exiting gracefully и рестарты

Реша­ем вто­рую про­бле­му — Received SIGTERM, exiting gracefully и зави­са­ние пода Prometheus при shutdown.

Про­ве­ря­ем Kubernetes events:

Как вари­ант — под не успе­ва­ет под­нять­ся, про­чи­тать базу, и его Kubernetes его уби­ва­ет, так как пре­вы­ше­ны зна­че­ния для Liveness и Readiness probes.

Изме­ним его параметры:

  1. изме­ним readinessProbe, уве­ли­чим initialDelaySeconds до 1 минуты
  2. умень­шим срок хра­не­ния дан­ных: вме­сто дефолт­ных 10 дней оста­вим 1 час, так как все дан­ные ухо­дят на цен­траль­ный Prometheus, и на локаль­ных сер­ве­рах они осо­бо не нужны
  3. и вме­сто одно­го пода будем запус­кать три реплики

Обнов­ля­ем Ansible-task, кото­рая вызы­ва­ет helm-пла­гин для уста­нов­ки Prometheus Operator, зада­ём новые параметры:

Деп­ло­им — и теперь рабо­та­ет стабильно.