Локи - събиране на трупи, използвайки подхода на Прометей

Поздрави, хабровци! В очакване на началото на ново записване за курса „Практики и инструменти на DevOps“ Подготвили сме превод на интересен материал за вас.

Тази статия е кратко въведение в Локи. Проект Локи подкрепен от Графана и е насочен към централизирано събиране на регистрационни файлове (от сървъри или контейнери).

Основното вдъхновение за Локи беше Прометей с идеята да приложи неговите подходи към управлението на регистрационни файлове:

  • използване на етикети за съхраняване на данни
  • консумация на малко ресурси

Ще се върнем към принципите на Prometheus и ще дадем някои примери за използването му в контекста на Kubernetes.

Няколко думи за Прометей

За да разберете напълно как работи Локи, важно е да направите крачка назад и да прегледате малко Прометей.

Една от отличителните характеристики на Prometheus е извличането на показатели от точки за събиране (чрез износители) и съхраняването им в TSDB (база данни за времеви редове, база данни за времеви редове) с добавяне на метаданни под формата на етикети.

Защо е необходимо

Наскоро Prometheus се превърна в де факто стандарт в света на контейнерите и Kubernetes: инсталирането му е много просто и Kubernetes клъстер първоначално има крайна точка за Prometheus. Prometheus може също така да извлича показатели от приложения, разположени в контейнер, като същевременно поддържа специфични етикети. Следователно мониторингът на приложенията е много лесен за изпълнение.

За съжаление, все още няма готово решение за управление на регистрационни файлове и вие трябва да намерите решение за себе си:

  • управлявана облачна услуга за централизиране на регистрационни файлове (AWS, Azure или Google)
  • услуга за мониторинг "мониторинг като услуга" (например Datadog)
  • създаване на ваша собствена услуга за събиране на регистрационни файлове.

За третия вариант традиционно използвах Elasticsearch, въпреки факта, че не винаги бях доволен от него (особено неговата тежест и сложност на настройка).

Loki е проектиран да бъде лесен за изпълнение съгласно следните принципи:

  • да бъде лесен за стартиране
  • консумират малко ресурси
  • работят самостоятелно без специална поддръжка
  • служат като добавка към Prometheus, за да помогнат при разследване на грешки

Тази простота обаче идва за сметка на някои компромиси. Една от тях е да не се индексира съдържанието. Следователно търсенето на текст не е много ефективно или богато и не ви позволява да поддържате статистика за съдържанието на текста. Но тъй като Локи иска да бъде еквивалентът на grep и допълнение към Prometheus, това не е недостатък.

Разследване на инцидента

За да разберем по-добре защо Loki не се нуждае от индексиране, нека се върнем към метода за разследване на инциденти, използван от разработчиците на Loki:

Локи - събиране на трупи, използвайки подхода на Прометей
1 Предупреждение → 2 Табло → 3 Adhoc заявка → 4 Агрегиране на регистрационни файлове → 5 Разпределено проследяване → 6 Поправка!
(1 Предупреждение → 2 Табло → 3 Adhoc заявка → 4 Агрегиране на регистрационни файлове → 5 Разпределено проследяване → 6 Поправка!)

Идеята е да получим някакъв вид предупреждение (Slack Notification, SMS и т.н.) и след това:

  • погледнете таблата за управление на Grafana
  • погледнете показателите за обслужване (например в Prometheus)
  • прегледайте записите в регистрационния файл (например в Elasticsearch)
  • може би погледнете разпределените следи (Jaeger, Zipkin и т.н.)
  • и най-накрая да коригира първоначалния проблем.

Тук, в случая на стека Grafana + Prometheus + Elasticsearch + Zipkin, ще трябва да използвате четири различни инструмента. За да спестите време, би било хубаво да можете да правите всички тези стъпки с един инструмент: Grafana. Струва си да се отбележи, че този подход за изследване е приложен в Grafana от версия 6. По този начин става възможен достъп до данните на Prometheus директно от Grafana.

Локи - събиране на трупи, използвайки подхода на Прометей
Екранът на Explorer е разделен между Prometheus и Loki

От този екран можете да видите регистрационни файлове на Loki, свързани с показателите на Prometheus, като използвате концепцията за разделен екран. От версия 6.5 Grafana ви позволява да анализирате идентификатора на проследяване в записите в дневника на Loki, за да следвате връзките към любимите си разпределени инструменти за проследяване (Jaeger).

Локален тест на Локи

Най-лесният начин да тествате Loki локално е да използвате docker-compose. Docker-compose файлът се намира в хранилището на Loki. Можете да получите хранилището, като използвате следната команда git:

$ git clone https://github.com/grafana/loki.git

След това трябва да преминете към производствената директория:

$ cd production

След това можете да получите най-новите Docker изображения:

$ docker-compose pull

И накрая, стекът на Loki се стартира със следната команда:

$ docker-compose up

Архитектура на Локи

Ето малка диаграма с архитектурата на Loki:

Локи - събиране на трупи, използвайки подхода на Прометей
Архитектурни принципи на Локи

Уеб клиентът изпълнява приложения на сървъра, Promtail събира регистрационни файлове и ги изпраща на Loki, уеб клиентът също изпраща метаданни на Loki. Локи събира всичко и го предава на Графана.
Локи бяга. За да видите наличните компоненти, изпълнете следната команда:

$ docker ps

В случай на прясно инсталиран Docker, командата трябва да върне следния резултат:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Виждаме следните компоненти:

  • Promtail: агент, отговорен за централизиране на регистрационни файлове
  • Grafana: известният инструмент за табло
  • Локи: демон за централизация на данни

Като част от класическа инфраструктура (например базирана на виртуални машини), агентът Promtail трябва да бъде внедрен на всяка машина. Grafana и Loki могат да бъдат инсталирани на една и съща машина.

Внедряване в Kubernetes

Инсталирането на компонентите на Loki в Kubernetes ще бъде както следва:

  • daemonSet за внедряване на агента Promtail на всяка от машините в сървърния клъстер
  • Разгръщане на Локи
  • и последното е внедряването на Grafana.

За щастие, Loki се предлага като пакет Helm, което го прави лесен за внедряване.

Инсталиране чрез Heml

Трябва вече да имате инсталиран Heml. Може да бъде изтеглен от хранилището на GitHub на проекта. Инсталира се чрез извличане на архива, подходящ за вашата архитектура и добавяне на helm $PATH.

Забележка: версия 3.0.0 на Helm беше пусната наскоро. Тъй като има много промени в него, читателят се съветва да изчака малко, преди да го използва..

Добавяне на източник за Helm

Първата стъпка е да добавите хранилището "loki" със следната команда:

$ helm add loki https://grafana.github.io/loki/charts

След това можете да търсите пакети с име „loki“:

$ helm search loki

Резултати:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Тези пакети имат следните характеристики:

  • пакет локи/локи съвпада само със сървъра Loki
  • пакет loki/fluent-bit ви позволява да внедрите DaemonSet с помощта на fluent-bin за събиране на регистрационни файлове вместо Promtail
  • пакет локи/промтейл съдържа агент за събиране на регистрационни файлове
  • пакет локи/локи-стек, ви позволява незабавно да внедрите Loki заедно с Promtail.

Инсталиране на Loki

За да внедрите Loki в Kubernetes, изпълнете следната команда в пространството от имена „мониторинг“:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

За да запазите на диск, добавете опцията --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

Забележка: ако искате да разположите Grafana едновременно, добавете параметъра --set grafana.enabled = true

Когато изпълните тази команда, трябва да получите следния резултат:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Разглеждайки състоянието на подовете в пространството на имената „мониторинг“, можем да видим, че всичко е разгърнато:

$ kubectl -n monitoring get pods -l release=loki

Резултати:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

Всички капсули работят. Сега е време да направите някои тестове!

Свързване с Графана

За да се свържете с Grafana под Kubernetes, трябва да отворите тунел към неговия под. Следва командата за отваряне на порт 3000 за Grafana pod:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Друг важен момент е необходимостта от възстановяване на администраторската парола на Grafana. Паролата се пази в тайна loki-grafana в полето .data.admin-user във формат base64.

За да го възстановите, трябва да изпълните следната команда:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

Използвайте тази парола заедно с администраторския акаунт по подразбиране (admin).

Дефиниция на източник на данни Loki в Grafana

Първо се уверете, че източникът на данни Loki (Configuration / Datasource) е създаден.
Ето един пример:

Локи - събиране на трупи, използвайки подхода на Прометей
Пример за настройка на източник на данни за Loki

Като щракнете върху „Тест“, можете да тествате връзката с Loki.

Отправяне на молби към Локи

Сега отидете на Графана в секцията „Изследване“. Когато получава регистрационни файлове от контейнери, Loki добавя метаданни от Kubernetes. По този начин става възможно да се видят регистрационните файлове на конкретен контейнер.

Например, за да изберете регистрационни файлове на контейнера promtail, можете да използвате следната заявка: {container_name = "promtail"}.
Тук също не забравяйте да изберете източника на данни Loki.

Тази заявка ще върне дейността на контейнера, както следва:

Локи - събиране на трупи, използвайки подхода на Прометей
Резултат от заявка в Grafana

Добавяне към таблото за управление

Започвайки с Grafana 6.4, е възможно да поставите информация за регистрационни файлове директно на таблото за управление. След това потребителят ще може бързо да превключва между броя на заявките на неговия сайт и следите на приложението.

По-долу е дадено примерно табло за управление, което прилага това взаимодействие:

Локи - събиране на трупи, използвайки подхода на Прометей
Примерно табло за управление с показатели на Prometheus и регистрационни файлове на Loki

Бъдещето на Локи

Започнах да използвам Loki през май/юни с версия 0.1. Днес версия 1 и дори 1.1 и 1.2 вече са пуснати.

Трябва да се признае, че версия 0.1 не беше достатъчно стабилна. Но 0.3 вече показа реални признаци на зрялост и следващите версии (0.4, след това 1.0) само засилиха това впечатление.

След 1.0.0 никой не може да има извинение да не използва този прекрасен инструмент.

По-нататъшните подобрения не трябва да са свързани с Loki, а по-скоро с неговата интеграция с отличната Grafana. Всъщност Grafana 6.4 вече има добра интеграция с таблата за управление.

Grafana 6.5, която беше пусната наскоро, допълнително подобрява тази интеграция чрез автоматично разпознаване на съдържанието на регистрационни файлове във формат JSON.

Видеото по-долу показва малък пример за този механизъм:

Локи - събиране на трупи, използвайки подхода на Прометей
Използване на низове на Loki, изобразени в Grafana

Става възможно да се използва едно от JSON полетата, например за:

  • връзки към външен инструмент
  • филтриране на съдържанието на журнала

Например, можете да щракнете върху traceId, за да отидете до Zipkin или Jaeger.

Както обикновено, очакваме вашите коментари и ви каним отворен уебинар, където ще говорим за развитието на DevOps индустрията през 2019 г. и ще обсъдим възможните пътища за развитие за 2020 г.

Източник: www.habr.com