Kubernetes Üzerinde Spring Boot Kodunu Uzaktan Debug Etme ( Remote debugging )
  1. Anasayfa
  2. Container

Kubernetes Üzerinde Spring Boot Kodunu Uzaktan Debug Etme ( Remote debugging )

0

Hatalar ; Developer ve DevOps ekipleri arasında bir döngü problemidir. Artık monolitik bir yapı kalmadığını düşünürsek :) Developer kodu pipeline sürecine ilettikten ve sonra kodun çalışmadığı Developer veya Devops kontrollerinde anlaşılır. Birlikte problemi loglama ( Örneğin; Elastic / Kibana ) gibi mekanizmalarından araştırken ortaya çıkacak cevap bellidir ; “Local makinemde çalışıyor !”.

Peki sorun nerede  ? Çalıştığınız ortamlar Container ( Örneğin ; Kubernetes ) platformlarda, birbirinden bağımsız mikroservis mimarisi ve frontend / backend katmanlarından oluşuyorsa daha karmaşık bir hal alacaktır. Local ortamlar ile runtime container ortamların bire bir aynı ( Version, JRE, DB gibi ) olması mümkün müdür ? Bu konu ile ilgili bir ilerleyen yazılarımda Backing Services ve Dev/Prod Parity başlıkları ortamların tekilleştirilmesi adına bir yazı yazacağım. Tabi ki mümkün olamayacak , olmayabilir.

Konumuza dönelim ve çözüm yöntemini uygulayalım :)

1) Debug etmek istediğiniz uygulamanızın Kubernetes üzerinde çalıştığını ve Dockerfile sahip olduğunuzu varsayıyorum.

Dockerfile:

FROM anapsix/alpine-java:8_server-jre_unlimited
FROM openjdk:8-jdk-alpine
ADD  target/*.jar app.jar
ENV PROFILE=Dev
CMD["java", "-Dspring.profiles.active=${PROFILE}", "-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n","-Djava.security.egd=file:/dev/./urandom","-Xms2g","-Xmx8g","-jar","app.jar"]

Örnek Dockerfile içerisindeki “-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n”,”-Djava.security.egd=file:/dev/./urandom”,”-Xms2g”,”-Xmx8g”  debug etmemize yarayacak parametrelerin detaylarını bilgi edinmeniz açısından aşağıda paylaşıyorum. Ayrıca çalışmamız da 5005 numaralı portun debug JAVA hata ayıklayıcısı olacağına dikkat edelim.

Jdwp: Bağlantı ayrıntılarını belirtir:

Transport: Uygulama ve hata ayıklayıcı arasındaki aktarımı yapılandırır. İki değeri olabilir: “dt_socket” veya “shmem”. “Dt_socket” soket arayüzüne talimat verir. “Shmem” uygulaması, hem uygulama hem de hata ayıklayıcı aynı makinede çalışırken yararlı olan paylaşılan bellek bölgesi üzerinden uygulama ve hata ayıklayıcı etkileşimini bildirir.

Address: Uzaktan hata ayıklama için uygulama tarafından açılacak bağlantı noktası.

Suspend: İki değeri olabilir. “Y”, herhangi bir uzak hata ayıklayıcı uygulamaya bağlanana kadar uygulamanın askıya alınacağı anlamına gelir. “N”, uygulamaya uzak bir hata ayıklayıcı bağlı olmasa bile uygulamanın askıya alınmayacağı anlamına gelir.

Spring Boot uygulamamız için hazırladığımız yukarıdaki Dockerfile kodunuza ekleyerek veya yine yukarıda belirttiğim parametreyi mevcut Dockerfile ‘ınıza ekleyerek build alabilirsiniz. Artık uygulamamızın debug modunu aktif hale getirmiş bulunuyoruz.

2) Sıradaki işlem ; mikro servisimizin debug portunu kubernetes üzerinde çalışmasına yarayan tanımı eklemek olacaktır. Aşağıda gördüğünüz gibi mikro servisimizin service yaml içerisinde “ports” kısmına debug portu ekliyorum.

Resim-1

3) Spring Boot uygulamamızın build ( Dockerfile) sürecindeki ve deployment sürecindeki ( yaml ) eklemeleride tamamladığımıza göre uygulamamızı Kubernetes ortamına deploy edebiliriz. Deploy sonrasında ilgili deployment’a ait service çıktısı aşağıdaki gibi olmalıdır.

 kubectl get svc -o wide

Resim-2

Detay:

Resim-3

4) Son olarak uygulamanıza IntelliJ Idea dan debug mode ile bağlanarak, anlık hataları ayıklayabilmek istiyorsanız aşağıda resimdeki işlemi yapmanız yeterli olacak.

Resim-4

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs: Container, Debugging, Java, Kubernetes, Remote Debug, Spring

Bu İçeriğe Tepkin Ne Oldu?
  • 1
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

1984 Aydın doğumluyum, Lise eğitimi Aydın Anadolu Lisesi, Üniversite eğitimi Burslu olarak Girne Amerikan Üniversitesi Bilgisayar Mühendisliği ve Yüksek Lisans içinde Beykent Üniversitesi Yüksek Bilgisayar Mühendisliği Bölümlerini bitirdikten sonra 2009 yılında profesyonel iş hayatıma başladım. Yazılım Mühendisi olarak başladığım meslek hayatımın içerisinde bir çok kurumsal firmada çalışma fırsatı buldum. Şuan Migros bünyesinde Yazılım ve DevOps Mimari olarak görev yapmaktayım. OpenSource, DevOps ve Container yakından ilgi duyduğum teknolojilerdir.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

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