Docker-compose ile Elastic Stack Kurulumu

Merhaba Arkadaşlar 🙂

Altyapınız büyüdükçe, güvenilir bir merkezi günlük kaydı sistemine sahip olmak çok önemli hale gelir. Günlük merkezileştirme, çeşitli BT görevlerinin önemli bir yönü haline geliyor ve size tüm sisteminize genel bir bakış sağlıyor.

En iyi çözüm, size daha iyi izlenebilirlik seçenekleri sunması ve harika topluluk desteğiyle birlikte gelmesi için meta verilerle zenginleştirilmiş tüm kapsayıcılardan günlükleri toplamaktır. ELK Yığını resmin içine giriyor. Elastic stack olarak da bilinen ELK, ElasticSearch, Logstash ve Kibana gibi modern açık kaynaklı araçların bir kombinasyonudur. Sisteminiz için kullanabileceğiniz eksiksiz bir uçtan uca günlük analiz çözümüdür.

Her bileşenin oynayacağı tanımlanmış bir rol vardır: ElasticSearch, işlenmemiş günlükleri depolamada en iyisidir, Logstash, günlüklerin toplanmasına ve tutarlı bir biçime dönüştürülmesine yardımcı olur ve Kibana harika bir görselleştirme katmanı ekler ve sisteminizi kullanıcı dostu bir şekilde yönetmenize yardımcı olur tavır.

Bu makalede, ELK’yi nasıl dağıtacağınızı ve kapsayıcı günlüklerini toplamaya başlayacağınızı öğreneceksiniz.

Bu yazımla karşınızdayım çünkü gerçekten DevOps açısından önemli ve şirket içerisinde belki işlerinizi aşırı derecede kolaylaştıracak bir yazılım grubundan bahsedeceğim. Bu günkü konumuz ELK docker-compose olacak. Peki nedir bu ELK docker-compose ? Öncelikle bunu bir açıklığa kavuşturalım.

Elastic Search, Logstash, Kibana

adlı üç adet uygulamadan oluşan ve asıl amacı loglamayı ileri derecede kolaylaştıran ve bir çok girdi ve çıktıya destek verebilen bütünsel bir programsal yapıdır diyebiliriz. Yazıyı ve uygulamayı yaparken işimizi kolaylaştırmak adına Docker üzerinden gitmeye çalışacağım. Çünkü Docker ile kurulum sıkıntıları ve bağımlılık problemi kesilmiş oluyor ve siz sadece işinize odaklanıyorsunuz ve istediğinizde anında başka bir yere taşıyabiliyorsunuz.  Evet, yukarıda bahsettiğim gibi ELK docker-compose bir loglama aracı topluluğu gibi düşünebiliriz. Hepsini teker teker açıklamaya çalışalım. Kısaca bu araçlar nelerdir açıklamaya çalışayım:

Elastic Search:  Java ile yazılmış ve full text search ve analize izin veren bir nosql veritabanıdır.

Logstash: Uygulamanız ve Elastic Search arasında adeta bir köprü görevi gören bir yazılımdır. Konfigürasyon dosyası 3’e ayrılır. InputFilter ve Output.

Kibana: Elastic Search’e kaydedilen logları anlık olarak izlemenizi sağlayan ve istendiği takdirde grafiksel istatistiler bile çıkarabilecek ciddi anlamda yetenekli bir web uygulaması.

Logstash Forwarder : Günlüklerini Logstash’a gönderecek sunuculara kurulan Logstash Forwarder, Logstash ile iletişim kurmak için lumberjack ağ protokolünü kullanan bir günlük yönlendirme aracı olarak görev yapar.

Şimdi isterseniz senaryoya geçeyim: Öncelikle bir mobil uygulamamızın olduğunu ve bunun üzerinden logların bir dosya halinde sunucuya yüklendiğini ve bunun ardından önceden belirlenen bir dosyaya bu yeni yollanan logların append edildiğini düşünelim. Bu log topluluğu da bizim ELK Stack’e yazılacak ve kullanıcı bunları kibana üzerinden takip edecek ve bütün hata ve logları anlık olarak takip edecek. Kulağa çok hoş geliyor değil mi 🙂 Evet bunları yapmak çokta zor değil aslında.

                                                                                            ELK yığınını içeren Docker görüntüsünün düzeni.

Konfigürasyon dosyaları ve günlükler, ana bilgisayar dizinlerinin bu görüntüden oluşturulan Docker kapsayıcılarına uygun şekilde eşleştirilmesine izin vermek için ayrı dizinlere yerleştirilmiştir.

İlk üç bileşeni Logstash Sunucumuz olarak adlandıracağımız tek bir sunucuya kuracağız . Logstash Forwarder, toplu olarak Müşteri Sunucularımız olarak adlandıracağımız günlükleri toplamak istediğimiz tüm istemci sunuculara kurulacaktır .

Docker Compose’u başlatma

Docker oluşturma dosyası, docker hub’ındaki resmi görüntüleri kullanır. Bu nedenle, başlamak için kendi görsellerinizi oluşturmanıza gerek yoktur. ELK yığınınızı bu örnekten başlatmanın iki farklı yolu vardır:

  1. Tek örnekler olarak: İki dosyayı koyduğunuz dizinde bir kabuk alın ve şunu yazın:  docker – compose up  Bu komut Elasticsearch için bir, Kibana için bir, Logstash için bir konteyner başlatacaktır. Logstash konteyneri 8080 portunu, Kibana konteyneri 5601 portunu dinleyecektir.
  2. X verileri düğümlerinin Elasticsearch küme ile:  docker – oluşturma ölçekli Elasticsearch Kibana Logstash 1.   Bu Elasticsearch küme x düğümleri, bir Logstash ve bir Kibana örneği başlayacaktır. Logstash yine 8080 numaralı bağlantı noktasını, Kibana 5601 numaralı bağlantı noktasını dinleyecektir.

Linux’ta, aşağıdaki komutu çalıştırarak sınırları artırabilirsiniz :

# grep vm.max_map_count /etc/sysctl.conf 
# vm.max_map_count = 262144
 sysctl -w vm.max_map_count = 262144

Yapılandırma dosyası

elasticsearch / config / elasticsearch.yml

elasticsearch.ymlolduğu gibi tercih metin editörü dosya ve yapılandırma ayarı kopyalamak:

## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
#
cluster.name: "elasticsearch-cluster"
network.host: 0.0.0.0

## X-Pack settings
## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
#
# xpack.license.self_generated.type: trial
xpack.license.self_generated.type: basic
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true

logstash / config / logstash.yml

Aşağıdaki satırı içine kopyalayın logstash.yml. Doğru kullanıcı adını ve şifreyi xpack.monitoring.elasticsearch.username ve xpack.monitoring.elasticsearch.passwordsırasıyla girdiğinizden emin olun :

## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]

## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme

logstash/pipeline/logstash.conf

Bunun dışında bir logstash.conf file. İşte elasticsearch referans bulacaksınız hostuserve passwordemin sisteminizde göre değerleri değiştirmek yapmak,:

input {
  tcp {
    port => 5000
  }
}

## Add your filters / logstash plugins configuration here

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    user => "elastic"
    password => "changeme"
  }
}

kibana/config/kibana.yml

kibana.ymlaşağıdaki konfigürasyonlardan oluşacaktır. Eğer değerlerini değiştirmek zorunda Notelasticsearch.user ve  elasticsearch.password:

## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: changeme

Başlamadan önce, aşağıdaki bağlantı noktalarının dinlediğinden emin olun:

  • Elasticsearch – Liman 9200ve Liman9300
  • Logstash – Bağlantı noktası 5044
  • Kibana – Liman 5601

Tek container oluşturma işlemi basitken birden fazla ve birbiriyle ilişkili containerlar oluşturmak oldukça zor olabilir. Bu zorluğu aşmak ve ilişkilerini bir konfigürasyon dosyası olarak tanımlayıp onu docker üzerinden yapılandırmamız mümkün. Bunu yapmak için docker-compose.yml isimli bir dosyaya oluşturup ve koşullarımızı ( services, volumes,ports,enviroment) tanımlayıp okutmamız yeterli olacaktır.

 

1. ADIM: (docker-compose.yml dosyasını hazırlamak)

Öncelikle dosya adını docker-compose.yml olarak vermelisiniz çünkü docker ön tanımlı olarak bu ismi arar. Birkaç parametreyi açıklamak gerekirse;

version: ‘3’  Compose file standardının versiyon numarasıdır.
networks: Containerlar arasında bir network oluşturur.(Stack yapısı ile yönetmeyi kolaylaştırır.)
volumes:  Containerların oluşturduğu data dosyalarını tutan path’tir.
services:  Bir veya daha fazla image’ın container yapısına getirilmiş halidir.
elasticsearch: Service isimlendirmesidir.(Bu örneğe özgü service ile ilgili bir isimlendirmedir.)
environment:  Container içinde service’in kendi environment tanımlarını gösteren tanımdır.
http.host: 0.0.0.0 Dışarıdan gelen tüm requestlere açık olduğunu gösterir.
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0  Service olarak container’da çalıştırılacak image.
ports:  İlk 9200 no’lu port container’ın dış portunu; ikinci 9200 nolu port iç portu belirtir. Dışarı kapalı olması istenen bir container(service) dış port belirtilmeyerek yalnızca iç port ile de tanımlanabilir.
depends_on:  İçinde bulunduğu service’in başka bir service’e bağımlı olduğunu belirtir.

docker-compose.yml

version: '3.2'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx512m -Xms512m"
      ELASTIC_PASSWORD: changeme
      # Use single node discovery in order to disable production mode and avoid bootstrap checks
      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:7.8.0
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
    ports:
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx512m -Xms512m"
    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:7.8.0
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:
    driver: bridge

volumes:
  elasticsearch:

2.ADIM: (compose run)

Compose dosyasının bulunduğu path’e gidilir. Ardından up komutu çalıştırılır. -d parametresi ile de docker-compose arka planda çalışacaktır.

Docker-compose altındaki tanımlara göre containerlarımız yaratılır. Kontrol etmek için docker-compose ps komutu çalıştırılır.

3.ADIM:

ELK docker-compose başarıyla ayağı kaldırıldı. Açık olan localhost:5601 adresi ile  Kibana’ya erişilebilir. Artık ELK’yı karıştırmaya başlayabiliriz. 🙂

4.ADIM: (compose kill)

Compose’da tanımlanan containerları ve network tanımı ile yaratılan stack’i kaldırmak içinde down komutu kullanılır. Bu komut çalışan containerları sırasıyla önce stop eder ardından remove eder.

docker-compose down

$ docker-compose down -v  # komutuyla tanımlı volume'ler de silinir.
$ docker-compose down -rmi # komutuyla compose içinde kullanılan imajlar da silinir.
$ docker-compose down --remove-orphans # komutuyla bir service'e sahip olmayan container'lar da silinir.

Elastic Stack (eski adıyla ELK Stack) artık kullanıma hazır bulunuyor. İstediğimiz uygulama ile iletişim haline geçip filtreleme yapmak için “index pattern” değişkenini belirlememiz yeterli olacaktır.

Hepsi bu kadar 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir