Kubernetes Üzerine ELK Stack Kurulumu

Arif KIZILTEPE
5 min readAug 3, 2020

--

Hem kendi kubernetes ortamımda hem de farklı ortamlarda gözlemlediğim bir problem, çalışan pod’un loglarını izlemek. Bunun için daha önceden benim de kullandığım yöntem ssh(22) portunu expose ederek pod’a bağlanır logları bu şekilde izlerdim. Fakat bunun bir düzene girmesi gerektiğini ve ssh(22) portunu expose etmemin doğru olmadığını düşündüm ve kubernetes üzerine dinamik bir elk stack kurulumu yapmaya karar verdim. Bu yazıda sizlere kubernetes üzerine elk stack kurulumunu anlatacağım.

Kuruluma başlamadan önce ELK Stack hakkında detaylı bilgi edinmek istiyorsanız aşağıdaki yazıyı okumanızı tavsiye ederim.

Kurulum sırasında kubernetes manifest(yaml) dosyalarının detaylı incelemesini yapmayacağım, eğer bu konuda detaylı bilgi edinmek istiyorsanız şu yazımı okumanızı tavsiye ederim.

Artık kuruluma başlayalım. Kurulum için gerekli olan dosyaları sizler için github adresimde paylaştım. Install-ELK-stack-on-Kubernetes bağlantısına tıklayarak dosyaya ulaşabilirsiniz. Tüm dosyaları master sunucumuza indirelim.

Siyah : Elasticsearch deployment ve service manifest(yaml) dosyaları.(Service Type: ClusterIP)

Mavi : Kibana deployment, service ve configmap manifest(yaml) dosyaları.(Service Type: NodePort)

Mor : Logstah deployment, service ve configmap manifest(yaml) dosyaları.(Service Type: ClusterIP)

Yeşil : Sizler için hazırladığım tüm manifest(yaml) dosyalarının kurulumunu içeren script.

Kırmızı : Sizler için hazırladığım tüm manifest(yaml) dosyalarının silme işlemini içeren script.

Yukarıdaki ELK Stack çalışma mantığını incelediğinizde logstah ve kibana’nın elasticsearch’e bağlandığını görüyoruz. Sen bize 10 tane dosya verdin ama biz bunu anlamadık diyebilirsiniz. Hemen bu kısmı anlatayım.(Beats kısmını yazının sonlarında anlatacağım.)

Resmi incelediğimizde logstash → elasticsearch’e aynı şekilde kibana’da → elasticsearch’e bağlanıyor. Bilgiğiniz gibi elasticsearh 9200 portunda çalışıyor. logstash.conf ve kibana-configmap.yaml incelediğinizde elasticsearch.url parametresine elasticsearch:9200 yazıldığınız göreceksiniz.

Yukarıda okumanızı tavsiye ettiğim Kubernetes Uygulama Yükleme(Deployment) yazısında aslında bu konuya değinmiştim. ClusterIP ile tanımlanan service isimleri aynı namespace içerisinde belirtilen isim ile erişilebilir durumda olacaktır. Kubernetes bu imkanı sağladığı için logstash ve kibana podlarının elasticsearch erişimini bu şekilde yapıyoruz.

Yukarıda kuruluma başlamadan önce dinamik elk stack kurulumu yapacağımı söylemiştim. Kubernetes ortamında birden fazla uygulama olacağı için logların birbirine karışmaması için hem logstash tarafında hemde filebeat tarafında bazı eklemeler yaparak her uygulama için otomatik index oluşturmasını ve logların karışmamasını sağladım. Logstash.conf dosyasını incelediğinizde

index => "%{[fields][app]}"

output içerisinde yukarıdaki parametreyi göreceksiniz. Bu parametre filebeat uygulamasında fields içerisindeki app parametresine göre otomatik index oluşturmayı sağlıyor. Filebeat kurulumunda bunu nasıl ayarladığımızı anlatacağım.

Kurulum işlemi için sadece elk_create.sh scriptini çalıştırmanız yeterli olacaktır.

./elk_create.sh

Kurulum işlemi master’a bağlı olan node sayısı ve internet hızınıza bağlı olarak yavaş olacaktır. Kurulum tamamlandıktan sonra kubernetes üzerinde ELK stack yapısını inceleyelim.

Öncelikle deploymentları kontrol edelim

kubectl get deployment

Resimde gördüğünüz gibi elasticsearch, logstash ve kibana deploymentları tamamlanmış ve podlar çalışmaya başlamış.

Çalışan podları görüntüleyelim.

kubectl get pod -o wide

Evet podlarımız da düzgün bir şekilde çalışmaya başlamış.

Daha önce yazılarımda belirtmediğim ama bu yazıda gördüğünüz configmap konusunda ufak bir bilgi verdikten sonra oluşturduğumuz config mapleri görüntüleyeceğiz.

Configmap : Uygulamalarımızda kullandığımız konfigurasyonları dışarıda bir noktaya konularak tek noktadan yönetilmesine sağlayan bir kubernetes objesidir.

Şimdi oluşturduğumuz configmapleri görüntüleyelim.

kubectl get configmap

Kurulumu yaptık, kontrol ettik sorun görünmüyor. ELK kendi arasında nasıl iletişim kuruyor, biz kibana ekranına nasıl bağlanacağız? İşte burada service konusu devreye giriyor. Şimdi serviceleri listeleyelim.

kubectl get service

Not : ClusterIP ve NodePort gibi kavramları bilmiyorsanız şu yazımı okumanızı tavsiye ederim.

Gördüğünüz gibi elasticsearch ve logstash ClusterIP, Kibana NodePort tipinde erişime açılmış. Bizim için gerekli olan sadece Kibana ekranı olduğu için bunu NodePort tipinde oluşurduk.

Şimdi kibana ekranına erişelim. Yukarıda podları listelerken kibana’nın worker1 üzerinde çalıştığını ve servis listesinde erişim portunu görmüştük. Erişim için aşağıdaki adresi kullanarak kibana ekranına erişiyoruz.

worker1.32bit.com.tr:30002

Kurulum başarı ile tamamlandı.(Bir problem yaşadıysanız yorum yaparak bana ulaşabilirsiniz.) Peki biz uygulamalarımızın loglarını buraya nasıl göndereceğiz?

Uygulama loglarını göndermek için ben image içerisine filebeat kurulumu yapıyorum. Filebeat ile istediğim logları toplayıp logstash’e gönderiyorum.

Docker image hazırlama konusunu bilmiyorsanız bu konudaki yazımı okumanızı tavsiye ederim.

Image içerisine filebeat kurulumu için öncelikle filebeat.yaml dosyasını Dockerfile’ın bulunduğu dizine indirin, bu dosya image içerisine kurduğumuz filebeat uygulamasının konfigürasyon dosyası yerine kullanılacak. Bu dosya içerisinde bizim için önemli alanları.

27. Satır paths : Filebeat bu parametre altında verilen log dosyalarını belirtiğimiz adrese gönderir. Benim verdiğim örnek bir tomcat uygulamasına ait olduğu için ben catalina.out dosyasını verdim. Bu alanı kendi log dosyasına göre düzenleyin.

45. Satır fields : Logstash uygulamasına fields.app parametresini buradan gitmektedir. Benim uygulamamdaki atf olan kısmı kendinize göre derğiştirerek belirttiğiniz isimde index oluşmasını sağlayabilirsiniz.

161. Satır output.logstash : Burada logstash bilgilerini veriyoruz. Eğer kubernetes manifest(yaml) dosyasındaki isimleri değiştirmediyseniz logstash adı ile podlar logstash’in kurulu olduğu uygulamaya bağlanabilecektir. Bu alanı değiştirmenize gerek kalmayacaktır.

Dockerfile içerisine aşağıdaki alanı ekleyin.

#Filebeat yükleniyor.
RUN curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-oss-7.6.2-amd64.deb
RUN dpkg -i filebeat-oss-7.6.2-amd64.deb
ADD filebeat.yml /etc/filebeat/filebeat.yml

Daha sonra image’ı tekrar build edin ve uygulamanızı tekrardan kubernetes’e deploy edin.

Uygulamanız açılıp log yazmaya başladıktan sonra kibana üzerinde index’in oluştuğunu göreceksiniz.

ELK stack kurulumundan sonra yaptığımız Dockerfile güncelleme ve yeniden image oluşturma işlemini her uygulamanız için yaparak tüm uygulamalarınızın loglarını ortak ELK stack üzerinde tutabilirsiniz.

Kurulum aşamasında sorun yaşarsanız veya bana soru sormak isterseniz yorum yaparak bana ulaşabilirsiniz.

--

--

Responses (1)