Kubernetes Microservice Deployment(Java)
Spring Boot & MySql & VueJS Uygulama Örneği
Docker & Kubernetes
Merhabalar,
Bu yazımda Backend’i SpringBoot,Frontend VueJS ve Veritabanı olarak MySQL ile geliştirmiş olduğumum uygulamayı docker ve kubernetes ile deploy etmeyi inceliycez.
Uygulama Kodlarına göz atarak başlayalım.
Not: “@CrossOrigin(origins = “http://localhost:4200")” vue js uygulamamız hangi portta çalışıyorsa onun port numarasını girmelisiniz.
Uygulamısın Mysql Veritabanı docker ile ayağa kaldırıyoruz. Bunun için,
“docker-compose up -d” ile mysql ayağa kaldıralım.
Şimdide uygulamızı çalıştıralım ve tarayıcıdan “http://localhost:8082/swagger-ui.html” adresine gittiğimizde uygulamamısın çalıştığını görmekteyiz.
ve person listesine baktığımızda.
Frontend uygulamıza göz atalım.
vue create proje_ismi ile projememizi oluşturuyoruz. Ayrıca
- nodejs
- npm
- npm install -g @vue/cli sisteminizde yüklü olmalıdır.
Frontend kodlarına bakalım.
Şimdi de “npm run serve” komutu ile uygulamamızı çalıştıralım ve “localhost:4200” gittiğimizde.
Create Person sayfası
Update & Delete sayfası
Uygulamanın tüm kodlarını gitlab sayfamdan erişebilirsiniz.
İlk olarak uygulamamızı docker ile ayağa kaldıralım. docker-compose dosyamıza göz atalım.
Yukarıda görüldüğü gibi 3 servisten oluşuyor. Bunlar,
- database
- spring-backen
- frontend-vue
Bilinmesi gerekenler ise,
- backend servisinde image oluşturmak için “mvn clean install” komutu ile Dockerfile yazmadan fabric8 plugin ile dockerfile elde ettik.
- frontend-vue servisi için dockerfile dosyası yazdık ve dokcer-compose dosyasında build gösterdik. Burada context dockerfile dosyasının pathini docekerfile ise dockerfile dosyanısın ismi ne ise onu yazmalıyız. Ben standartlara uygun olması için Dockerfile yazdım.
Not: Bu örnekte bilmeniz gereken tek ve en önemli yer ise database servisidir. Biz uygulamamızı docker ile ayağa kaldırcağımız için database container exec ile bağlanıp “person” adında bir database oluşturmamız gerekir. Eğer container içinde database oluşmazsa hata alırsınız.
docker-compose exec service_name bash
Container bağlandıktan sonra root kullanıcı ve root şifresi ile container bağlanarak “create database person” ile database oluştursunuz.
Not2: VueJS uygulamamızı nginx ile ayağa kaldırcağımız i.in nginx default.conf ezmemiz gerekir. Bunun için,
Burada gördüğünüz gibi docker-compose dosyamızdaki servise ismini yazıyoruz. Son olarak ta “docker-compose up -d” komutu ile çalıştıralım.
ve Tarayıcıdan,
localhost:8082/swagger-ui.html gittiğimizde
ve localhost:4200 gittiğimizde
Görüldüğü gibi uygulamamız docker ile ayağa kaldırmış olduk.
Şimdide Kubernetes ile uygulamamızı ayağa kaldıralım. Bunun için ilk olarak minikube clusterımızı ayağa kaldıralım. Eğer minikube sisteminizde kurulu değil ise aşağıdaki linkten minikube kurulumunu gerçekleştirebilirsiniz.
minikube start --memory 8000 --cpus 4
Şimdide ingress aktifleştirelim. Bunun için
minikube addons listminikube addons enable ingress
İlk olarak backend ve frrontend imiz için docker image oluşturalım. Bunun için,
backend -> pom.xml oluşturcağımız image aşamaları yer alıyor. Burdan image almak için “mvn clean install” komutunu kullanıyoruz. Dilerseniz spring boot uygulamasından Dockerfile olmadan nasıl image alııyoru öğrenmek için diğer yazıma göz atabilirisiniz.
Frontend için, Dockerfile dan bir image oluşturuyoruz.
Daha Sonra bu image tagleyip docker hub gönderiyoruz ve image burdan çekiyoruz. Bunun için,
kubectl create secret docker-registry “secret_ismi” — docker-server=”registry_url” — docker-username=”kullanıcı_adı” — docker-password=”şifre”
Kubernetes Docker registy detaylı öğrenmek için diğer yazıma göz atabilirsiniz.
Son olarak “docker images” ile bakalım ve “docker hub”tan kontrol edelim.
Hazırlık aşamalarını tamamladığımıza göre MySQL yaml inceleyip deploy edebiliriz. Ama daha öncesinde bir tane java adında bir namespace oluşturalım. Bunun için,
kubectl create ns java
“kubectl get ns” ile bakalım.
Burada bilmeniz gereken spring.datasource.url inde uygulamamızı kubernetes ile ayağa kaldırdığımız için ilgili servisin adını yazıyoruz. Bizim örneğimizde mysql-service ismi “mysql-svc” dir.
Not: Bir uygulama geliştirilirken dikket edilmesi gereken,
- Uygulamayı geliştiren kişi isek ve localde çalışıyorsak iletişim kurcağımıız localhost
(spring.datasource.url= jdbc:mysql://localhost:3306/person?allowPublicKeyRetrieval=true&useSSL=false)
- Docker ile ayağa kaldırcaksak localhost yerine container_name veririz.
spring.datasource.url= jdbc:mysql://container_name_ne_ise:3306/person?allowPublicKeyRetrieval=true&useSSL=false
- Kubernetes ile ayağa kaldırcaksak ta kubernetes servisinin ismini veririz.
spring.datasource.url= jdbc:mysql://kubernetes_service_name_ne_ise:3306/person?allowPublicKeyRetrieval=true&useSSL=false
Şimdi de deplyoy edelim ve bakalım. Bunun için,
kubectl apply -f mysql.yamlkubectl get secret -n javakubectl get svc -n javakubectl get pods -n javakubectl get pv -n javakubectl get pvc -n java
Şimdide mysql bağlanarak database oluşturalım. Bunun için,
kubeDeploymentctl exec -it -n namespace_name pod_name --bash
Şimdi de Backend yani Spring boot uygulamamızın yaml’larına bakalım.
kubectl apply -f backend.yamlkubectl get svc -n javakubect get pods -n javakubectl get ingress -n java
ingress aldığı ip ve belirlediğimiz hostname etc/hosts ekleyelim. Bunun için,
sudo vim /etc/hosts
Tarayıcıdan “web.backend.com/swagger-ui.html” gittiğimizde
Başarılı…
Şimdi de manuel olarak iki tane veri ekledim api/persons bakalım datalar eklenmiş mi.
kubectl logs -f -n namespace_name pod_name
ile loglarına baktığımızda,
Tabloyu oluşturduğunu görebiliriz.
Post isteği attığımızda tabloya veriyi kaydettiğini görebiliriz.
Şimdide frontend yani VueJS yaml’larını yazalım.
Yaml deploy etmeden önce VueJS uygulamamıza geri dönelimve Burada “http-common.js” baseUrl değiştirip Dockerfile tekrar image alalım.
Not: Genelde DevOps ekipi projenin localde çalışan kodunu değiştirmek yerine Dockerfile dan tüm dosyayı container içine kopyalar ve gerekli değişikliği container içinden ayarlanır. Yapılan aşamaları görmeniz için ben bu örnekte manuel değiştirdim ama dediğim gibi prod ortamlarında containerın içinden yapılır.
Dockerfile bulunduğu dizinden image alalım.
kubectl apply -f frontend.yamlkubectl get svc -n javakubectl get pods -n java
Şimdide pod port-forward yaparak bakalım .Bunun için,
kubectl port-forward -n java pod_name port_name
Tarayıcıdan “localhost:4200” gittiğimizde,
Bir de kayıt ekleyelim.
Ingress yaml sizlere bırakıyorum backend olduğu gibi yazabilirsiniz.
Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler. Diğer yazımda Python django, PostgreSQL ve React kubernetes cluster örneğini inceliycez.
Referanslar;npm install -g @vue/cli