Kubernetes: моніторинг Events з kubectl та Grafana Loki

Автор |  21/06/2024
 

В Kubernetes окрім метрик та логів з контейнерів ми маємо змогу отримувати інформацію про роботу компонентів за допомогою Kubernetes Events.

В евентах зазвичай зберігається інформація про статус подів (створення, Evict, kill, ready або not-ready статус подів), про WorkerNodes (статус серверів), про роботу Kubernetes Scheduler (неможливість запуску поду, тощо).

Типи Kubernetes Events

В цілому, всі ці евенти можна поділити на такі типи:

  • Failed events: коли виникає проблема з маніфестом або образом, з якого потрібно створити контейнер (ImagePullBackOff, CrashLoopBackOff)
  • Eviction events: коли под видаляється, бо на WorkerNode мало ресурсів (Node-pressure Eviction), або ноду треба видалити, і автоскейлер (наприклад, Karpenter) виконує node drain (API-initiated Eviction)
  • Scheduler events: проблеми с запуском поду на WorkerNode, наприклад – коли Scheduler не може знайти ноду з достатніми ресурсами, щоб задовольнити Pod requests
  • Volume events: проблеми з підключенням PersistentVolume до поду (FailedAttachVolume, FailedMount)
  • Node events: проблеми в роботі WorkerNodes (NodeNotReady)

Kubernetes Events та kubectl

Отримати евенти можемо просто з kubectl – або зробивши kubectl describe pod <POD_NAME> чи kubectl decsribe deploy <DEPLOY_NAME>:

Або з kubectl get events, якому можна додати параметр --watch:

Також існує цікавий плагін podevents, який додає час евенту.

Встановити можна з krew:

$ kubectl krew install podevents

І запускаємо, передавши ім’я поду:

Kubernetes Events та Grafana Loki

Для роботи з евентами є багато рішень:

  • sloop – активний, система візуалізації евентів з можливістю фільтрації та пошуку
  • kspan – активний, створює OpenTelemetry Spans з евентів, які потім можна перевіряти в системах типу Jaeger
  • kubernetes-event-exporter – активний, вміє відправляти евенти, мабуть, в усе, що взагалі існує – і AWS SQS/SNS, і Opsgenie, і Slack, і Loki – можливо, він буде наступний в моєму кластері, коли поточне рішення стане недостатнім
  • Grafana Agent (Grafana Alloy) – теж вміє працювати з евентами, і писати їх у вигляді логів в Loki
  • eventrouter – в архіві з 2022
  • kubewatch – в архіві з 2022

Але, як на мене, то простіше всього їх мати у вигляді логів, і потім з Loki RecordingRules створювати метрики, а з них графіки в Grafana та/або алерти.

Для цього є дуже проста система max-rocket-internet/k8s-event-logger, яка слухає Kubernetes API, отримує всі евенти, і записує їх у вигляді лога в JSON.

Встановлюється з Helm-чарту:

$ helm repo add deliveryhero https://charts.deliveryhero.io/
$ helm -n monitoring install k8s-event-logger deliveryhero/k8s-event-logger

Створить Pod, який власне і буде читати events:

$ kubectl -n ops-monitoring-ns get pods -l "app.kubernetes.io/name=k8s-event-logger"
NAME                                READY   STATUS    RESTARTS   AGE
k8s-event-logger-5b548d6cc4-r8wkl   1/1     Running   0          68s

І писати їх у свій output:

$ kubectl -n ops-monitoring-ns logs -l "app.kubernetes.io/name=k8s-event-logger"
{"metadata":{"name":"backend-api-deployment-7fdfbb755-tjv2j.17daa9e0264e6139","namespace":"prod-backend-api-ns","uid":"1fa06477-62c9-4324-8823-7f2801fc26af","resourceVersion":"110778929","creationTimestamp":"2024-06-20T08:43:07Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2024-06-20T08:43:07Z",
...

Який потім попаде в Promtail, а звідти в Loki:

В цілому, на цьому і все.

Тепер, маючи історію евентів, буде набагато простіше дебажити якісь проблеми з подами або нодами.