Am new to Docker, K8s, and Helm...
Was following an online tutorial to learn how to deploy a basic Kotlin Spring Boot Microservice onto minikube
using Helm Charts
.
Project structure:
demo-spring-boot
│
├── Dockerfile
├── HELP.md
├── README.md
├── build.gradle
├── charts
│ ├── Chart.yaml
│ ├── templates
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── values.yaml
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
│ ├── kotlin
│ │ └── com
│ │ └── demo
│ │ ├── HelloController.kt
│ │ └── DemoApplication.kt
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test
└── kotlin
└── com
└── demo
└── DemoApplicationTests.kt
Dockerfile
:
FROM openjdk:17-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
build.gradle
:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.springframework.boot' version '3.0.5'
id 'io.spring.dependency-management' version '1.1.0'
id 'org.jetbrains.kotlin.jvm' version '1.7.22'
id 'org.jetbrains.kotlin.plugin.spring' version '1.7.22'
}
group = 'com.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
implementation 'org.jetbrains.kotlin:kotlin-reflect'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.withType(KotlinCompile) {
kotlinOptions {
freeCompilerArgs = ['-Xjsr305=strict']
jvmTarget = '17'
}
}
tasks.named('test') {
useJUnitPlatform()
}
charts/Charts.yaml
:
apiVersion: v2
name: helm
description: "A Helm chart for our demo-spring-boot application"
type: application
version: 0.1.0
appVersion: latest
charts/values.yaml
:
appName: demo-spring-boot
namespace: default
appVersion: latest
replicaCount: 1
image:
registry: demo
pullPolicy: Never
templates/deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: {{ .Values.namespace }}
name: {{ .Values.appName }}
labels:
app: {{ .Values.appName }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.appName }}
template:
metadata:
labels:
app: {{ .Values.appName }}
spec:
containers:
- name: "{{ .Values.appName }}"
image: "{{ .Values.image.registry }}/{{ .Values.appName }}:{{ .Values.appVersion }}"
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
restartPolicy: Always
templates/service.yaml
:
apiVersion: v1
kind: Service
metadata:
namespace: {{ .Values.namespace }}
name: {{ .Values.appName }}
labels:
app: {{ .Values.appName }}
spec:
type: LoadBalancer
loadBalancerIP: 172.16.0.1
sessionAffinity: None
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: {{ .Values.appName }}
HelloController.kt
:
package com.demo;
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class HelloController {
@GetMapping("/")
fun hello(): String {
return "Hello World!"
}
}
Whereas, I can run this via localhost
and see Hello World!
in my browser, I keep getting a CrashLoopBackOff
error which is causing a bunch of restarts via minikube
.
So, the steps I followed:
- Started
minikube
:
minikube start --memory 2048 --cpus 2 --disk-size 10g
Output in stdout
:
minikube v1.30.1 on Darwin 12.6.4
✨ Using the docker driver based on existing profile
❗ You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.
❗ You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.
Starting control plane node minikube in cluster minikube
Pulling base image ...
Updating the running docker "minikube" container ...
Preparing Kubernetes v1.26.3 on Docker 23.0.2 ...
Verifying Kubernetes components...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
Enabled addons: storage-provisioner, default-storageclass
Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
eval $(minikube docker-env)
:
This doesn't return anything in stdout
- Built the docker image using:
docker build -t gateixeira/demo-spring-boot:latest .
- Deployed using
helm
:
helm upgrade --install demo-spring-boot charts --values charts/values.yaml INT kube minikube
- When I check pods:
kubectl get pods
NAME READY STATUS RESTARTS AGE
demo-spring-boot-6965d67897-wkcns 0/1 CrashLoopBackOff 8 (4m43s ago) 20m
When trying to troubleshoot by inspecting the logs:
kubectl logs demo-spring-boot-6965d67897-wkcns --all-containers
Response in stdout
:
no main manifest attribute, in /app.jar
Would appreciate it if someone could show me some troubleshooting steps...