Deploying Spring Boot microservices on Kubernetes Cluster

  • 4.4/5
  • 4983
  • Jul 20, 2024

This article guides you through the deployment of two Spring Boot microservices, namely "order-service" and "inventory-service," on Kubernetes using "MiniKube".

We will establish communication between them, with "order-service" making calls to an endpoint in "inventory-service." Additionally, we will configure "order-service" to be accessible from the local machine's browser.

1) Create Spring Boot microservices

The Spring Boot microservices, "order-service" and "inventory-service," have been developed and can be found in this GitHub repository.

If you are interested in learning more about creating Spring Boot REST microservices, please refer to this or this (Reactive) link.

2) Build Docker Images

The Docker images for both "order-service" and "inventory-service" have already been generated and deployed on DockerHub, as shown below.

codeburps/order-service

codeburps/inventory-service

These images are public and can be utilized directly. For additional information on dockerizing a Spring Boot application, please consult this link.

3) Install "minikube"

To install Minikube on a Mac, install Homebrew (if not already installed). Homebrew is a package manager for macOS. You can install it by running the following command in the Terminal:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Use Homebrew to install Minikube:

brew install minikube

4) Start Minikube

Once Minikube is installed, you can start it using the following command:

minikube start --driver docker

This command will download the Minikube ISO, create a virtual machine, and start the Minikube cluster.

Check if Minikube and kubectl are correctly configured:

minikube status

To access the Kubernetes dashboard provided by Minikube, run:

minikube dashboard

This will open the dashboard in your default web browser.

5) Install kubectl (Optional):

Kubectl serves as a command-line utility for managing interactions with Kubernetes clusters. If it's not already installed along with Minikube, you can add it to your system using Homebrew:

brew install kubectl

Run "kubectl version" to verify that the verison you’ve installed is sufficiently up-to-date.

kubectl version

6) Create Kubernetes Deployments

Create Kubernetes Deployment YAML files for both microservices.

7) Configure Communication Between Microservices

Ensure that the "order-service" can internally communicate with the "inventory-service" by using the Kubernetes service URL: http://inventory-service.default.svc.cluster.local:8081

Create a ConfigMap using a YAML file:

8) Apply the deployments

Use the "kubectl apply" command to apply it to your Kubernetes cluster.

kubectl apply -f inventory.yml
kubectl apply -f inventory-config.yml
kubectl apply -f order.yml

If everything proceeded smoothly, you should observe the deployment, pods, and services actively running within the Kubernetes (K8S) dashboard, as shown in the image below.

minikube dashboard

9) Retrieve information about deployments

9.1) To retrieve information about deployments in a Kubernetes cluster, you can use the following kubectl command:

kubectl get deployments
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
inventory-deployment   3/3     3            3           5m11s
order-deployment       3/3     3            3           5m2s

9.2) To obtain information about pods in a Kubernetes cluster along with their labels, you can use the following kubectl command:

kubectl get pods --show-labels
NAME                                    READY   STATUS    RESTARTS   AGE     LABELS
inventory-deployment-5c5cb8bf97-dpflb   1/1     Running   0          5m39s   app=inventory,pod-template-hash=5c5cb8bf97
inventory-deployment-5c5cb8bf97-jjpnw   1/1     Running   0          5m39s   app=inventory,pod-template-hash=5c5cb8bf97
inventory-deployment-5c5cb8bf97-tbmkz   1/1     Running   0          5m39s   app=inventory,pod-template-hash=5c5cb8bf97
order-deployment-844b5dd98d-vjbzz       1/1     Running   0          5m31s   app=order,pod-template-hash=844b5dd98d
order-deployment-844b5dd98d-wzz86       1/1     Running   0          5m31s   app=order,pod-template-hash=844b5dd98d
order-deployment-844b5dd98d-x6bg9       1/1     Running   0          5m31s   app=order,pod-template-hash=844b5dd98d

9.3) The "kubectl get all" command is used to retrieve information about various Kubernetes resources within the current context and namespace.

kubectl get all
NAME                                        READY   STATUS    RESTARTS   AGE
pod/inventory-deployment-5c5cb8bf97-dpflb   1/1     Running   0          6m47s
pod/inventory-deployment-5c5cb8bf97-jjpnw   1/1     Running   0          6m47s
pod/inventory-deployment-5c5cb8bf97-tbmkz   1/1     Running   0          6m47s
pod/order-deployment-844b5dd98d-vjbzz       1/1     Running   0          6m39s
pod/order-deployment-844b5dd98d-wzz86       1/1     Running   0          6m39s
pod/order-deployment-844b5dd98d-x6bg9       1/1     Running   0          6m39s

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/inventory-service   ClusterIP   10.111.170.195           8081/TCP         6m48s
service/kubernetes          ClusterIP   10.96.0.1                443/TCP          6m57s
service/order-service       NodePort    10.109.41.137            8080:65000/TCP   6m39s

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/inventory-deployment   3/3     3            3           6m48s
deployment.apps/order-deployment       3/3     3            3           6m39s

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/inventory-deployment-5c5cb8bf97   3         3         3       6m47s
replicaset.apps/order-deployment-844b5dd98d       3         3         3       6m39s

9.4) The "kubectl describe service" command is used to obtain detailed information about a specific Kubernetes service:

kubectl describe service order-service
Name:                     order-service
Namespace:                default
Labels:                   
Annotations:              
Selector:                 app=order
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.109.41.137
IPs:                      10.109.41.137
Port:                       8080/TCP
TargetPort:               8080/TCP
NodePort:                   65000/TCP
Endpoints:                172.17.0.10:8080,172.17.0.8:8080,172.17.0.9:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   

9.5) The "kubectl logs" command is used to retrieve the logs of a specific pod in a Kubernetes cluster.

kubectl logs -f order-deployment-844b5dd98d-wzz86

9.6) The "kubectl exec" command is used to execute a command in a specific pod within a Kubernetes cluster.

kubectl exec -n default pod/inventory-deployment-5c5cb8bf97-dpflb  -it -- /bin/sh

10) Access in Browser

The command "minikube service --url" is used to obtain the URL through which you can access the "order-service" in a browser.

minikube service order-service --url
http://127.0.0.1:51374
  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

11) Test

You can validate this configuration by utilizing the Swagger UI of the "order-service." Make a request with an integer ID, and you should receive a response similar to the example below.

The "order-service" internally communicates with the "inventory-service" to retrieve "inventory" details.

12) Delete deployments

Below commands are used to delete all deployments, pods, and services in the "default" namespace of a Kubernetes cluster.

12.1) Delete all Deployments

This command removes all deployments in the "default" namespace.

kubectl delete --all deployments --namespace=default
12.2) Delete all Pods

This command deletes all pods in the "default" namespace.

kubectl delete --all pods --namespace=default
12.3) Delete all Services

This command removes all services in the "default" namespace.

kubectl delete --all services --namespace=default

You can locate all the source code for the Spring Boot services and Kubernetes deployment files here: GitHub.

Index
How to Implement PostgreSQL Full-Text Search with Spring Boot

15 min

Spring's transaction management with the @Transactional annotation

9 min

Spring Boot Rest APIs with PostgreSQL (Spring Boot + Rest APIs)

15 min

Caching in Spring Boot (@Cacheable, @CacheEvict & @CachePut)

21 min

Declarative REST Client in Spring Boot (Spring 6 HTTP Interface)

13 min

Circuit Breaker in Spring Boot (Spring Cloud Circuit Breaker + Resilience4j)

12 min

Handling Concurrent Service Calls in a Spring Boot Application: Asynchronous vs. Reactive Approaches

11 min

Profiling a Spring Boot application with Pyroscope

7 min

Service discovery in Spring Boot (Spring Cloud + Netflix Eureka)

9 min

Dockerize Spring Boot app and Push image to DockerHub (Spring Boot + DockerHub)

4 min

Creating a Jenkins Pipeline for Spring Boot application

2 min

Monitoring Microservices (Spring Boot + Micrometer + Prometheus + Grafana)

7 min

Edge Server Pattern in Microservices (Spring Cloud Gateway)

7 min

Circuit Breaker Pattern in Microservices (Spring BOOT + Resilience4j)

4 min

Spring Cloud config server setup with Git

8 min

Distributed Tracing in Microservices (Spring Cloud Sleuth + Zipkin)

9 min

Circuit Breaker Pattern with Resilience4J in a Spring Boot Application

24 min

Deploying Spring Boot microservices on Kubernetes Cluster

12 min

Reactive programming in Java with Project Reactor

50 min

Spring Reactive with PostgreSQL (Spring Boot WebFlux + PostgreSQL)

13 min

Spring Reactive, Thymeleaf Hello World (Spring Webflux + Thymeleaf + JS/CSS)

9 min

Problem JSON (application/problem+json) in Spring WebFlux

15 min

Spring Boot Login/Logout (Spring Security + MySql + Thymeleaf)

21 min

Securing Server-to-Server Communication with "Spring Boot" & "OAuth 2"

18 min

Integrating Elasticsearch with a Spring Boot and PostgreSQL application

16 min

Sending Emails in Spring Boot via SMTP

7 min

How to create a basic Spring 6 project using Maven

5 min

Spring Boot, Thymeleaf Hello World (Spring Boot + Thymeleaf + JS/CSS)

9 min