Spring boot uygulamasının kubernetes ortamında çalıştırılması

Gürkan Mustafa ÇAKIR
3 min readJul 4, 2021

Öncelikle uygulamamıza aşağıdaki gibi bir dockerfile oluşturalım.

FROM openjdk:11-jre-slim

ENV JAVA_OPTS " -Xms512m -Xmx512m "

WORKDIR application

COPY build/libs/simple-service-0.0.1-SNAPSHOT.jar ./

ENTRYPOINT ["java", "-jar", "simple-service-0.0.1-SNAPSHOT.jar"]

Yukarıdaki gibi uygulamamızı dockerfile içerisinde belirtiği gibi conteyner dönüştürelim.

yukarıdaki gibi docker hub üzerinde bir repo oluşturdum. Siz alternatif repolardan birini de kullanabilirsiniz.

Oluşturduğun imajı repoya göndermek için tag yaratıp repoya pushladım. Public repoya atmamızın nedeni ilerde podların bu imajı kullanarak ayağa kalkmasını isteyeceğiz.

Yukarıda görüldüğü üzere 0.1 olarak versiyonladığımız uygulamamızın conteyner halini docker hub’a yükledik. (0.5 versiyonunu kullanacağız ufak güncellemeler yaptık :))

Kubernates ortamını ben docker-desktop ile kullanacağım. Siz isterseniz minikube, ibm cloud, aws, azure gibi alternatifler üzerinde de kullanabilirsiniz.

Öncelikle kubernate ortamımı ayağa kaldırdım.

Öncelikle bir çok uygulama çalıştırabileceğimiz için bir loadbalancer/proxy kullanıyor olacağız. Kubernates kullanılmayan ortamlarda da F5 gibi dış dünyaya açılan bir uygulama mutlaka olur. Ben bu yönlendirme ve loadbalance işlemleri için nginx-ingress tercih ettim. Aşağıdaki gibi kubernates ortamınıza kurulum yapabilirsiniz.

kubectl apply -f 
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml

Nginx ingress kurarak şunu yapmayı amaçlıyoruz. örneğin 2 adet micro servisiniz var biri ürünleri diğeri indirimleri listeliyor olabilir tek kubernate üzerinde çalıştığından istek tek bir yere gelecek ve products/** diye devam ediyorsa ürün servislerinize giderken discounts/** diye devam ediyorsa indirim mikro servislerinize gidecek bir yapı düşünebilirsiniz.

Şimdi gelelim uygulamamızın deployments tanımını yapmaya.

apiVersion: apps/v1
kind: Deployment
metadata:
name: medium-simple
spec:
replicas: 2
selector:
matchLabels:
app: medium-simple
template:
metadata:
labels:
app: medium-simple
spec:
containers:
- name: medium-simple
image: gurkancakir/spring-boot-simple-service:0.5
ports:
- containerPort: 8080

Yukarıdaki deployment tanımından sonra aşağıdaki komut ile deployment tanımını oluşturarak podlarımızı ayağa kaldırabiliriz. dosyayı açıklamak gerekirse 2 replica oluşturmasını uygulamanın 8080 portunda çalıştığını ve image olarak bizim oluşturduğumuz docker image’ını kullanmasını istedik.

kubectl apply -f /kubernetes/test/medium-simple-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: medium-simple-svc
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: medium-simple

Yukarıdaki service tanımı ile poda gelecek trafiği bu service üzerinden haberleştiriyoruz. 80 portunda çalışan servis oluşturuyoruz ve hedef olarak podumuzun 8080 portunda çalıştığını düşünerek oraya belirtiyoruz. selector değeri ile uygulamamızı işaret ediyoruz.

kubectl apply -f /kubernetes/test/medium-simple-service.yaml

Servisimiz de hazır şimdi geldi ingress tanımımızı yapmaya. Aşağıdaki gibi tanımımızı oluşturuyoruz. Kısaca bahsetmek gerekirse anotation ile regex kullanacağımızı ve hedefe giderken path de düzenleme yapacağımızı belirtiyoruz. path ile /medium/** ile çağrıldığında medium-simple-svc servisine 80 portuna gitmesini söylüyoruz. Bu tanımla birlikte artık dışarıdan servisimize erişebilir olacağız.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: medium-simple-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: localhost
http:
paths:
- path: /medium(/|$)(.*)
pathType: Prefix
backend:
service:
name: medium-simple-svc
port:
number: 80

Tarayıcıdan uygulamamıza eriştiğimizde çalıştığını göreceğiz.

Spring boot projesi : https://github.com/gurkancakir/spring-boot-simple-service

Umarım yararlı bir yazı olmuştur. Sorularınız için iletişime geçebilirsiniz.

--

--