Loki - Prometheus yaklaşımını kullanarak günlük toplama

Selam Habrovsk sakinleri! Kursa yeni kayıtların başlamasının arifesinde "DevOps uygulamaları ve araçları" Sizin için ilginç materyallerden oluşan bir çeviri hazırladık.

Bu makale Loki'ye kısa bir giriş niteliğindedir. Loki Projesi Grafana tarafından desteklenmektedir ve günlüklerin (sunuculardan veya kapsayıcılardan) merkezi olarak toplanmasını amaçlamaktadır.

Loki'nin ana ilham kaynağı Prometheus yaklaşımlarını log yönetimine uygulama fikriyle:

  • verileri depolamak için etiketleri kullanma
  • az kaynak tüketimi

Prometheus'un nasıl çalıştığına geri döneceğiz ve Kubernetes bağlamında kullanımına ilişkin bazı örnekler vereceğiz.

Prometheus hakkında birkaç söz

Loki'nin nasıl çalıştığını tam olarak anlamak için bir adım geriye çekilip Prometheus'u biraz hatırlamak önemli.

Prometheus'un ayırt edici özelliklerinden biri, metriklerin toplama noktalarından (ihracatçılar aracılığıyla) çıkarılması ve etiket biçiminde meta verilerin eklenmesiyle bunları TSDB'de (Zaman Serisi Veri Tabanı) saklamasıdır.

Neden bu gereklidir

Son zamanlarda Prometheus, konteynerler ve Kubernetes dünyasında fiili standart haline geldi: Kurulumu çok basit ve Kubernetes kümesi, Prometheus için yerel bir uç noktayla birlikte geliyor. Prometheus ayrıca belirli etiketleri saklarken bir konteynerde konuşlandırılan uygulamalardan da metrikler çıkarabilir. Bu nedenle uygulama izlemenin uygulanması çok kolaydır.

Ne yazık ki, günlük yönetimi için hala anahtar teslim bir çözüm yok ve kendiniz için bir çözüm bulmalısınız:

  • Günlükleri merkezileştirmek için yönetilen bulut hizmeti (AWS, Azure veya Google)
  • izleme hizmeti "hizmet olarak izleme" (örneğin, Datadog)
  • kendi günlük toplama hizmetinizi oluşturma.

Üçüncü seçenek için, her zaman memnun olmasam da (özellikle de konfigürasyonunun ağırlığı ve karmaşıklığı) geleneksel olarak Elasticsearch'ü kullandım.

Loki, aşağıdaki ilkelere göre uygulamayı basitleştirmek için tasarlandı:

  • başlamak basit olsun
  • az kaynak tüketmek
  • herhangi bir özel bakım gerektirmeden bağımsız olarak çalışır
  • Hata araştırmalarına yardımcı olmak için Prometheus'a ek olarak hizmet eder

Ancak bu basitlik bazı tavizlerin pahasına geliyor. Bunlardan biri içeriği indekslememek. Bu nedenle metin araması çok verimli ve zengin değildir ve metnin içeriğine ilişkin istatistiklere izin vermez. Ancak Loki, grep'in eşdeğeri ve Prometheus'un tamamlayıcısı olmak istediğinden bu bir dezavantaj değil.

Olay araştırması

Loki'nin neden indekslenmeye ihtiyacı olmadığını daha iyi anlamak için Loki geliştiricilerinin kullandığı olay inceleme yöntemine geri dönelim:

Loki - Prometheus yaklaşımını kullanarak günlük toplama
1 Uyarı → 2 Kontrol Paneli → 3 Anlık Sorgu → 4 Günlük Toplama → 5 Dağıtılmış İzleme → 6 Düzeltme!
(1 Uyarı → 2 Kontrol Paneli → 3 Anlık Sorgu → 4 Günlük Toplama → 5 Dağıtılmış İzleme → 6 Düzeltme!)

Buradaki fikir, bir tür uyarı almamızdır (Gevşek Bildirim, SMS vb.) ve ardından:

  • Grafana kontrol panellerine bakın
  • hizmet ölçümlerine bakın (örneğin Prometheus'ta)
  • günlük girişlerine bakın (örneğin, Elasticsearch'te)
  • belki dağıtılmış izlere bir göz atabilirsiniz (Jaeger, Zipkin, vb.)
  • ve nihayet orijinal sorunu çözdük.

Burada Grafana + Prometheus + Elasticsearch + Zipkin stack durumunda dört farklı araç kullanmanız gerekecek. Zamanı azaltmak için tüm bu adımları tek bir araç kullanarak gerçekleştirebilmek güzel olurdu: Grafana. Bu araştırma yaklaşımının Grafana'da sürüm 6'dan beri uygulandığını belirtmekte fayda var. Böylece Prometheus verilerine doğrudan Grafana'dan erişmek mümkün hale geliyor.

Loki - Prometheus yaklaşımını kullanarak günlük toplama
Explorer ekranı Prometheus ve Loki arasında bölünmüş

Bu ekrandan Prometheus metrikleriyle ilgili Loki loglarını bölünmüş ekran konseptini kullanarak görüntüleyebilirsiniz. Sürüm 6.5'ten bu yana Grafana, favori dağıtılmış izleme araçlarınıza (Jaeger) olan bağlantıları takip etmek için Loki günlük girişlerindeki izleme kimliğini ayrıştırmanıza olanak tanır.

Yerel Loki testi

Loki'yi yerel olarak test etmenin en kolay yolu docker-compose'u kullanmaktır. Docker-compose dosyası Loki deposunda bulunur. Aşağıdaki komutu kullanarak depoyu alabilirsiniz git:

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

Daha sonra üretim dizinine gitmeniz gerekir:

$ cd production

Bundan sonra Docker görüntülerinin en son sürümünü alabilirsiniz:

$ docker-compose pull

Son olarak Loki yığını aşağıdaki komutla başlatılır:

$ docker-compose up

Loki mimarisi

İşte Loki mimarisine sahip küçük bir şema:

Loki - Prometheus yaklaşımını kullanarak günlük toplama
Loki Mimarlık Prensipleri

Web istemcisi sunucudaki uygulamaları çalıştırır, Promtail günlükleri toplar ve bunları Loki'ye gönderir, web istemcisi ayrıca meta verileri Loki'ye gönderir. Loki her şeyi toplar ve Grafana'ya iletir.
Loki başlatıldı. Mevcut bileşenleri görüntülemek için aşağıdaki komutu çalıştırın:

$ docker ps

Yeni kurulmuş bir Docker durumunda komut aşağıdaki sonucu döndürmelidir:

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

Aşağıdaki bileşenleri görüyoruz:

  • Promtail: günlüklerin merkezileştirilmesinden sorumlu aracı
  • Grafana: ünlü bir kontrol paneli aracı
  • Loki: Veri Merkezileştirme Programı

Klasik bir altyapının parçası olarak (örneğin, sanal makinelere dayalı olarak), Promtail aracısının her makineye dağıtılması gerekir. Grafana ve Loki aynı makineye kurulabilir.

Kubernetes'e Dağıtım

Loki bileşenlerinin Kubernetes'e kurulumu şu şekilde olacaktır:

  • Promtail aracısını sunucu kümesindeki makinelerin her birine dağıtmak için daemonSet
  • Loki'yi Dağıtım
  • ve sonuncusu Grafana'nın konuşlandırılmasıdır.

Neyse ki Loki, Helm paketi olarak mevcut ve bu da dağıtımını kolaylaştırıyor.

Heml aracılığıyla kurulum

Heml'in zaten kurulu olması gerekir. Projenin GitHub deposundan indirilebilir. Mimarinize uygun arşivi açıp dümen ekleyerek kurulur. $PATH.

Not: Helm'in 3.0.0 sürümü yakın zamanda yayınlandı. Üzerinde pek çok değişiklik olduğu için okuyucunun kullanmadan önce biraz beklemesi tavsiye edilir..

Helm için kaynak ekleme

İlk adım, aşağıdaki komutu kullanarak “loki” deposunu eklemektir:

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

Bundan sonra “loki” adlı paketleri arayabilirsiniz:

$ helm search loki

Sonuç:

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...

Bu paketler aşağıdaki özelliklere sahiptir:

  • paket loki/loki yalnızca Loki sunucusuyla eşleşir
  • paket loki/akıcı-bit günlükleri toplamak için Promtail yerine fluent-bin kullanarak bir DaemonSet dağıtmanıza olanak tanır
  • paket loki/promtail bir günlük dosyası toplama aracısı içerir
  • paket loki/loki yığınıLoki'yi Promtail ile birlikte anında dağıtmanıza olanak tanır.

Loki'yi yükleme

Loki'yi Kubernetes'e dağıtmak için "monitoring" ad alanında aşağıdaki komutu çalıştırın:

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

Diske kaydetmek için parametreyi ekleyin --set loki.persistence.enabled = true:

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

Not: Grafana'yı aynı anda dağıtmak istiyorsanız parametreyi ekleyin --set grafana.enabled = true

Bu komutu çalıştırdığınızda aşağıdaki çıktıyı almalısınız:

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.

"İzleme" ad alanındaki bölmelerin durumuna baktığımızda her şeyin konuşlandırıldığını görebiliriz:

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

Sonuç:

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

Tüm bölmeler çalışıyor. Şimdi bazı testler yapmanın zamanı geldi!

Grafana'ya bağlanma

Grafana'ya Kubernetes altında bağlanmak için bölmesine bir tünel açmanız gerekir. Aşağıda Grafana bölmesi için 3000 numaralı bağlantı noktasını açma komutu verilmiştir:

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

Bir diğer önemli nokta ise Grafana yönetici şifresinin kurtarılması gerekliliğidir. Şifre gizli tutulur loki-grafana alanında .data.admin-user base64 formatında.

Geri yüklemek için aşağıdaki komutu çalıştırmanız gerekir:

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

Bu parolayı varsayılan yönetici hesabıyla (yönetici) birlikte kullanın.

Grafana'da Loki veri kaynağı tanımlama

Öncelikle Loki veri kaynağının oluşturulduğundan emin olun (Yapılandırma/Veri Kaynağı).
İşte bir örnek:

Loki - Prometheus yaklaşımını kullanarak günlük toplama
Loki için veri kaynağı ayarlama örneği

“Test” seçeneğine tıklayarak Loki ile bağlantıyı kontrol edebilirsiniz.

Loki'ye istekte bulunmak

Şimdi Grafana'nın “Keşfet” bölümüne gidin. Loki, konteynerlerden günlük alırken Kubernetes'ten meta veriler ekler. Böylece belirli bir konteynerin loglarını görüntülemek mümkün hale geliyor.

Örneğin, promtail kapsayıcı günlüklerini seçmek için aşağıdaki sorguyu kullanabilirsiniz: {container_name = "promtail"}.
Burada ayrıca Loki veri kaynağını seçmeyi unutmayın.

Bu sorgu konteyner etkinliğini aşağıdaki gibi döndürecektir:

Loki - Prometheus yaklaşımını kullanarak günlük toplama
Grafana'da sorgu sonucu

Kontrol paneline ekle

Grafana 6.4'ten itibaren günlük bilgilerini doğrudan kontrol paneline yerleştirebilirsiniz. Bundan sonra kullanıcı, sitesindeki istek sayısı ile uygulama izleri arasında hızlı bir şekilde geçiş yapabilecektir.

Aşağıda bu etkileşimi uygulayan bir kontrol paneli örneği verilmiştir:

Loki - Prometheus yaklaşımını kullanarak günlük toplama
Prometheus metrikleri ve Loki günlüklerini içeren örnek kontrol paneli

Loki'nin Geleceği

Loki'yi Mayıs/Haziran aylarında 0.1 sürümüyle kullanmaya başladım. Bugün sürüm 1 ve hatta 1.1 ve 1.2 zaten yayınlandı.

0.1 sürümünün yeterince kararlı olmadığını kabul etmek gerekir. Ancak 0.3 zaten gerçek olgunluk belirtileri gösterdi ve sonraki sürümler (0.4, ardından 1.0) yalnızca bu izlenimi güçlendirdi.

1.0.0'dan sonra hiç kimsenin bu harika aracı kullanmamak için hiçbir mazereti olamaz.

Daha fazla iyileştirme Loki ile ilgili değil, mükemmel Grafana ile entegrasyonuyla ilgili olmalıdır. Aslında Grafana 6.4'ün gösterge tablolarıyla zaten iyi bir entegrasyonu var.

Yakın zamanda piyasaya sürülen Grafana 6.5, JSON formatındaki günlük içeriklerini otomatik olarak tanıyarak bu entegrasyonu daha da geliştiriyor.

Aşağıdaki video bu mekanizmanın küçük bir örneğini göstermektedir:

Loki - Prometheus yaklaşımını kullanarak günlük toplama
Grafana'da gösterilen Loki dizelerini kullanma

JSON alanlarından birini kullanmak mümkün hale gelir, örneğin:

  • harici araca bağlantılar
  • günlük içeriğini filtreleme

Örneğin, Zipkin veya Jaeger'e gitmek için traceId'ye tıklayabilirsiniz.

Her zamanki gibi yorumlarınızı sabırsızlıkla bekliyor ve sizi davet ediyoruz. web seminerini açDevOps sektörünün 2019 yılında nasıl geliştiğini konuşacağımız ve 2020 için olası gelişim yollarını tartışacağımız yer.

Kaynak: habr.com