Salutujcie, mieszkańcy Chabrowska! W przeddzień rozpoczęcia nowych zapisów na kurs
Ten artykuł jest krótkim wprowadzeniem do Lokiego. Projekt Loki
Główną inspiracją dla Lokiego było
- używanie etykiet do przechowywania danych
- zużycie niewielkiej ilości zasobów
Powrócimy do działania Prometheusa i podamy kilka przykładów jego użycia w kontekście Kubernetesa.
Kilka słów o Prometeuszu
Aby w pełni zrozumieć, jak działa Loki, ważne jest, aby cofnąć się o krok i przypomnieć sobie trochę o Prometeuszu.
Jedną z charakterystycznych cech Prometheusa jest ekstrakcja metryk z punktów poboru (za pośrednictwem eksporterów) i przechowywanie ich w TSDB (Baza Danych Szeregów Czasowych) z dodatkiem metadanych w postaci etykiet.
Dlaczego tego potrzebujesz
Ostatnio Prometheus stał się de facto standardem w świecie kontenerów i Kubernetesa: jego instalacja jest bardzo prosta, a klaster Kubernetes posiada natywny punkt końcowy dla Prometheusa. Prometheus może także wyodrębniać metryki z aplikacji wdrożonych w kontenerze, przechowując jednocześnie określone etykiety. Dlatego monitorowanie aplikacji jest bardzo łatwe do wdrożenia.
Niestety nadal nie ma gotowego rozwiązania do zarządzania logami i musisz znaleźć rozwiązanie dla siebie:
- zarządzana usługa chmurowa do centralizacji logów (AWS, Azure lub Google)
- usługa monitorowania „monitorowanie jako usługa” (na przykład Datadog)
- utworzenie własnej usługi gromadzenia logów.
W przypadku trzeciej opcji tradycyjnie korzystałem z Elasticsearch, mimo że nie zawsze byłem z niego zadowolony (zwłaszcza jego ciężkość i złożoność konfiguracji).
Loki został zaprojektowany tak, aby uprościć wdrożenie zgodnie z następującymi zasadami:
- być proste na początek
- zużywają niewiele zasobów
- pracować niezależnie, bez specjalnej konserwacji
- służyć jako dodatek do Prometheusa, aby pomóc w badaniu błędów
Prostota ta odbywa się jednak kosztem pewnych kompromisów. Jednym z nich jest brak indeksowania treści. Dlatego wyszukiwanie tekstu nie jest zbyt wydajne ani bogate i nie pozwala na prowadzenie statystyk dotyczących zawartości tekstu. Ale skoro Loki chce być odpowiednikiem grepa i uzupełnieniem Prometeusza, nie jest to wada.
Śledztwo w sprawie wypadku
Aby lepiej zrozumieć, dlaczego Loki nie potrzebuje indeksowania, wróćmy do metody badania incydentów, którą zastosowali twórcy Lokiego:
1 Alert → 2 Panel → 3 Zapytanie Adhoc → 4 Agregacja logów → 5 Rozproszone śledzenie → 6 Napraw!
(1 Ostrzeżenie → 2 Pulpit nawigacyjny → 3 Zapytanie Adhoc → 4 Agregacja logów → 5 Rozproszone śledzenie → 6 Naprawianie!)
Pomysł jest taki, że otrzymujemy pewnego rodzaju alert (powiadomienie o Slacku, SMS itp.), a następnie:
- spójrz na dashboardy Grafana
- spójrz na metryki usług (na przykład w Prometheusie)
- spójrz na wpisy w dzienniku (na przykład w Elasticsearch)
- może spójrz na rozproszone ślady (Jaeger, Zipkin itp.)
- i wreszcie naprawienie pierwotnego problemu.
Tutaj w przypadku stosu Grafana + Prometheus + Elasticsearch + Zipkin będziesz musiał skorzystać z czterech różnych narzędzi. Aby skrócić czas, dobrze byłoby móc wykonać wszystkie te kroki za pomocą jednego narzędzia: Grafany. Warto zaznaczyć, że takie podejście do badań zostało zaimplementowane w Grafanie od wersji 6. Tym samym możliwy staje się dostęp do danych Prometheusa bezpośrednio z Grafany.
Ekran Eksploratora podzielony pomiędzy Prometeusza i Lokiego
Na tym ekranie możesz przeglądać logi Lokiego powiązane z metrykami Prometheusa, korzystając z koncepcji podzielonego ekranu. Od wersji 6.5 Grafana umożliwia analizowanie identyfikatora śledzenia we wpisach dziennika Lokiego w celu podążania za łączami do ulubionych narzędzi do śledzenia rozproszonego (Jaeger).
Lokalny test Lokiego
Najłatwiejszym sposobem lokalnego przetestowania Lokiego jest użycie funkcji docker-compose. Plik docker-compose znajduje się w repozytorium Loki. Możesz pobrać repozytorium za pomocą następującego polecenia git
:
$ git clone https://github.com/grafana/loki.git
Następnie musisz przejść do katalogu produkcyjnego:
$ cd production
Następnie możesz uzyskać najnowszą wersję obrazów Docker:
$ docker-compose pull
Na koniec stos Loki jest uruchamiany za pomocą następującego polecenia:
$ docker-compose up
Architektura Lokiego
Oto mały diagram z architekturą Lokiego:
Zasady architektury Lokiego
Klient WWW uruchamia aplikacje na serwerze, Promtail zbiera logi i wysyła je do Lokiego, klient WWW wysyła także metadane do Lokiego. Loki agreguje wszystko i przekazuje Grafanie.
Loki zostaje uruchomiony. Aby wyświetlić dostępne komponenty, uruchom następującą komendę:
$ docker ps
W przypadku świeżo zainstalowanego Dockera polecenie powinno zwrócić następujący wynik:
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
Widzimy następujące komponenty:
- Promtail: agent odpowiedzialny za centralizację logów
- Grafana: słynne narzędzie do pulpitu nawigacyjnego
- Loki: Demon centralizacji danych
W ramach klasycznej infrastruktury (np. opartej na maszynach wirtualnych) na każdej maszynie musi być wdrożony agent Promtail. Grafana i Loki mogą być zainstalowane na tej samej maszynie.
Wdrożenie na Kubernetesie
Instalacja komponentów Loki na Kubernetesie będzie następująca:
- daemonSet do wdrażania agenta Promtail na każdym komputerze w klastrze serwerów
- Wdrożenie Lokiego
- a ostatnim jest wdrożenie Grafany.
Na szczęście Loki jest dostępny jako pakiet Helm, co ułatwia jego wdrożenie.
Instalacja przez Heml
Powinieneś już mieć zainstalowany Heml. Można go pobrać z repozytorium projektu GitHub. Instaluje się go poprzez rozpakowanie archiwum odpowiadającego Twojej architekturze i dodanie do niego steru $PATH
.
Uwaga: Niedawno wydano wersję 3.0.0 Helma. Ponieważ wprowadzono w nim wiele zmian, zaleca się czytelnikowi chwilę poczekać przed jego użyciem..
Dodanie źródła Helma
Pierwszym krokiem jest dodanie repozytorium „loki” za pomocą następującego polecenia:
$ helm add loki https://grafana.github.io/loki/charts
Następnie możesz wyszukać pakiety o nazwie „loki”:
$ helm search loki
Wynik:
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...
Pakiety te mają następujące funkcje:
- pakiet Loki/Loki pasuje tylko do serwera Lokiego
- pakiet loki/fluent-bit umożliwia wdrożenie DaemonSet przy użyciu Fluent-bin do zbierania dzienników zamiast Promtail
- pakiet Loki/Protail zawiera agenta zbierającego pliki dziennika
- pakiet loki/loki-stack, pozwala na natychmiastowe wdrożenie Lokiego wraz z Promtail.
Instalowanie Lokiego
Aby wdrożyć Lokiego w Kubernetes, uruchom następującą komendę w przestrzeni nazw „monitorowanie”:
$ helm upgrade --install loki loki/loki-stack --namespace monitoring
Aby zapisać na dysku, dodaj parametr --set loki.persistence.enabled = true:
$ helm upgrade --install loki loki/loki-stack
--namespace monitoring
--set loki.persistence.enabled=true
Uwaga: jeśli chcesz jednocześnie wdrożyć Grafanę, dodaj parametr
--set grafana.enabled = true
Po uruchomieniu tego polecenia powinieneś otrzymać następujące dane wyjściowe:
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.
Patrząc na stan podów w przestrzeni nazw „monitorowanie”, widzimy, że wszystko jest wdrożone:
$ kubectl -n monitoring get pods -l release=loki
Wynik:
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
Wszystkie kapsuły działają. Teraz czas na kilka testów!
Łączenie z Grafaną
Aby połączyć się z Grafaną pod Kubernetesem, musisz otworzyć tunel do jej kapsuły. Poniżej znajduje się polecenie otwarcia portu 3000 dla kapsuły Grafana:
$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80
Kolejnym ważnym punktem jest konieczność odzyskania hasła administratora Grafana. Hasło jest utrzymywane w tajemnicy loki-grafana
w terenie .data.admin-user
w formacie base64.
Aby go przywrócić, musisz uruchomić następujące polecenie:
$ kubectl -n monitoring get secret loki-grafana
--template '{{index .data "admin-password" | base64decode}}'; echo
Użyj tego hasła w połączeniu z domyślnym kontem administratora (admin).
Definiowanie źródła danych Lokiego w Grafanie
Przede wszystkim upewnij się, że zostało utworzone źródło danych Loki (Konfiguracja/Źródło danych).
Oto przykład:
Przykład konfiguracji źródła danych dla Lokiego
Klikając „Testuj” możesz sprawdzić połączenie z Lokim.
Wysyłanie próśb do Lokiego
Teraz przejdź do Grafany, do sekcji „Eksploruj”. Odbierając logi z kontenerów, Loki dodaje metadane z Kubernetes. Dzięki temu możliwe staje się przeglądanie logów konkretnego kontenera.
Na przykład, aby wybrać dzienniki kontenera Promtail, możesz użyć następującego zapytania: {container_name = "promtail"}
.
Tutaj również pamiętaj o wybraniu źródła danych Loki.
To zapytanie zwróci aktywność kontenera w następujący sposób:
Wynik zapytania w Grafanie
Dodaj do panelu
Począwszy od Grafany 6.4, możesz umieszczać informacje z logów bezpośrednio na pulpicie nawigacyjnym. Następnie użytkownik będzie mógł szybko przełączać się pomiędzy liczbą żądań na swojej stronie a śladami aplikacji.
Poniżej znajduje się przykład dashboardu, który implementuje tę interakcję:
Przykładowy pulpit nawigacyjny z metrykami Prometheus i dziennikami Lokiego
Przyszłość Lokiego
Zacząłem używać Lokiego w maju/czerwcu z wersją 0.1. Dziś ukazała się już wersja 1, a nawet 1.1 i 1.2.
Trzeba przyznać, że wersja 0.1 nie była wystarczająco stabilna. Jednak 0.3 wykazywał już prawdziwe oznaki dojrzałości, a kolejne wersje (0.4, potem 1.0) tylko potęgowały to wrażenie.
Po wersji 1.0.0 nikt nie będzie miał wymówki, aby nie używać tego wspaniałego narzędzia.
Dalsze ulepszenia nie powinny dotyczyć Lokiego, ale raczej jego integracji ze znakomitą Grafaną. Tak naprawdę Grafana 6.4 ma już dobrą integrację z dashboardami.
Niedawno wydana Grafana 6.5 jeszcze bardziej usprawnia tę integrację, automatycznie rozpoznając zawartość dziennika w formacie JSON.
Poniższy film pokazuje mały przykład tego mechanizmu:
Używanie strun Lokiego ujawnionych w Grafanie
Możliwe staje się wykorzystanie jednego z pól JSON np. do:
- linki do narzędzia zewnętrznego
- filtrowanie zawartości dziennika
Na przykład możesz kliknąć traceId, aby przejść do Zipkin lub Jaeger.
Tradycyjnie czekamy na Wasze uwagi i zapraszamy
Źródło: www.habr.com