Deploying spring boot micro services with K8's in production

9/19/2019

I'm new to k8's setup, I wanted to know what is the best way to deploy the services in production. Below are a few way's I could think of, can you guide me in the right direction.

1) Deploy each *.war file into a apache tomcat docker container, and using the service discovery mechanism of k8's.
2) Run each application normally using "java -jar *.war" into pods and expose their ports using port binding.

Thanks.

-- rajesh023
kubernetes
microservices
spring-boot
tomcat

2 Answers

9/19/2019

The canonical way to deploy applications to Kubernetes is as follows:

  1. Package each application component in a container image and upload it to a container registry (e.g. Docker Hub)
  2. Create a Deployment resource for each container that runs the container as a Pod (or a set of replicas of Pods) in the cluster
  3. Expose the Pod(s) in each Deployment with a Service so that they can be accessed by other Pods or by the user
-- weibeld
Source: StackOverflow

9/19/2019

I would suggest to use embedded Tomcat server in Springboot .jar file to deploy your microservices. Below the answer of @weibeld that I also use to deploy my springboot apps.

  1. Package each application component in a container image and upload it to a container registry (e.g. Docker Hub)

You can use Jib to easily build distroless image. The container image can be built using maven plugin.

mvn compile jib:build -Djib.to.image=MY_REGISRY_IMAGE:MY_TAG -Djib.to.auth.username=USER -Djib.to.auth.password=PASSWORD
  1. Create a Deployment resource for each container that runs the container as a Pod (or a set of replicas of Pods) in the cluster

Create your deployment .yml file structure and adjust the deployment parameters as you need in the file.

kubectl create deployment my-springboot-app --image MY_REGISRY_IMAGE:MY_TAG --dry-run -o yaml > my-springboot-app-deployment.yml

Create the deployment:

kubectl apply -f my-springboot-app-deployment.yml
  1. Expose the Pod(s) in each Deployment with a Service so that they can be accessed by other Pods or by the user

    kubectl expose deployment my-springboot-app --port=8080 --target-port=8080 --dry-run -o yaml > my-springboot-app-service.yml

    kubectl apply -f my-springboot-app-service.yml

-- charlycou
Source: StackOverflow