Здравейте, хабровчани! В навечерието на новия набор за курс подготвихме за вас превод на интересен материал.
Тази статия е кратко въведение в Loki. Проектът Loki и е насочен към централизирано събиране на логове (от сървъри или контейнери).
Основният източник на вдъхновение за Loki е идеята да се прилагат неговите подходи в управлението на логовете:
- използване на етикети (labels) за съхранение на данни
- консумация на малко ресурси
Ще се върнем към принципите на работа на Prometheus и ще приведем няколко примера за неговото използване в контекста на Kubernetes.
Няколко думи за Prometheus
За да разберем напълно как функционира Loki, е важно да направим крачка назад и да си припомним малко за Prometheus.
Една от отличителните характеристики на Prometheus е извличането на метрики от точки за събиране (чрез експортери) и съхранението им в TSDB (база данни за времеви серии) с добавяне на метаданни под формата на етикети.
Защо е необходимо
В последно време Prometheus стана де факто стандарт в света на контейнерите и Kubernetes: инсталацията му е много проста, а в кластера Kubernetes по подразбиране присъства крайна точка за Prometheus. Prometheus също може да извлича метрики от приложения, разположени в контейнер, докато запазва определени етикети. Поради това мониторингът на приложения е много лесен за реализиране.
За съжаление, все още няма „готово“ решение за управление на логовете, и трябва да намерите решение за себе си:
- управляван облачен сервиз за централизиране на логовете (AWS, Azure или Google)
- сервис за мониторинг „мониторинг като услуга“ (monitoring as a service) (например, Datadog)
- създаване на свой собствен сервиз за събиране на логове.
За третия вариант аз традиционно използвах Elasticsearch, въпреки че не винаги бях доволен от него (особено от тежестта и сложността на настройката).
Loki беше проектиран с цел опростяване на реализацията в съответствие с следните принципи:
- да бъде лесен за стартиране
- да консумира малко ресурси
- да работи самостоятелно без никакво специално обслужване
- да служи като допълнение на Prometheus, за да помогне при разследването на проблеми
Тази простота обаче идва с някои компромиси. Един от тях е, че съдържанието не се индексира. Заради това търсенето по текста не е особено ефективно или богато и не позволява статистика на текстовото съдържание. Но тъй като Loki иска да бъде еквивалент на grep и допълнение към Prometheus, това не е недостатък.
Разследване на инциденти
За да разберем по-добре защо на Loki не му е нужна индексация, да се върнем към метода за разследване на инциденти, използван от разработчиците на Loki:

1 Аларма → 2 Табло → 3 Adhoc Запитване → 4 Агрегация на логове → 5 Разпределено проследяване → 6 Поправка!
(1 Аларма → 2 Табло → 3 Adhoc Запитване → 4 Агрегация на логове → 5 Разпределено проследяване → 6 Поправка!)
Идеята е, че получаваме някаква аларма (Slack известие, SMS и т.н.) и след това:
- гледаме таблата на Grafana
- гледаме метриките на услугите (например в Prometheus)
- гледаме записите на логовете (например в Elasticsearch)
- може би ще погледнем разпределените трасета (Jaeger, Zipkin и др.)
- и накрая, поправяме основния проблем.
Тук, в случая на стека Grafana + Prometheus + Elasticsearch + Zipkin, ще трябва да използваме четири различни инструмента. За да съкратим времето, би било добре да можем да извършваме всичките тези етапи с един инструмент: Grafana. Струва си да се спомене, че такъв подход за разследване е реализиран в Grafana от версия 6. По този начин става възможно да се обръщаме директно към данните на Prometheus от Grafana.

Екранът Explorer е разделен между Prometheus и Loki
На този екран можете да гледате логовете в Loki, свързани с метриките на Prometheus, като използвате концепцията за разделен екран. От версия 6.5, Grafana позволява обработка на идентификатора на трасетата (trace id) в записите на логовете на Loki за преминаване към вашите любими инструменти за разпределено проследяване (Jaeger).
Локално тестване на Loki
Най-лесният начин за локално тестване на Loki е да използвате docker-compose. Файлът docker-compose се намира в репозитория на Loki. Можете да получите репозитория с помощта на следната команда git:
$ git clone https://github.com/grafana/loki.gitСлед това трябва да влезете в каталога production:
$ cd productionСлед това можете да получите последната версия на Docker образите:
$ docker-compose pullНакрая, стекът на Loki се стартира с командата:
$ docker-compose upАрхитектура на Loki
Ето малка диаграма с архитектурата на Loki:

Принципи на архитектурата на Loki
Уеб клиент стартира приложения на сървъра, Promtail събира логовете и ги изпраща в Loki, уеб клиентът също праща метаданни в Loki. Loki всичко агрегира и предава в Grafana.
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: известен инструмент за табла
- Loki: демон за централизация на данни
В рамките на класическата инфраструктура (например, на база виртуални машини) на всяка машина трябва да бъде разположен агент Promtail. Grafana и Loki могат да бъдат инсталирани на една машина.
Разгръщане в Kubernetes
Инсталацията на компонентите Loki в Kubernetes ще включва следното:
- daemonSet за разполагане на агента Promtail на всяка от машините в клъстера от сървъри
- разгръщане (Deployment) на Loki
- и накрая — разгръщане на 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: като Prometheus, но за логове.
loki/loki-stack 0.19.1 v0.4.0 Loki: като Prometheus, но за логове.
loki/fluent-bit 0.0.2 v0.0.1 Използва fluent-bit Loki go плъгин за...
loki/promtail 0.13.1 v0.4.0 Отговаря за събиране на логовете и...Тези пакети имат следните функции:
- пакета loki/loki съответства само на сървъра Loki
- пакета loki/fluent-bit позволява ви да разгръщате DaemonSet, използвайки fluent-bin за събиране на логове вместо Promtail
- пакета loki/promtail съдържа агент за събиране на лог-файлове
- пакета loki/loki-stack, позволява веднага разгръщане на Loki заедно с Promtail.
Инсталация на Loki
За да разположите Loki в Kubernetes, изпълнете следната команда в пространство от имена “monitoring”:
$ 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
Когато стартирате тази команда, трябва да получите следния изход:
ПОСЛЕДНО РАЗГЪНАТО: Вт. 19 Ноем. 2019 15:56:54
ИМАТЕЛ: мониторинг
СТАТУС: РАЗГЪНАТО
РЕСУРСИ:
==> v1/ClusterRole
ИМЕ ВЪЗРАСТ
loki-promtail-clusterrole 189d
…
ЗАБЕЛЕЖКИ:
Стекът Локи е разгънат в кластера ви. Локи може да бъде добавен като източник на данни в Grafana.
Вижте <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> за повече подробности.Ако погледнем състоянието на подовете в пространството с имена "monitoring", ще видим, че всичко е инсталирано:
$ 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
За да се свържете с Grafana в Kubernetes, трябва да отворите тунел към неговия под. По-долу е командата за отваряне на порт 3000 за пода на Grafana:
$ 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
Като натиснете "Test", можете да проверите свързаността с Loki.
Изпращане на заявки към Loki
Сега преминете в Grafana в раздела "Explore". При получаване на логове от контейнерите, Loki добавя метаданни от Kubernetes. Така става възможно да се преглеждат логовете на определен контейнер.
Например, за избор на логовете на контейнера promtail, можете да използвате следната заявка: {container_name = "promtail"}.
Не забравяйте също да изберете източника на данни Loki.
Тази заявка ще върне активността на контейнерите в следния вид:

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

Пример на таблото с метрики Prometheus и логове Loki
Бъдещето на 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 г.
Източник: habr.com
