Grafana Loki Kurulumu
Loki Nedir ve Neden Kullanmalıyız?
Grafana Loki, Prometheus'un aynı prensiplerine dayanan bir log agregasyon sistemidir. Geleneksel EFK (Elasticsearch, Fluentd, Kibana) stack'inin aksine, tam metin indeksleme yapmak yerine sadece etiketleri (labels) indeksler. Bu yaklaşım, log depolama maliyetlerini önemli ölçüde düşürür ve Loki'yi büyük ölçekli Kubernetes ortamları için ideal kılar.
Loki'nin temel avantajları şunlardır: düşük kaynak tüketimi, minimum indeksleme overhead'i, Grafana ile native entegrasyon, basit kurulum ve yatay ölçeklenebilirlik. Özellikle zaten Prometheus ve Grafana kullanan ekipler için Loki, mevcut altyapıya minimal ek yük getirir.
Geleneksel EFK stack'i ile karşılaştırıldığında, Loki'nin depolama maliyetleri önemli ölçüde düşüktür çünkü tam indeksleme yapmaz. LogQL sorgu dili, Prometheus'un PromQL'ine benzer syntax kullanır, bu da Prometheus kullanan ekipler için öğrenme eğrisini azaltır. Kurulum, Helm chart'lar ile dakikalar içinde tamamlanabilir.
Loki Mimarisi ve Deployment Modları
Loki, farklı kullanım senaryoları için üç deployment modu sunar. Monolithic mod, küçük ve orta ölçekli deployment'lar için önerilir. Tüm Loki bileşenleri tek bir process içinde çalışır ve basit kurulum gerektirir. Bu mod, 100 GB/gün altında log hacmi için idealdir.
Microservice mod, yüksek kullanılabilirlik ve ölçeklenebilirlik gerektiren production workload'ları için tasarlanmıştır. Loki bu modda Grafana Labs içinde de kullanılmaktadır. Bileşenler (distributor, ingester, querier, frontend) ayrı deployment'lar olarak çalışır ve bağımsız olarak ölçeklenebilir.
Simple Scalable Deployment (SSD) mod, monolithic ve microservice arasında bir geçiş noktası sunar. Ancak bu mod deprecated olmuştur ve production için microservice modu önerilmektedir.
Temel Loki bileşenleri şunlardır: Distributor, gelen log stream'leri alır ve ingester'lara yönlendirir. Ingester, logları alır ve chunk'lar halinde depolar, ayrıca sorgu sırasında log birleştirme işlemi yapar. Querier, sorguları işler ve hem ingester'lardan hem de object storage'dan sonuçları alır. Index Gateway, label indeksini yönetir.
Kubernetes'e Helm ile Kurulum
Loki'yi Kubernetes'e kurulmanın en kolay yolu Helm chart'ları kullanmaktır. İlk olarak Grafana Helm repository'sini ekleyin ve chart'ları güncelleyin:
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
Monolithic modda Loki kurulumu için temel komut şu şekildedir:
helm install loki grafana/loki \
--namespace monitoring \
--create-namespace \
--set persistence.enabled=true \
--set persistence.size=10Gi
Production ortamları için microservice mod önerilir. Bu modda kurulum:
helm install loki grafana/loki \
--namespace monitoring \
--create-namespace \
--set mode=microservices \
--set persistence.enabled=true \
--set loki.storage.type=s3 \
--set loki.storage.bucketnames=loki-data \
--set adminPassword='securepassword123'
Mikroservis modunda, distributor, ingester, querier, query-frontend, index-gateway ve compactor gibi bileşenler ayrı deployment'lar olarak çalışır. Bu yapı, her bileşenin bağımsız olarak ölçeklenmesini sağlar.
Promtail Kurulumu ve Konfigürasyonu
Promtail, Loki'nin log toplayıcı agent'ıdır ve Kubernetes ortamında DaemonSet olarak deploy edilir. Her node'da çalışarak o node'daki container loglarını toplar ve Loki'ye gönderir. Promtail'in en güçlü özelliklerinden biri, Kubernetes API'sini kullanarak pod'ları otomatik keşfetmesidir.
Promtail'i Helm ile kurulum:
helm install promtail grafana/promtail \
--namespace monitoring \
--set config.clients[0].url=http://loki:3100/loki/api/v1/push
Otomatik keşif etkinleştirmek için scrape konfigürasyonu:
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- docker: {}
- labeldrop:
- filename
- stream
relabel_configs:
- source_labels: [__meta_kubernetes_pod_name]
target_label: pod
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_pod_container_name]
target_label: container
Bu konfigürasyon, Kubernetes pod'larından logları otomatik toplar, Docker parsing uygular ve ilgili etiketleri ekler. labeldrop ile gereksiz etiketler temizlenir, böylece indeks boyutu optimize edilir.
Grafana Entegrasyonu
Loki ile birlikte çalışan Grafana kurulumu:
helm install grafana grafana/grafana \
--namespace monitoring \
--set persistence.enabled=true \
--set persistence.size=5Gi \
--set adminPassword='your_secure_password' \
--set service.type=LoadBalancer
Grafana kurulduktan sonra, Loki'yi data source olarak ekleyin. Configuration menüsünden Data Sources seçeneğine gidin, Loki'yi seçin ve URL olarak http://loki:3100 girin. Save & Test ile bağlantıyı doğrulayın.
Artık Explore menüsünden LogQL ile log sorguları yapabilirsiniz. Örneğin, belirli bir namespace'deki tüm logları görmek için:
{namespace="production"}
Hata içeren logları filtrelemek için:
{app="my-app"} |= "error"
Belirli bir süre içindeki log sayısını hesaplamak için:
{namespace="production"} | count_over_time(5m)
LogQL Sorgu Dili
LogQL, Loki'nin sorgu dilidir ve Prometheus'un PromQL'ine benzer. İki tür sorgu vardır: log queries ve metric queries. Log queries, eşleşen log satırlarını döndürür. Metric queries, log verisinden metrikler türetir.
Temel filtre operatörleri: |= literal string eşleşmesi, != literal string eşleşmemesi, |~ regex eşleşmesi, !~ regex eşleşmemesi.
Örnek sorgu:
{namespace="default"} |= "POST" |~ "/api/v[0-9]+/users"
Bu sorgu, default namespace'inde POST isteklerini ve /api/v1/users gibi API endpoint'lerini filtreler.
Label selector'lar sorguların temelini oluşturur. Etiket seçimi ne kadar spesifik olursa, sorgu o kadar hızlı çalışır. Mümkün olduğunca regex yerine literal eşleşme kullanın.
Metric queries ile log verisinden metrikler oluşturulabilir:
sum(count_over_time({app="nginx"}[5m])) by (status)
Bu sorgu, 5 dakikalık pencerede her HTTP status kodunun sayısını döndürür.
Depolama ve Retention Yönetimi
Loki, log verilerini chunk olarak depolar ve farklı storage backend'leri destekler. S3, GCS, Azure Blob Storage veya filesystem backend olarak yapılandırılabilir. Production ortamları için object storage önerilir.
S3 backend konfigürasyonu:
loki:
storage:
type: s3
s3:
endpoint: s3.amazonaws.com
bucketnames: loki-data
region: us-east-1
access_key_id: your_access_key
secret_access_key: your_secret_key
Log retention politikası yapılandırması:
loki:
config:
table_manager:
retention_period: 7d
enable_retention: true
Bu ayar, 7 günden eski logların otomatik olarak silinmesini sağlar. Retention periyodu, storage maliyetleri ve compliance gereksinimleri dengelenerek ayarlanmalıdır.
Güvenlik Konfigürasyonu
Loki, varsayılan olarak herhangi bir kimlik doğrulama mekanizması içermez. Production ortamlarında, yetkisiz erişimi önlemek için bir reverse proxy (nginx, OAuth2 Proxy) kullanılmalıdır.
Basic auth etkinleştirmek için:
auth_enabled: true
server:
http_listen_port: 3100
http_listen_network: 0.0.0.0
auth:
basic_users:
admin: $apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/
Token-based auth için:
auth:
token_auth: true
Grafana entegrasyonu için Loki'ye erişim token ile sağlanabilir. Grafana'da data source eklerken URL yanında Basic auth veya Bearer token kullanılabilir.
Ölçekleme ve Performans
Production ortamlarında Loki'yi ölçeklemek için birkaç strateji uygulanabilir. İlk olarak, yeterli replica sayısı ile çalışın. Ingester ve querier için en az 2-3 replica önerilir.
loki:
distributor:
replicas: 2
ingester:
replicas: 3
querier:
replicas: 2
query-frontend:
replicas: 2
Query parallelism ayarı, karmaşık sorguların performansını artırır:
querier:
max_concurrent: 20
query_ingesters_until: 15m
Ingester'ların bellek kullanımını kontrol etmek için chunk_target_size ve chunk_idle_period ayarlarını optimize edin:
ingester:
chunk_target_size: 1048576
chunk_idle_period: 15m
chunk_block_size: 262144
max_transfer_retries: 10
En İyi Uygulamalar ve İpuçları
Loki ve Promtail kullanırken bazı en iyi uygulamalar performansı ve maliyeti optimize eder. Etiket seçiminde dikkatli olun. Çok fazla etiket, indeks boyutunu artırır ve sorgu performansını düşürür. Sadece gerçekten gerekli olan etiketleri kullanın.
Log hacmine göre doğru deployment modunu seçin. Günlük 100 GB altında log için monolithic mod yeterlidir. Daha yüksek hacimler için microservice mod gerekir.
Sorgularda regex'ten kaçının mümkün olduğunca. Literal string eşleşmeleri çok daha hızlıdır. Regex gerekiyorsa, mümkün olan en spesifik pattern'i kullanın.
Promtail pipeline'larını etkin kullanın. Logları Loki'ye göndermeden önce parsing ve dönüşüm yapın. Bu, sorgu sırasında yapılacak işi azaltır.
Resource limits belirleyin. Loki ve Promtail için memory ve CPU limitleri ayarlayın. Bu, diğer workload'ların etkilenmesini önler.
Monitoring etkinleştirin. Loki, Prometheus formatında metrikler sunar. Bu metrikleri toplayarak Loki'nin sağlığını izleyin:
prometheus:
enabled: true
rules:
enabled: true
Sonuç
Grafana Loki, Kubernetes ortamları için hafif, maliyet etkin ve güçlü bir log yönetimi çözümüdür. Prometheus ve Grafana ile mevcut altyapınıza minimal ek yük getirir. Doğru konfigürasyon ve en iyi uygulamalarla, production ortamlarında güvenilir log izleme sağlayabilirsiniz.
Helm ile kurulum dakikalar içinde tamamlanır. Promtail ile otomatik log toplama başlar. Grafana entegrasyonu ile LogQL ile güçlü sorgular yapabilirsiniz. Ölçekleme seçenekleri, büyüyen altyapınıza uyum sağlar.
EFK/ELK stack'inin karmaşıklığına gerek duymadan, sade ve etkili bir log çözümü arıyorsanız, Loki tam aradığınız araçtır.