0

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:

  1. 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
  1. eval $(minikube docker-env):

This doesn't return anything in stdout

  1. Built the docker image using:

docker build -t gateixeira/demo-spring-boot:latest .

  1. Deployed using helm:
helm upgrade --install demo-spring-boot charts --values charts/values.yaml                                               INT kube minikube
  1. 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...

PacificNW_Lover
  • 4,746
  • 31
  • 90
  • 144

1 Answers1

0

can you please try this Gradle settings, https://stackoverflow.com/a/9689877/13939499, this doesn't looks like a helm or k8s error, but more of Gradle-java jar packaging type.