Kibana Kurulumu ve Dashboard Oluşturma

Elasticsearch kurulumunu tamamladıktan sonra sıradaki adım genellikle Kibana’yı devreye almaktır. Kibana, Elasticsearch üzerindeki verilerinizi görselleştirmenizi, sorgulamanızı ve anlamlı dashboardlar oluşturmanızı sağlayan web tabanlı bir arayüzdür. Log analizi yapıyorsanız, metrik izliyorsanız ya da güvenlik olaylarını takip ediyorsanız Kibana olmadan bu işlerin büyük bir kısmını terminal üzerinden ham JSON çıktılarıyla yapmak zorunda kalırsınız ki bu hiç eğlenceli değildir.

Bu yazıda Ubuntu 22.04 üzerinde Kibana 8.x kurulumunu sıfırdan yapacağız, temel yapılandırmayı ele alacağız ve gerçek dünyada kullanacağınız bir dashboard oluşturacağız. Logstash veya Filebeat ile veri akışı kuruyorsanız bu yazı iyi bir başlangıç noktası olacaktır.

Ön Gereksinimler

Kibana kurmadan önce birkaç şeyin hazır olması gerekiyor. Elasticsearch 8.x zaten çalışıyor olmalı. Kibana, Elasticsearch ile aynı major versiyon üzerinde çalışmak zorundadır; 7.x Kibana ile 8.x Elasticsearch’ü birleştirmeye çalışmayın, başınız ağrır.

Sistem gereksinimleri şu şekilde:

  • RAM: Minimum 2 GB, üretim ortamı için 4 GB önerilir
  • CPU: 2 core yeterli başlangıç için, yük arttıkça ölçeklendirin
  • Disk: Kibana kendisi fazla yer kaplamaz ama log ve geçici dosyalar için 10 GB boş alan iyi olur
  • Java: Kibana Node.js ile gelir, ayrıca Java kurmanıza gerek yok
  • İşletim sistemi: Ubuntu 22.04 LTS (bu yazı için)

Elasticsearch’ün çalıştığını doğrulamak için:

curl -X GET "https://localhost:9200" -u elastic:SIFRENIZ --insecure

Eğer JSON response dönüyorsa devam edebilirsiniz.

Kibana Kurulumu

Elasticsearch kurulumunda zaten Elastic’in repository’sini sisteme eklemiş olmanız lazım. Eklemediyseniz önce onu yapalım:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

sudo apt update

Repository hazırsa Kibana’yı kuralım:

sudo apt install kibana -y

Kurulum tamamlandıktan sonra servis yönetimini systemd’ye bırakıyoruz:

sudo systemctl daemon-reload
sudo systemctl enable kibana
sudo systemctl start kibana

Kibana’nın ayağa kalkması biraz zaman alabilir, 30-60 saniye beklemenizi tavsiye ederim. Durumu kontrol etmek için:

sudo systemctl status kibana

Başlangıçta “waiting for Elasticsearch” gibi bir mesaj görebilirsiniz, bu normaldir. Logları takip etmek isterseniz:

sudo journalctl -u kibana -f

Kibana Yapılandırması

Kibana’nın ana yapılandırma dosyası /etc/kibana/kibana.yml dosyasıdır. Varsayılan ayarlarla sadece localhost’tan erişim sağlanır, bu yüzden birkaç şeyi değiştirmemiz gerekiyor.

sudo nano /etc/kibana/kibana.yml

Temel ayarlar şu şekilde olmalı:

# Kibana'nın dinleyeceği port
server.port: 5601

# Dışarıdan erişim için sunucu IP'si
server.host: "0.0.0.0"

# Kibana arayüzünde gösterilecek isim
server.name: "production-kibana"

# Elasticsearch bağlantısı
elasticsearch.hosts: ["https://localhost:9200"]

# Elasticsearch kullanıcı bilgileri
elasticsearch.username: "kibana_system"
elasticsearch.password: "KIBANA_SYSTEM_SIFRESI"

# SSL doğrulaması (self-signed cert için)
elasticsearch.ssl.verificationMode: certificate
elasticsearch.ssl.certificateAuthorities: ["/etc/elasticsearch/certs/http_ca.crt"]

# Kibana log dizini
logging.appenders.file.type: file
logging.appenders.file.fileName: /var/log/kibana/kibana.log
logging.appenders.file.layout.type: json
logging.root.appenders: [default, file]

Kibana Sistem Kullanıcısının Şifresini Ayarlama

Elasticsearch 8.x’te kibana_system kullanıcısının şifresini Elasticsearch üzerinden ayarlamamız gerekiyor:

curl -X POST "https://localhost:9200/_security/user/kibana_system/_password" 
  -H "Content-Type: application/json" 
  -u elastic:ELASTIC_SIFRESI 
  --insecure 
  -d '{"password": "KIBANA_SYSTEM_SIFRESI"}'

Bu komutu çalıştırdıktan sonra kibana.yml dosyasında yazdığınız şifre ile burada belirlediğiniz şifrenin eşleştiğinden emin olun.

Yapılandırmayı kaydedin ve Kibana’yı yeniden başlatın:

sudo systemctl restart kibana

Enrollment Token ile Kurulum (Alternatif Yöntem)

Kibana 8.x ile birlikte gelen enrollment token yöntemi daha hızlı ve güvenli bir kurulum sunar. Elasticsearch sunucusunda şu komutu çalıştırın:

sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

Bu komut uzun bir token üretecek. Sonra tarayıcınızdan http://SUNUCU_IP:5601 adresine gidin. Kibana sizi enrollment token ekranıyla karşılayacak, token’ı yapıştırıp devam edin. Doğrulama kodu için Kibana loglarına bakmanız gerekecek:

sudo journalctl -u kibana | grep "verification code"

Güvenlik Duvarı Ayarları

Eğer UFW kullanıyorsanız Kibana portunu açmanız gerekiyor:

sudo ufw allow 5601/tcp
sudo ufw reload
sudo ufw status

Kibana’yı doğrudan internete açmaktan kaçının. Nginx veya Apache ile reverse proxy kurmanızı şiddetle tavsiye ederim. Özellikle SSL sonlandırması ve temel HTTP auth için reverse proxy hayat kurtarır.

Nginx ile Reverse Proxy

sudo apt install nginx -y

sudo nano /etc/nginx/sites-available/kibana

Nginx yapılandırması:

server {
    listen 80;
    server_name kibana.sirketiniz.com;

    auth_basic "Kibana Erisim";
    auth_basic_user_file /etc/nginx/.kibana_htpasswd;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 90;
    }
}

htpasswd dosyasını oluşturun:

sudo apt install apache2-utils -y
sudo htpasswd -c /etc/nginx/.kibana_htpasswd admin
sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Kibana’ya İlk Giriş ve Temel Ayarlar

Tarayıcınızdan Kibana’ya bağlandığınızda sizi birkaç kurulum adımı karşılayacak. elastic kullanıcısıyla giriş yapın. İlk girişte Kibana size örnek veri yüklemenizi önerecek; geliştirme veya test ortamındaysanız bu seçeneği kullanabilirsiniz, çünkü dashboard oluşturmayı pratik etmek için hazır veri seti oldukça işe yarıyor.

Sol menüden Management > Stack Management > Index Patterns (ya da yeni arayüzde Data Views) kısmına giderek index pattern tanımlayın. Örneğin Filebeat kullanıyorsanız filebeat-* şeklinde bir pattern tanımlarsınız.

Data View (Index Pattern) Oluşturma

Kibana’da görselleştirme yapabilmek için önce hangi Elasticsearch index’lerini kullanacağınızı tanımlamanız gerekiyor. Bunu terminal üzerinden de yapabilirsiniz:

curl -X POST "http://localhost:5601/api/data_views/data_view" 
  -H "kbn-xsrf: true" 
  -H "Content-Type: application/json" 
  -u elastic:SIFRENIZ 
  -d '{
    "data_view": {
      "title": "filebeat-*",
      "name": "Filebeat Logs",
      "timeFieldName": "@timestamp"
    }
  }'

Bu API çağrısı filebeat-* pattern’ına uyan tüm indexleri kapsayan bir data view oluşturur. timeFieldName parametresi zaman bazlı sorgular için kritik önem taşıyor.

Dashboard Oluşturma

Gelelim işin en eğlenceli kısmına. Gerçek dünya senaryosu olarak bir web sunucusu log analizi dashboard’u oluşturacağız. Nginx access loglarını Filebeat ile Elasticsearch’e gönderdiğinizi varsayıyoruz.

Visualization Türleri

Kibana’da sık kullandığım visualization türleri:

  • Lens: Sürükle-bırak ile hızlı görselleştirme, önerim bu ile başlamanız
  • TSVB (Time Series Visual Builder): Zaman serisi verileri için güçlü seçenek
  • Maps: Coğrafi veri varsa harita üzerinde gösterim
  • Gauge ve Metric: KPI ve özet değerler için
  • Data Table: Ham veriyi tablo formatında görmek için

İlk Visualization: HTTP Status Code Dağılımı

Kibana arayüzünden Visualize Library > Create Visualization > Lens seçin. Sol taraftan filebeat-* data view’ını seçin. Horizontal axis için @timestamp alanını, vertical axis için count’u bırakın. Break down by kısmına http.response.status_code alanını sürükleyin. Bunu bar chart olarak kaydedip “HTTP Status Dağılımı” olarak adlandırın.

API Üzerinden Dashboard Oluşturma

Büyük ölçekli kurulumlar veya otomatik deployment için Kibana API’sini kullanmak daha pratiktir. Önce birkaç temel visualization oluşturalım, ardından bunları bir dashboard’a bağlayalım.

Basit bir metric visualization oluşturmak için:

curl -X POST "http://localhost:5601/api/saved_objects/visualization" 
  -H "kbn-xsrf: true" 
  -H "Content-Type: application/json" 
  -u elastic:SIFRENIZ 
  -d '{
    "attributes": {
      "title": "Toplam İstek Sayısı",
      "visState": "{"type":"metric","params":{"addTooltip":true,"addLegend":false,"type":"metric","metric":{"percentageMode":false,"useRanges":false,"colorSchema":"Green to Red","metricColorMode":"None","colorsRange":[{"from":0,"to":10000}],"labels":{"show":true},"invertColors":false,"style":{"bgFill":"#000","bgColor":false,"labelColor":false,"subText":"","fontSize":60}}},"aggs":[{"id":"1","enabled":true,"type":"count","schema":"metric","params":{}}]}",
      "uiStateJSON": "{}",
      "description": "",
      "kibanaSavedObjectMeta": {
        "searchSourceJSON": "{"index":"filebeat-*","query":{"match_all":{}},"filter":[]}"
      }
    }
  }'

Discover ile Log Analizi

Dashboard oluşturmadan önce verilerinizi Discover ekranında incelemenizi öneririm. Discover’a gidin, zaman aralığını “Last 24 hours” olarak ayarlayın. Burada KQL (Kibana Query Language) ile sorgular yazabilirsiniz:

# Kibana Discover'da kullanabileceğiniz KQL örnekleri

# Sadece hata logları
log.level: "error"

# Belirli bir host'un logları
host.name: "web-server-01"

# HTTP 5xx hatalar
http.response.status_code >= 500

# Birden fazla koşul
http.response.status_code >= 500 AND NOT url.path: "/health"

Dashboard Oluşturma ve Visualization Ekleme

Kibana’da Dashboard > Create Dashboard yolunu izleyin. Boş bir dashboard açılacak. Add from library ile önceden oluşturduğunuz visualization’ları ekleyebilir veya doğrudan Create visualization ile yeni grafikler oluşturabilirsiniz.

Gerçekçi bir web sunucusu monitoring dashboard’u için şu panelleri oluşturmanızı öneririm:

  • Toplam istek sayısı (Metric)
  • Hata oranı % (Gauge)
  • Zaman içinde istek dağılımı (Line chart, @timestamp bazlı)
  • En çok istek alan URL’ler (Horizontal bar)
  • HTTP status dağılımı (Pie veya donut chart)
  • Istek başına ortalama yanıt süresi (Area chart)
  • Coğrafi kaynak dağılımı (Maps, eğer IP coğrafi veri varsa)

Panelleri sürükle-bırak ile yerleştirin, boyutlarını ayarlayın. Save deyip dashboard’u kaydedin.

Dashboard’u Export ve Import Etme

Üretim ortamında dashboard’larınızı version control’e almak iyi bir alışkanlıktır. Export için:

curl -X GET "http://localhost:5601/api/kibana/dashboards/export?dashboard=DASHBOARD_ID" 
  -H "kbn-xsrf: true" 
  -u elastic:SIFRENIZ 
  -o dashboard_backup.json

Dashboard ID’sini Kibana arayüzünden ya da şu komutla bulabilirsiniz:

curl -X GET "http://localhost:5601/api/saved_objects/_find?type=dashboard" 
  -H "kbn-xsrf: true" 
  -u elastic:SIFRENIZ | python3 -m json.tool | grep '"id"'

Import için:

curl -X POST "http://localhost:5601/api/kibana/dashboards/import" 
  -H "kbn-xsrf: true" 
  -H "Content-Type: application/json" 
  -u elastic:SIFRENIZ 
  -d @dashboard_backup.json

Alerting Kurulumu

Dashboard görselleştirmenin ötesinde Kibana’nın Alerting özelliği de son derece kullanışlıdır. Özellikle hata oranı belirli bir eşiği aştığında e-posta veya Slack bildirimi almak isteyebilirsiniz.

Management > Stack Management > Rules and Connectors yolunu izleyin. Önce bir connector (bildirim kanalı) oluşturun, ardından rule (kural) tanımlayın.

Örnek senaryo: Son 5 dakikada HTTP 500 hata sayısı 10’u aştığında alarm ver.

curl -X POST "http://localhost:5601/api/alerting/rule" 
  -H "kbn-xsrf: true" 
  -H "Content-Type: application/json" 
  -u elastic:SIFRENIZ 
  -d '{
    "name": "Yüksek HTTP 500 Hatası",
    "rule_type_id": "metrics.alert.threshold",
    "consumer": "infrastructure",
    "schedule": {"interval": "5m"},
    "actions": [],
    "params": {
      "criteria": [{
        "aggType": "count",
        "comparator": ">",
        "threshold": [10],
        "timeSize": 5,
        "timeUnit": "m",
        "filterQuery": "http.response.status_code: 500"
      }]
    },
    "enabled": true
  }'

Performans İpuçları

Kibana yavaş çalışıyorsa ilk bakacağınız yer şuralar olmalı:

  • Elasticsearch shard sayısı: Çok fazla shard sorgu performansını düşürür. _cat/shards ile kontrol edin.
  • Zaman aralığı: Dashboard’larda varsayılan zaman aralığını makul tutun. “Last 30 days” yerine “Last 24 hours” ile başlayın.
  • Visualization karmaşıklığı: Tek bir dashboard’a 20+ panel koymaktan kaçının.
  • Kibana heap ayarı: Varsayılan Node.js heap size yetersiz gelebilir.

Kibana için heap ayarını değiştirmek isterseniz:

sudo nano /etc/default/kibana

Dosyaya şu satırı ekleyin:

NODE_OPTIONS="--max-old-space-size=2048"

Bu değeri sunucunuzun RAM miktarına göre ayarlayın. 4 GB RAM’li bir sunucu için 2048 MB mantıklı bir başlangıç noktasıdır.

Kibana Loglarını İzleme

Kibana’yı işletirken logları düzenli kontrol etmek sorunları erken tespit etmenizi sağlar:

# Son 100 satır log
sudo tail -100 /var/log/kibana/kibana.log

# Sadece hata logları
sudo journalctl -u kibana --since "1 hour ago" | grep -i error

# Gerçek zamanlı log takibi
sudo journalctl -u kibana -f --output=cat

Yaygın hata mesajları ve çözümleri:

  • “unable to connect to elasticsearch”: Elasticsearch çalışıyor mu, kimlik bilgileri doğru mu kontrol edin.
  • “Request Timeout after 30000ms”: Elasticsearch yük altında, query optimizasyonu yapın.
  • “heap out of memory”: NODE_OPTIONS ile heap size artırın.

Yedekleme Stratejisi

Kibana’nın dashboard ve visualization verileri Elasticsearch’te .kibana index’inde saklanır. Bu index’i yedeklemek aslında Kibana’nızı yedeklemek demektir.

# .kibana index'ini export etme
curl -X POST "localhost:9200/_snapshot/my_backup/kibana_snapshot_$(date +%Y%m%d)" 
  -H "Content-Type: application/json" 
  -u elastic:SIFRENIZ 
  --insecure 
  -d '{
    "indices": ".kibana*",
    "ignore_unavailable": true,
    "include_global_state": false
  }'

Snapshot repository’yi önceden yapılandırmış olmanız gerekiyor. Bu konu Elasticsearch yedekleme yazısında detaylı ele alınmıştır.

Gerçek Dünya Senaryo: DevOps Ekibi için Merkezi Log Dashboard’u

Bir e-ticaret şirketinde çalıştığınızı ve farklı mikroservislerden gelen logları tek bir Kibana dashboard’unda toplamak istediğinizi düşünün. Tipik kurulum şöyle olur:

Her servis kendi Filebeat agent’ını çalıştırır ve logları Logstash üzerinden Elasticsearch’e iletir. Logstash pipeline’ında service.name gibi bir field eklenir. Kibana’da data view oluştururken logs-* pattern’ını kullanırsınız.

Dashboard’da filtre olarak service.name field’ını kullanıp tek bir dashboard üzerinden tüm servisleri izleyebilirsiniz. Bir filtreyi tüm panellere uygulamak için dashboard seviyesinde Add filter özelliğini kullanın; bu sayede “Sadece payment-service loglarını göster” diyebilirsiniz.

Dashboard paylaşımı için Share > Embed Code özelliğini kullanarak iFrame kodu alabilir, bu kodu internal wiki sayfanıza gömerek teknik ekip dışındaki kişilerin de log verilerini takip etmesini sağlayabilirsiniz.

Sonuç

Kibana, Elasticsearch yatırımınızı görsel ve işlevsel bir araca dönüştüren kritik bir bileşendir. Kurulumu nispeten basit olmakla birlikte, güvenlik yapılandırması ve reverse proxy kurulumu üretim ortamı için atlanmaması gereken adımlardır.

Bu yazıda ele aldıklarımızı özetlemek gerekirse: Kibana kurulumu ve temel yapılandırma, nginx ile reverse proxy ve erişim kontrolü, data view oluşturma, dashboard ve visualization hazırlama, API tabanlı yönetim, alerting temelleri ve performans optimizasyonu konularını işledik.

Bir sonraki adım olarak Filebeat veya Logstash entegrasyonunu tamamlayıp gerçek veri akışı oluşturmanızı, ardından ihtiyacınıza özel dashboard’lar geliştirmenizi öneririm. Kibana’nın Lens arayüzü bu süreçte oldukça kullanıcı dostu; birkaç saat pratikle oldukça karmaşık görselleştirmeler oluşturabilirsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir