Skip to main content

How To Deploy Spring Boot With Amazon EKS

Prerequisites

Initial Setup

  • Set up Spring Boot.

    • Use Spring Initializr to generate a new project.
    • Select Spring Web as dependency.
  • Create a Hello Controller HelloController.java.

    package com.example.fullstackbookspringbooteks;

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class HelloController {
    @GetMapping("/")
    public String hello() {
    return "Hello World!";
    }
    }

  • Create Dockerfile.

    FROM openjdk:17
    WORKDIR /usr/src/myapp
    COPY target/fullstackbook-springboot-eks-0.0.1-SNAPSHOT.jar /usr/src/myapp
    CMD ["java", "-jar", "/usr/src/myapp/fullstackbook-springboot-eks-0.0.1-SNAPSHOT.jar"]
  • Create an executable jar.

    ./mvnw clean package
  • Build image.

    docker build -t myapp .
  • Run container.

    docker run -p 8080:8080 -it --rm --name my-running-app myapp

Elastic Container Registry (ECR) Setup

  • Go to Amazon ECR.
  • Create a repository.
  • Click on "View push commands".
  • Follow the instructions to push image.
  • Copy the image url.

Elastic Kubernetes Service (EKS) Setup

  • Create EKS cluster.

    eksctl create cluster --name my-cluster --region us-west-2
  • Confirm communication with cluster.

    kubectl get svc
  • Create yaml configuration. k8s.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: myapp
    spec:
    selector:
    matchLabels:
    app: myapp
    template:
    metadata:
    labels:
    app: myapp
    spec:
    containers:
    - name: myapp
    image: 111111111111.dkr.ecr.us-east-2.amazonaws.com/myapp:latest
    resources:
    limits:
    memory: "128Mi"
    cpu: "500m"
    ports:
    - name: tcp
    containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: myapp
    spec:
    selector:
    app: myapp
    ports:
    - port: 80
    targetPort: 8080
    type: LoadBalancer
  • Apply manifest.

    kubectl apply -f k8s.yaml
  • Confirm pods.

    kubectl get pod
  • Open shell into pod.

    kubectl exec -it myapp-7487b94844-wvfmn -- bash
  • Confirm load balancer.

    kubectl get svc
  • Confirm load balancer domain.

    nslookup af220a880523a491a991ecc793ae1da2-125775810.us-west-2.elb.amazonaws.com

    Note: This might take a few minutes.

  • Confirm response from app.

    curl af220a880523a491a991ecc793ae1da2-125775810.us-west-2.elb.amazonaws.com

Set up AWS Load Balancer Controller

For more complex traffic routing, see how-to-set-up-aws-load-balancer-controller.md.

Delete cluster

  • Delete the cluster avoid large AWS bill.

    eksctl delete cluster --name my-cluster

References