Deploy Spring Boot App to GCP
Tags: microservices, springboot, googlecloud, gke
Published: 2019-08-29 17:34:04

This blog mainly concentrates how to deploy [spring boot app](https://github.com/BhargavModepalli/Spring-Boot-Google-Cloud) to GCP

1)Write the docker file

{%gist https://gist.github.com/BhargavModepalli/5fd61caffa8f801110034726559a09e8 %}
2) Docker image building and testing locally

     docker image build  --tag="spring_boot_hello_world:0.0.1" .
     docker run -p 8080:8080 -t spring_boot_hello_world:0.0.1


3) For those of us don't know GCP runs everything through as projects, so in order to start doing anything on GCP we need to have project.

     gcloud projects list
If the projects are empty and you want to create one

     gcloud projects create example-spring-boot-project --name="first project"
creates a new project with name `first project` and `example-spring-boot-project` as project id.

    gcloud config set project example-spring-boot-project 

check whether spring-boot-example-project is set as default project in the workspace


  >NOTE: Step 4 is needed only for docker images from docker hub registry, not needed for google registry 

4) This is an extra step if you are pulling your image from docker hub registry. You need to create a secret first with the docker hub and then use that secret whenever we want to pull the image from docker hub during deployments.

    kubectl create secret docker-registry --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
or
   Create your own secret by following steps in the [link](https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod)

5) Now we have all the environment set up to do the real work
**Deployment Controller:** Deployment Controller is the abstraction of pods and replica controller. It always tries to maintain the same no of replicas as mentioned in the manifest file.

{%gist https://gist.github.com/BhargavModepalli/1ea97de1a2f8e43e57bba378dc3327e5 %}
now we have the manifest file ready, lets go and execute

      kubectl apply -f spring-boot-deployment.yaml. 

In order to verify it created pods or not we can do 

      kubectl get pods

 it will display the total pods with their status as Running

6) **Services:** Now Deployment Controller deployed our app in to desirable number of pods running at internal ip which can not be accessed by outside cluster.

**How to we make the our service available over the internet?**
The answer is Services which selects running pods based on labels and exposes them to the internet. `NodePort, Loadbalancer` follow different mechanisms to expose it.            

7) **Node port Service**
Node Port service is basically where a vm listens to a port and sends traffic to the target port where pod is listening
{% gist https://gist.github.com/BhargavModepalli/a3f9702bf9f00c0ea807d510fc072ba5 %}
8) **LoadBalancer Service**
Loadbalancer is one way where you create a loadbalancer which has an external ip and listens to a port at that particular ip and which ever requests come throught that port it will forward to the imploicit port of the node port and from there it will be forwarded to the pod instances
{%gist https://gist.github.com/BhargavModepalli/6ec447c63bf0952bea2f25dd61903403 %}

    kubectl apply -f spring-boot-loadbalancer-service.yaml
    kubectl get svc
    take the external ip of spring-boot-loadbalancer-service and hit our endpoint /time
    bhargavryl@cloudshell:~ (example-spring-boot-project)$ curl http://35.226.27.116:80/time
    Wed Aug 28 02:50:53 GMT 2019

credits:@dariusx