Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 16fv3

Quarkus – trying out the “Helm Extension for Quarkus”

In a series of previous articles, I covered a lot about the “Quarkus – Kubernetes extension”.

This time I wanted to have a look at the “Helm Extension for Quarkus”.

In this article, you can read more about the “Helm Extension for Quarkus” I tried out. As a base for this, I used my already existing Linux demo environment, including Quarkus and K3s (a lightweight certified Kubernetes distribution) and setup via Vagrant.

Quarkus Extention “Quarkus – Helm”

On the Quarkus website, I navigated to: Extension | Browse Extensions.

Via the “Find an extension” field, I searched for helm.
[https://quarkus.io/extensions/?search-regex=helm]

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 17

Next, I clicked on the “Quarkus – Helm” link.
[https://quarkus.io/extensions/io.quarkiverse.helm/quarkus-helm/]

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 18

To add this extension to your project, use the relevant command in your Quarkus project directory:

For example, for maven:

./mvnw quarkus:add-extension -Dextensions="io.quarkiverse.helm:quarkus-helm"

[https://quarkus.io/extensions/io.quarkiverse.helm/quarkus-helm/]

I will be using this command later on.

Quarkus guide “Helm | Helm Extension for Quarkus”

Next, on the Quarkus website, I navigated to: Learn | Documentation.

Via the “Filter by keyword” field, I searched for helm.

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 19

Next, I clicked on the “Helm | Helm Extension for Quarkus” link.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html]

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 20

Helm is a package and install manager that standardizes and simplifies packaging and deployment of containerized applications with Kubernetes.

Under the hood, the Quarkus Helm extension uses Dekorate to generate the Helm chart manifests at build time.

Before getting started, make sure you’re using the right Quarkus Helm version that is compatible with the Quarkus version you’re using in your project.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html]

Using the Helm Extension in Kubernetes

Next I navigated to the “Using the Helm Extension in Kubernetes” part of the documentation.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#usage-helm-kubernetes]

Looking at the prerequisites, first I had to check if I had to prepare my demo environment for using the Helm Extension in Kubernetes.

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 21
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#usage-helm-kubernetes]

As it turned out, I already had all these requirements in place, in my already existing Linux demo environment, including Quarkus and K3s (a lightweight certified Kubernetes distribution) and setup via Vagrant, as described in a previous article.
[Quarkus – Kubernetes extension (reinvestigated, part 5), implementing a Service of service type LoadBalancer with K3s]

Among others, I had a file docker.sh as I described in “Quarkus – Kubernetes extension (reinvestigated, part 2), setting up a local private registry and using it with Quarkus” and a file helm.sh as I described in “Quarkus – Supersonic Subatomic Java, trying out Quarkus guide “Quarkus – Kubernetes extension” (reinvestigated, part 1)”, which I used before with Vagrant.

Setting up the application for using the Helm Extension

Below, you can see an overview of my Linux demo environment, as described in my previous article:
[Quarkus – Kubernetes extension (reinvestigated, part 7), Live Coding, via the “remote development mode”, of a Java application that is running in a container on a K3s Kubernetes cluster]

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 22

For the Linux demo environment to start, from the Oracle VM VirtualBox Manager on my Windows laptop, I started the appliance (in “Headless Start” mode).

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 23

Once the VM was running, for executing later manual steps, I used vagrant ssh to connect into the running VM.

First I wanted to reconfigure my Quarkus project (the “kubernetes-quickstart” application) as described in my previous article, to a useful base for the steps to come.
[Quarkus – Kubernetes extension (reinvestigated, part 7), Live Coding, via the “remote development mode”, of a Java application that is running in a container on a K3s Kubernetes cluster]

I wanted to skip the remote development mode and wanted 3 Pods with each 1 container with the running application.

On my Windows laptop, as you may remember from a previous article, I had a shared folder available.
[Quarkus – Supersonic Subatomic Java – Get Started (reinvestigated)]

So, in this shared folder, I navigated to kubernetes-quickstart\src\main\resources and changed the content of file application.properties to:
[in bold, I highlighted the changes]

quarkus.container-image.registry=localhost:8443
quarkus.container-image.username=mylocregusername
quarkus.container-image.password=mylocregpassword
quarkus.container-image.group=quarkus
quarkus.kubernetes.namespace=nl-amis-development
quarkus.kubernetes.ports."ports".container-port=8080
quarkus.kubernetes.ports."ports".host-port=8180
quarkus.kubernetes.ports."ports".node-port=30010
quarkus.kubernetes.replicas=3
quarkus.kubernetes.service-type=node-port
quarkus.kubernetes.remote-debug.enabled=true
quarkus.kubernetes.remote-debug.address-port=5005
quarkus.package.jar.type=mutable-jar
quarkus.kubernetes.env.vars.QUARKUS_LAUNCH_DEVMODE=true

Create a Quarkus application with the Helm Extension

Next I navigated to the “Create a Quarkus application with the Helm extension” part of the documentation.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#_create_a_quarkus_application_with_the_helm_extension]

If you already have your Quarkus project configured, you can add the helm extension to your project by running the following command in your project base directory:

./mvnw quarkus:add-extension -Dextensions="helm"

This command will add the following dependency to your pom.xml file:

<dependency>
    <groupId>io.quarkiverse.helm</groupId>
    <artifactId>quarkus-helm</artifactId>
    <version>1.2.7</version>
</dependency>

[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#_create_a_quarkus_application_with_the_helm_extension]

In order to add the Helm Extension to my project, I used the following commands on the Linux Command prompt:

cd /mnt/mysharedfolder/kubernetes-quickstart

mvn quarkus:add-extension -Dextensions="helm"

With the following output:

WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::staticFieldBase has been called by com.google.inject.internal.aop.HiddenClassDefiner (file:/opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.inject.internal.aop.HiddenClassDefiner
WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.acme:kubernetes-quickstart >-------------------
[INFO] Building kubernetes-quickstart 1.0.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- quarkus:3.25.2:add-extension (default-cli) @ kubernetes-quickstart ---
Downloading from registry.quarkus.io: https://registry.quarkus.io/maven/io/quarkus/registry/quarkus-registry-descriptor/1.0-SNAPSHOT/maven-metadata.xml
Downloaded from registry.quarkus.io: https://registry.quarkus.io/maven/io/quarkus/registry/quarkus-registry-descriptor/1.0-SNAPSHOT/maven-metadata.xml (63 kB at 24 kB/s)
…
Downloading from central: https://repo.maven.apache.org/maven2/io/quarkiverse/jnosql/quarkus-jnosql-elasticsearch/3.4.8/quarkus-jnosql-elasticsearch-3.4.8-codestarts.jar
Downloaded from central: https://repo.maven.apache.org/maven2/io/quarkiverse/jnosql/quarkus-jnosql-elasticsearch/3.4.8/quarkus-jnosql-elasticsearch-3.4.8-codestarts.jar (11 kB at 142 kB/s)
[INFO] [SUCCESS] ✅  Extension io.quarkiverse.helm:quarkus-helm:1.2.7 has been installed
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  20.097 s
[INFO] Finished at: 2025-11-12T18:34:46Z
[INFO] ------------------------------------------------------------------------

And indeed, my pom.xml was changed to:
[I bold, I highlighted the changes]

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.acme</groupId>
    <artifactId>kubernetes-quickstart</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <compiler-plugin.version>3.14.0</compiler-plugin.version>
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>3.25.2</quarkus.platform.version>
        <skipITs>true</skipITs>
        <surefire-plugin.version>3.5.3</surefire-plugin.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>${quarkus.platform.artifact-id}</artifactId>
                <version>${quarkus.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-kubernetes</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-container-image-jib</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkiverse.helm</groupId>
            <artifactId>quarkus-helm</artifactId>
            <version>1.2.7</version>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.platform.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                            <goal>generate-code</goal>
                            <goal>generate-code-tests</goal>
                            <goal>native-image-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
                <configuration>
                    <parameters>true</parameters>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <systemPropertyVariables>
                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>native</id>
            <activation>
                <property>
                    <name>native</name>
                </property>
            </activation>
            <properties>
                <skipITs>false</skipITs>
                <quarkus.native.enabled>true</quarkus.native.enabled>
            </properties>
        </profile>
    </profiles>
</project>

So now, I am using Quarkus Helm version 1.2.7 that is compatible with my Quarkus version 3.25.2.

Making a change to the application code

On my Windows laptop in the IntelliJ IDEA, in my shared folder, I opened the source code of the GreetingResource class.

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 24

Below you can see that I changed the source code of the GreetingResource class back to:

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello from Quarkus REST";
    }
}

Generation of Helm resources 

I continued with reading the documentation.

By now, my application was setup for using the Helm Extension.

In order to generate the Helm resources, I used the following command on the Linux Command Prompt:

mvn clean package

With the following output:

WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::staticFieldBase has been called by com.google.inject.internal.aop.HiddenClassDefiner (file:/opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.inject.internal.aop.HiddenClassDefiner
WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.acme:kubernetes-quickstart >-------------------
[INFO] Building kubernetes-quickstart 1.0.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ kubernetes-quickstart ---
[INFO] Deleting /mnt/mysharedfolder/kubernetes-quickstart/target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ kubernetes-quickstart ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- compiler:3.14.0:compile (default-compile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 1 source file with javac [debug parameters release 21] to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code-tests (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ kubernetes-quickstart ---
[INFO] skip non existing resourceDirectory /mnt/mysharedfolder/kubernetes-quickstart/src/test/resources
[INFO]
[INFO] --- compiler:3.14.0:testCompile (default-testCompile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 2 source files with javac [debug parameters release 21] to target/test-classes
[INFO]
[INFO] --- surefire:3.5.3:test (default-test) @ kubernetes-quickstart ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.acme.GreetingResourceTest
2025-11-12 18:41:24,431 INFO  [io.quarkus] (main) kubernetes-quickstart 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.25.2) started in 6.649s. Listening on: http://localhost:8081
2025-11-12 18:41:24,438 INFO  [io.quarkus] (main) Profile test activated.
2025-11-12 18:41:24,438 INFO  [io.quarkus] (main) Installed features: [cdi, compose, kubernetes, rest, smallrye-context-propagation, vertx]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.207 s -- in org.acme.GreetingResourceTest
Exception in thread "vert.x-internal-blocking-1" java.lang.IllegalAccessError: module java.base does not open java.lang to unnamed module @691541bc; to use the thread-local-reset capability on Java 24 or later, use this JVM option: --add-opens java.base/java.lang=ALL-UNNAMED
        at org.jboss.threads.JDKSpecific$ThreadAccess.<clinit>(JDKSpecific.java:32)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:13)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:1447)
Exception in thread "executor-thread-1" java.lang.NoClassDefFoundError: Could not initialize class org.jboss.threads.JDKSpecific$ThreadAccess
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:13)
2025-11-12 18:41:27,677 INFO  [io.quarkus] (main) kubernetes-quickstart stopped in 0.078s
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:1447)
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.IllegalAccessError: module java.base does not open java.lang to unnamed module @691541bc; to use the thread-local-reset capability on Java 24 or later, use this JVM option: --add-opens java.base/java.lang=ALL-UNNAMED [in thread "vert.x-internal-blocking-1"]
        at org.jboss.threads.JDKSpecific$ThreadAccess.<clinit>(JDKSpecific.java:32)
        ... 3 more
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ kubernetes-quickstart ---
[INFO] Building jar: /mnt/mysharedfolder/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus:3.25.2:build (default) @ kubernetes-quickstart ---
[INFO] [io.quarkus.kubernetes.deployment.PropertyUtil] Kubernetes manifests are generated with 'The container port http' having default value '8080'. The app and manifests will get out of sync if the property 'quarkus.http.port' is changed at runtime.
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 8982ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  35.181 s
[INFO] Finished at: 2025-11-12T18:41:37Z
[INFO] ------------------------------------------------------------------------

When using the Quarkus Helm extension, the Quarkus Kubernetes extension will be transitively loaded as well. So, the helm resources will include the following templates at target/helm/kubernetes/<chart name>/:

  • Chart.yaml
  • values.yaml
  • /charts
  • /templates
  • /templates/deployment.yaml
  • /templates/ingress.yaml
  • /templates/service.yaml
  • /templates/NOTES.txt

Tip:
The <chart name> is set from either the property quarkus.helm.name or the @HelmChart annotation or the Quarkus application.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#_create_a_quarkus_application_with_the_helm_extension]

So, on my Windows laptop in the shared folder, I navigated to the folder with Helm chart name “kubernetes-quickstart”:

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 25

So, indeed the files mentioned above were present.

Installing the previously generated Helm resources

Let’s now see how to install the previously generated Helm resources on a Kubernetes cluster.
First, you need to build the application container image and push it into a container registry.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#_chart_installation]

As I did before, in order to generate the Helm resources and build/push the application container image at once, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder/kubernetes-quickstart

mvn clean install -DskipTests -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true

With the following output:

WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::staticFieldBase has been called by com.google.inject.internal.aop.HiddenClassDefiner (file:/opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.inject.internal.aop.HiddenClassDefiner
WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.acme:kubernetes-quickstart >-------------------
[INFO] Building kubernetes-quickstart 1.0.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ kubernetes-quickstart ---
[INFO] Deleting /mnt/mysharedfolder/kubernetes-quickstart/target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ kubernetes-quickstart ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- compiler:3.14.0:compile (default-compile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 1 source file with javac [debug parameters release 21] to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code-tests (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ kubernetes-quickstart ---
[INFO] skip non existing resourceDirectory /mnt/mysharedfolder/kubernetes-quickstart/src/test/resources
[INFO]
[INFO] --- compiler:3.14.0:testCompile (default-testCompile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 2 source files with javac [debug parameters release 21] to target/test-classes
[INFO]
[INFO] --- surefire:3.5.3:test (default-test) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ kubernetes-quickstart ---
[INFO] Building jar: /mnt/mysharedfolder/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus:3.25.2:build (default) @ kubernetes-quickstart ---
[INFO] [io.quarkus.kubernetes.deployment.PropertyUtil] Kubernetes manifests are generated with 'The container port http' having default value '8080'. The app and manifests will get out of sync if the property 'quarkus.http.port' is changed at runtime.
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Starting (local) container image build for jar using jib.
[WARNING] [io.quarkus.container.image.jib.deployment.JibProcessor] Base image 'registry.access.redhat.com/ubi9/openjdk-21-runtime:1.21' does not use a specific image digest - build may not be reproducible
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Using base image with digest: sha256:360822c35c5741f542ab78fe123e6c4d9b68e0113a88d6e0250bb1f377b17f29
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Container entrypoint set to [/opt/jboss/container/java/run/run-java.sh]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Pushed container image localhost:8443/quarkus/kubernetes-quickstart:1.0.0-SNAPSHOT (sha256:030138028f17ae401bfc98cd8de4d03e54fad867cfa1387ebc551d9223ab94c6)

[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 18155ms
[INFO]
[INFO] --- failsafe:3.5.3:integration-test (default) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- quarkus:3.25.2:native-image-agent (default) @ kubernetes-quickstart ---
[INFO] Missing native-image-agent-base-config directory with native image agent configuration to transform
[INFO]
[INFO] --- failsafe:3.5.3:verify (default) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- install:3.1.2:install (default-install) @ kubernetes-quickstart ---
[INFO] Installing /mnt/mysharedfolder/kubernetes-quickstart/pom.xml to /home/vagrant/.m2/repository/org/acme/kubernetes-quickstart/1.0.0-SNAPSHOT/kubernetes-quickstart-1.0.0-SNAPSHOT.pom
[INFO] Installing /mnt/mysharedfolder/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar to /home/vagrant/.m2/repository/org/acme/kubernetes-quickstart/1.0.0-SNAPSHOT/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  31.995 s
[INFO] Finished at: 2025-11-12T18:50:17Z
[INFO] ------------------------------------------------------------------------

So, I did have to repeat the last command, because as I described in my previous article, I did get an error:

Can’t edit matching ports. No match found.

[Quarkus – Kubernetes extension (reinvestigated, part 7), Live Coding, via the “remote development mode”, of a Java application that is running in a container on a K3s Kubernetes cluster]

Removing the created Kubernetes objects

As I mentioned in my previous article, the Quarkus generated manifest kubernetes.yml, was already applied before to the Kubernetes cluster and created the following Kubernetes objects (in my custom nl-amis-development namespace):

  • Service
  • Deployment
  • Replica Set
  • Pod

Because I wanted to create the Kubernetes objects again, first I had to delete the existing ones. I repeated some of the steps I already described in a previous article.
[Quarkus – Kubernetes extension (reinvestigated, part 4), implementing a Service of service type NodePort]

In order to delete the Replica Set and all of the dependent Pods (in the nl-amis-development namespace), I used the following command on the Linux Command Prompt:

kubectl delete -n nl-amis-development replicaset $(kubectl get replicasets -n nl-amis-development -o=jsonpath='{range .items..metadata}{.name}{"\n"}{end}' | grep kubernetes-quickstart- | awk '{print $1}')

With the following output:

replicaset.apps "kubernetes-quickstart-8579c4797d" deleted

To delete a ReplicaSet and all of its Pods, use kubectl delete. The Garbage collector automatically deletes all of the dependent Pods by default.
[https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/#deleting-a-replicaset-and-its-pods]

In order to delete the Deployment, I used the following command on the Linux Command Prompt:

kubectl delete -n nl-amis-development deployment kubernetes-quickstart

With the following output:

deployment.apps "kubernetes-quickstart" deleted

In order to delete the Service, I used the following command on the Linux Command Prompt:

kubectl delete -n nl-amis-development service kubernetes-quickstart

With the following output:

service "kubernetes-quickstart" deleted


Recreating the Kubernetes objects in the nl-amis-development namespace, including a service with service type NodePort

I continued with reading the documentation.

Finally, let’s use Helm to deploy it into the cluster:

helm install helm-example ./target/helm/kubernetes/<chart name>

The above command will use the default values, which are located in ./target/helm/kubernetes/<chart name>/values.yaml. To override the default values, pass as parameter you own value file –values /path/to/another.values.yaml or set them using –set key1=val1 –set key2=val2.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#_chart_installation]

First, on my Windows laptop in the shared folder, I navigated to the folder with Helm chart name “kubernetes-quickstart”.

Below, you can see the content of file values.yaml:

---
app:
  image: localhost:8443/quarkus/kubernetes-quickstart:1.0.0-SNAPSHOT
  ports:
    http: 8080
    ports: 8080
  replicas: 3

Remark about the content of file values.yaml:
By default, the Quarkus Helm extension will generate the Helm values file (values.yaml) by mapping the following pre-configured properties:

  • The Kubernetes/Openshift replicas
  • The Kubernetes/Openshift image
  • The Kubernetes/Openshift Env Var values (only for plain values – secrets or configmaps are not supported yet)
  • The Kubernetes ingress host
  • The Openshift S2i builder image

The Deployment file at target/helm/<deployment target>/<chart name>/templates/deployment.yaml will have a reference to these values.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#helm-values]

Next, in order to deploy the application into the Kubernetes cluster by using Helm, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder/kubernetes-quickstart

helm install helm-kubernetes-quickstart ./target/helm/kubernetes/kubernetes-quickstart

With the following output:

Error: INSTALLATION FAILED: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp 127.0.0.1:8080: connect: connection refused

This error looked familiar to me. I remember from a previous article I wrote, what I had to do.
[Quarkus – Supersonic Subatomic Java, trying out Quarkus guide “Quarkus – Kubernetes extension” (reinvestigated, part 1]

So, I used the following command on the Linux Command Prompt:

kubectl config view --raw >~/.kube/config

Then, I repeated the command:
[https://helm.sh/docs/helm/helm_install]

helm install helm-kubernetes-quickstart ./target/helm/kubernetes/kubernetes-quickstart

With the following output:

NAME: helm-kubernetes-quickstart
LAST DEPLOYED: Wed Nov 12 19:08:31 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
# Quarkus Helm Notes

To access the Helm annotations or properties you just need to have the following dependency in your
class path:

    <dependency>
        <groupId>io.quarkiverse.helm</groupId>
        <artifactId>quarkus-helm</artifactId>
        <version>{quarkus-helm-version}</version>
    </dependency>

Build the project using:

    mvn clean package

You can find the generated Helm artifacts under: `target/helm/kubernetes/<chart name>/` that should look like:
- Chart.yaml
- values.yaml
- templates/*.yml the generated resources by Quarkus Helm

**Note**: The `<chart name>` is set from either the property `quarkus.helm.name` or the `@HelmChart` annotation or the Quarkus application.

# Requirements

- Have installed [the Helm command line](https://helm.sh/docs/intro/install/)
- Have connected/logged to a kubernetes cluster
- Configure your Quarkus application to use any of the Quarkus Kubernetes extensions like Quarkus Kubernetes, Quarkus OpenShift or Quarkus Knative.
- Configure your Quarkus application to use any of [the Quarkus Container Image extensions](https://quarkus.io/guides/container-image) - This example uses `container-image-docker`.

# How can it be used?

You can run the following Maven command in order to generate the Helm artifacts and build/push the image into a container registry:

```shell
mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true -Dquarkus.container-image.registry=<your container registry> -Dquarkus.container-image.group=<your container registry namespace>
```

This command will push the image to a container registry and will become available when a pod or container is created.

Finally, let's use Helm to deploy it into the cluster:

```shell
helm install helm-example ./target/helm/kubernetes/<chart name>
```

The above command will deploy a chart using the default values (as defined within the `values.yaml` file). We can override the default values to use your `values.dev.yaml` file by executing the following command:

```shell
helm install helm-example ./target/helm/kubernetes/<chart name> --values ./target/helm/<chart name>/kubernetes/values.dev.yaml
```

How can I update my deployment?

- Via the `upgrade` option of Helm command line:

After making changes to your project and regenerating the Helm resources and the application container image, then you need to upgrade your deployment:

```shell
helm upgrade helm-example ./target/helm/kubernetes/<chart name>
```

- Via the `set` option of Helm command line:

```shell
helm upgrade helm-example ./target/helm/kubernetes/<chart name> --set <app name>.replicas=1
```

How can we delete my deployment?

```shell
helm uninstall helm-example
```
vagrant@ubuntu2204:/mnt/mysharedfolder/kubernetes-quickstart$

Next, I checked whether the Pods were running successfully, with the following command on the Linux Command Prompt:

kubectl get pods --all-namespaces

With the following output:

NAMESPACE              NAME                                         READY   STATUS      RESTARTS        AGE
kube-system            coredns-5688667fd4-2hqfj                     1/1     Running     32 (6d7h ago)   92d
kube-system            helm-install-traefik-crd-kp2hl               0/1     Completed   0               92d
kube-system            helm-install-traefik-vl7x8                   0/1     Completed   2               92d
kube-system            local-path-provisioner-774c6665dc-2b9pq      1/1     Running     20 (6d7h ago)   92d
kube-system            metrics-server-6f4c6675d5-lljlv              1/1     Running     30 (6d7h ago)   92d
kube-system            svclb-traefik-dee09411-c7lzh                 2/2     Running     40 (6d7h ago)   92d
kube-system            traefik-c98fdf6fb-stkt7                      1/1     Running     29 (6d7h ago)   92d
kubernetes-dashboard   dashboard-metrics-scraper-749c668b7f-s7rjt   1/1     Running     20 (6d7h ago)   92d
kubernetes-dashboard   kubernetes-dashboard-76b75d676c-tq8fk        1/1     Running     27 (6d7h ago)   92d
nl-amis-development    kubernetes-quickstart-6c8c4f6755-98k7x       1/1     Running     0               22h
nl-amis-development    kubernetes-quickstart-6c8c4f6755-rbzrr       1/1     Running     0               22h
nl-amis-development    kubernetes-quickstart-6c8c4f6755-vmcx8       1/1     Running     0               22h

As you can see in the output above, the 3 Pods were running successfully.

In order to list helm releases (for the current namespace context), I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list

With the following output:

NAME                            NAMESPACE       REVISION        UPDATED                                 STATUS         CHART                                    APP VERSION
helm-kubernetes-quickstart      default         1               2025-11-12 19:08:31.842073022 +0000 UTC deployed       kubernetes-quickstart-1.0.0-SNAPSHOT
k3s-release                     default         1               2025-08-13 08:54:45.276772079 +0000 UTC deployed       k3s-chart-0.1.0                          1.16.0

In order to list all releases across all namespaces, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list --all-namespaces

With the following output:

NAME                            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                                      APP VERSION
helm-kubernetes-quickstart      default         1               2025-11-12 19:08:31.842073022 +0000 UTC deployed        kubernetes-quickstart-1.0.0-SNAPSHOT
k3s-release                     default         1               2025-08-13 08:54:45.276772079 +0000 UTC deployed        k3s-chart-0.1.0                            1.16.0
traefik                         kube-system     1               2025-08-13 08:51:34.633744141 +0000 UTC deployed        traefik-34.2.1+up34.2.0                    v3.3.2
traefik-crd                     kube-system     1               2025-08-13 08:51:09.549088333 +0000 UTC deployed        traefik-crd-34.2.1+up34.2.0                v3.3.2

As you can see in the output above, the default namespace was used for my release.

I continued with reading the documentation and then wanted to try out some other Helm commands.

Deleting my deployment

Next, I navigated to the “How can we delete my deployment?” part of the documentation.

helm uninstall helm-example

[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#_how_can_we_delete_my_deployment]

In order to uninstall my release, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_uninstall/]

helm uninstall helm-kubernetes-quickstart

With the following output:

release "helm-kubernetes-quickstart" uninstalled

Then, I checked whether the Pods were removed successfully, with the following command on the Linux Command Prompt:

kubectl get pods --all-namespaces

With the following output:

NAMESPACE              NAME                                         READY   STATUS      RESTARTS        AGE
kube-system            coredns-5688667fd4-2hqfj                     1/1     Running     32 (6d8h ago)   92d
kube-system            helm-install-traefik-crd-kp2hl               0/1     Completed   0               92d
kube-system            helm-install-traefik-vl7x8                   0/1     Completed   2               92d
kube-system            local-path-provisioner-774c6665dc-2b9pq      1/1     Running     20 (6d8h ago)   92d
kube-system            metrics-server-6f4c6675d5-lljlv              1/1     Running     30 (6d8h ago)   92d
kube-system            svclb-traefik-dee09411-c7lzh                 2/2     Running     40 (6d8h ago)   92d
kube-system            traefik-c98fdf6fb-stkt7                      1/1     Running     29 (6d8h ago)   92d
kubernetes-dashboard   dashboard-metrics-scraper-749c668b7f-s7rjt   1/1     Running     20 (6d8h ago)   92d
kubernetes-dashboard   kubernetes-dashboard-76b75d676c-tq8fk        1/1     Running     27 (6d8h ago)   92d

And indeed, as you can see in the output above, the 3 Pods for my “kubernetes-quickstart” application were gone.

In fact, all the Kubernetes resources associated with the last release of the Helm chart as well as the release history, were removed at once. So there you have it, we have witnessed one of the benefits of using Helm.

Installing my Helm chart in specific namespace

Now, in order to install a Helm chart in specific namespace, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_install]

helm install helm-kubernetes-quickstart ./target/helm/kubernetes/kubernetes-quickstart --namespace nl-amis-development

With the following output:

NAME: helm-kubernetes-quickstart
LAST DEPLOYED: Thu Nov 13 17:49:45 2025
NAMESPACE: nl-amis-development
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
# Quarkus Helm Notes

To access the Helm annotations or properties you just need to have the following dependency in your
class path:

    <dependency>
        <groupId>io.quarkiverse.helm</groupId>
        <artifactId>quarkus-helm</artifactId>
        <version>{quarkus-helm-version}</version>
    </dependency>

Build the project using:

    mvn clean package

You can find the generated Helm artifacts under: `target/helm/kubernetes/<chart name>/` that should look like:
- Chart.yaml
- values.yaml
- templates/*.yml the generated resources by Quarkus Helm

**Note**: The `<chart name>` is set from either the property `quarkus.helm.name` or the `@HelmChart` annotation or the Quarkus application.

# Requirements

- Have installed [the Helm command line](https://helm.sh/docs/intro/install/)
- Have connected/logged to a kubernetes cluster
- Configure your Quarkus application to use any of the Quarkus Kubernetes extensions like Quarkus Kubernetes, Quarkus OpenShift or Quarkus Knative.
- Configure your Quarkus application to use any of [the Quarkus Container Image extensions](https://quarkus.io/guides/container-image) - This example uses `container-image-docker`.

# How can it be used?

You can run the following Maven command in order to generate the Helm artifacts and build/push the image into a container registry:

```shell
mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true -Dquarkus.container-image.registry=<your container registry> -Dquarkus.container-image.group=<your container registry namespace>
```

This command will push the image to a container registry and will become available when a pod or container is created.

Finally, let's use Helm to deploy it into the cluster:

```shell
helm install helm-example ./target/helm/kubernetes/<chart name>
```

The above command will deploy a chart using the default values (as defined within the `values.yaml` file). We can override the default values to use your `values.dev.yaml` file by executing the following command:

```shell
helm install helm-example ./target/helm/kubernetes/<chart name> --values ./target/helm/<chart name>/kubernetes/values.dev.yaml
```

How can I update my deployment?

- Via the `upgrade` option of Helm command line:

After making changes to your project and regenerating the Helm resources and the application container image, then you need to upgrade your deployment:

```shell
helm upgrade helm-example ./target/helm/kubernetes/<chart name>
```

- Via the `set` option of Helm command line:

```shell
helm upgrade helm-example ./target/helm/kubernetes/<chart name> --set <app name>.replicas=1
```

How can we delete my deployment?

```shell
helm uninstall helm-example
```

In order to list helm releases (for the current namespace context), I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list

With the following output:

NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
k3s-release     default         1               2025-08-13 08:54:45.276772079 +0000 UTC deployed        k3s-chart-0.1.0 1.16.0

In order to list all releases across all namespaces, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list --all-namespaces

With the following output:

NAME                            NAMESPACE               REVISION        UPDATED                                 STATUS          CHART                                      APP VERSION
helm-kubernetes-quickstart      nl-amis-development     1               2025-11-13 17:49:45.029086218 +0000 UTC deployed        kubernetes-quickstart-1.0.0-SNAPSHOT
k3s-release                     default                 1               2025-08-13 08:54:45.276772079 +0000 UTC deployed        k3s-chart-0.1.0                            1.16.0
traefik                         kube-system             1               2025-08-13 08:51:34.633744141 +0000 UTC deployed        traefik-34.2.1+up34.2.0                    v3.3.2
traefik-crd                     kube-system             1               2025-08-13 08:51:09.549088333 +0000 UTC deployed        traefik-crd-34.2.1+up34.2.0                v3.3.2

In order to list all releases for a specific namespaces, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list --namespace nl-amis-development

With the following output:

NAME                            NAMESPACE               REVISION        UPDATED                                 STATUS          CHART                                      APP VERSION
helm-kubernetes-quickstart      nl-amis-development     1               2025-11-13 17:49:45.029086218 +0000 UTC deployed        kubernetes-quickstart-1.0.0-SNAPSHOT

Then, I checked whether the Pods were running successfully, with the following command on the Linux Command Prompt:

kubectl get pods --all-namespaces

With the following output:

NAMESPACE              NAME                                         READY   STATUS      RESTARTS        AGE
kube-system            coredns-5688667fd4-2hqfj                     1/1     Running     32 (6d8h ago)   92d
kube-system            helm-install-traefik-crd-kp2hl               0/1     Completed   0               92d
kube-system            helm-install-traefik-vl7x8                   0/1     Completed   2               92d
kube-system            local-path-provisioner-774c6665dc-2b9pq      1/1     Running     20 (6d8h ago)   92d
kube-system            metrics-server-6f4c6675d5-lljlv              1/1     Running     30 (6d8h ago)   92d
kube-system            svclb-traefik-dee09411-c7lzh                 2/2     Running     40 (6d8h ago)   92d
kube-system            traefik-c98fdf6fb-stkt7                      1/1     Running     29 (6d8h ago)   92d
kubernetes-dashboard   dashboard-metrics-scraper-749c668b7f-s7rjt   1/1     Running     20 (6d8h ago)   92d
kubernetes-dashboard   kubernetes-dashboard-76b75d676c-tq8fk        1/1     Running     27 (6d8h ago)   92d
nl-amis-development    kubernetes-quickstart-6c8c4f6755-99cgx       1/1     Running     0               108s
nl-amis-development    kubernetes-quickstart-6c8c4f6755-d4v2b       1/1     Running     0               108s
nl-amis-development    kubernetes-quickstart-6c8c4f6755-s4jtl       1/1     Running     0               108s

As you can see in the output above, the 3 Pods were running successfully again.

Then, in the Web Browser on my Windows laptop, I entered the URL:

http://localhost:8090/hello

With the following output:

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 26

Updating my deployment

I wanted to make a change to this release and opted for 5 Pods with each 1 container with the running application.

Next I navigated to the “How can I update my deployment?” part of the documentation.

  • Either via the upgrade option of Helm command line:

After making changes to your project and regenerating the Helm resources and the application container image, then you need to upgrade your deployment:

helm upgrade helm-example ./target/helm/openshift/<chart name>
  • Or via the set option of Helm command line:
helm upgrade helm-example ./target/helm/openshift/<chart name> --set app.replicas=1

[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#_how_can_i_update_my_deployment_2]

So, on my Windows laptop, in my shared folder, I navigated to kubernetes-quickstart\src\main\resources and changed the content of file application.properties to:
[in bold, I highlighted the changes]

quarkus.container-image.registry=localhost:8443
quarkus.container-image.username=mylocregusername
quarkus.container-image.password=mylocregpassword
quarkus.container-image.group=quarkus
quarkus.kubernetes.namespace=nl-amis-development
quarkus.kubernetes.ports."ports".container-port=8080
quarkus.kubernetes.ports."ports".host-port=8180
quarkus.kubernetes.ports."ports".node-port=30010
quarkus.kubernetes.replicas=5
quarkus.kubernetes.service-type=node-port

As I did before, in order to generate the Helm resources and build/push the application container image at once, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder/kubernetes-quickstart

mvn clean install -DskipTests -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true

With the following output:

WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::staticFieldBase has been called by com.google.inject.internal.aop.HiddenClassDefiner (file:/opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.inject.internal.aop.HiddenClassDefiner
WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.acme:kubernetes-quickstart >-------------------
[INFO] Building kubernetes-quickstart 1.0.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ kubernetes-quickstart ---
[INFO] Deleting /mnt/mysharedfolder/kubernetes-quickstart/target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ kubernetes-quickstart ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- compiler:3.14.0:compile (default-compile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 1 source file with javac [debug parameters release 21] to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code-tests (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ kubernetes-quickstart ---
[INFO] skip non existing resourceDirectory /mnt/mysharedfolder/kubernetes-quickstart/src/test/resources
[INFO]
[INFO] --- compiler:3.14.0:testCompile (default-testCompile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 2 source files with javac [debug parameters release 21] to target/test-classes
[INFO]
[INFO] --- surefire:3.5.3:test (default-test) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ kubernetes-quickstart ---
[INFO] Building jar: /mnt/mysharedfolder/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus:3.25.2:build (default) @ kubernetes-quickstart ---
[INFO] [io.quarkus.kubernetes.deployment.PropertyUtil] Kubernetes manifests are generated with 'The container port http' having default value '8080'. The app and manifests will get out of sync if the property 'quarkus.http.port' is changed at runtime.
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Starting (local) container image build for jar using jib.
[WARNING] [io.quarkus.container.image.jib.deployment.JibProcessor] Base image 'registry.access.redhat.com/ubi9/openjdk-21-runtime:1.21' does not use a specific image digest - build may not be reproducible
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Using base image with digest: sha256:360822c35c5741f542ab78fe123e6c4d9b68e0113a88d6e0250bb1f377b17f29
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Container entrypoint set to [/opt/jboss/container/java/run/run-java.sh]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Pushed container image localhost:8443/quarkus/kubernetes-quickstart:1.0.0-SNAPSHOT (sha256:d1053342d4d9b7f4d87689efe2b03a28999397c959339a8401bb8d1ed8102d27)

[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 18848ms
[INFO]
[INFO] --- failsafe:3.5.3:integration-test (default) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- quarkus:3.25.2:native-image-agent (default) @ kubernetes-quickstart ---
[INFO] Missing native-image-agent-base-config directory with native image agent configuration to transform
[INFO]
[INFO] --- failsafe:3.5.3:verify (default) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- install:3.1.2:install (default-install) @ kubernetes-quickstart ---
[INFO] Installing /mnt/mysharedfolder/kubernetes-quickstart/pom.xml to /home/vagrant/.m2/repository/org/acme/kubernetes-quickstart/1.0.0-SNAPSHOT/kubernetes-quickstart-1.0.0-SNAPSHOT.pom
[INFO] Installing /mnt/mysharedfolder/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar to /home/vagrant/.m2/repository/org/acme/kubernetes-quickstart/1.0.0-SNAPSHOT/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  32.981 s
[INFO] Finished at: 2025-11-19T15:17:26Z
[INFO] ------------------------------------------------------------------------

Next, on my Windows laptop in the shared folder, I navigated to the folder with Helm chart name “kubernetes-quickstart”.

Below, you can see the content of file values.yaml:
[in bold, I highlighted the changes]

---
app:
  image: localhost:8443/quarkus/kubernetes-quickstart:1.0.0-SNAPSHOT
  ports:
    http: 8080
    ports: 8080
  replicas: 5

As expected, the change to 5 Pods was visible in the file.

Then, in order to upgrade the chart in specific namespace, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_upgrade/]

helm upgrade helm-kubernetes-quickstart ./target/helm/kubernetes/kubernetes-quickstart --namespace nl-amis-development

With the following output:

elease "helm-kubernetes-quickstart" has been upgraded. Happy Helming!
NAME: helm-kubernetes-quickstart
LAST DEPLOYED: Wed Nov 19 15:21:02 2025
NAMESPACE: nl-amis-development
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
# Quarkus Helm Notes

To access the Helm annotations or properties you just need to have the following dependency in your
class path:

    <dependency>
        <groupId>io.quarkiverse.helm</groupId>
        <artifactId>quarkus-helm</artifactId>
        <version>{quarkus-helm-version}</version>
    </dependency>

Build the project using:

    mvn clean package

You can find the generated Helm artifacts under: `target/helm/kubernetes/<chart name>/` that should look like:
- Chart.yaml
- values.yaml
- templates/*.yml the generated resources by Quarkus Helm

**Note**: The `<chart name>` is set from either the property `quarkus.helm.name` or the `@HelmChart` annotation or the Quarkus application.

# Requirements

- Have installed [the Helm command line](https://helm.sh/docs/intro/install/)
- Have connected/logged to a kubernetes cluster
- Configure your Quarkus application to use any of the Quarkus Kubernetes extensions like Quarkus Kubernetes, Quarkus OpenShift or Quarkus Knative.
- Configure your Quarkus application to use any of [the Quarkus Container Image extensions](https://quarkus.io/guides/container-image) - This example uses `container-image-docker`.

# How can it be used?

You can run the following Maven command in order to generate the Helm artifacts and build/push the image into a container registry:

```shell
mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true -Dquarkus.container-image.registry=<your container registry> -Dquarkus.container-image.group=<your container registry namespace>
```

This command will push the image to a container registry and will become available when a pod or container is created.

Finally, let's use Helm to deploy it into the cluster:

```shell
helm install helm-example ./target/helm/kubernetes/<chart name>
```

The above command will deploy a chart using the default values (as defined within the `values.yaml` file). We can override the default values to use your `values.dev.yaml` file by executing the following command:

```shell
helm install helm-example ./target/helm/kubernetes/<chart name> --values ./target/helm/<chart name>/kubernetes/values.dev.yaml
```

How can I update my deployment?

- Via the `upgrade` option of Helm command line:

After making changes to your project and regenerating the Helm resources and the application container image, then you need to upgrade your deployment:

```shell
helm upgrade helm-example ./target/helm/kubernetes/<chart name>
```

- Via the `set` option of Helm command line:

```shell
helm upgrade helm-example ./target/helm/kubernetes/<chart name> --set <app name>.replicas=1
```

How can we delete my deployment?

```shell
helm uninstall helm-example
```

In order to list helm releases (for the current namespace context), I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list

With the following output:

NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
k3s-release default 1 2025-08-13 08:54:45.276772079 +0000 UTC deployed k3s-chart-0.1.01.16.0

In order to list all releases across all namespaces, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list --all-namespaces

With the following output:

NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
helm-kubernetes-quickstart nl-amis-development 2 2025-11-19 15:21:02.359823405 +0000 UTC deployedkubernetes-quickstart-1.0.0-SNAPSHOT
k3s-release default 1 2025-08-13 08:54:45.276772079 +0000 UTC deployedk3s-chart-0.1.0 1.16.0
traefik kube-system 1 2025-08-13 08:51:34.633744141 +0000 UTC deployedtraefik-34.2.1+up34.2.0 v3.3.2
traefik-crd kube-system 1 2025-08-13 08:51:09.549088333 +0000 UTC deployedtraefik-crd-34.2.1+up34.2.0 v3.3.2

As you can see in the output above, the release revision changed from 1 to 2.

In order to list all releases for a specific namespaces, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list --namespace nl-amis-development

With the following output:

NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
helm-kubernetes-quickstart nl-amis-development 2 2025-11-19 15:21:02.359823405 +0000 UTC deployedkubernetes-quickstart-1.0.0-SNAPSHOT

Then, I checked whether the Pods were running successfully, with the following command on the Linux Command Prompt:

kubectl get pods --all-namespaces

With the following output:

NAMESPACE              NAME                                         READY   STATUS      RESTARTS       AGE
kube-system            coredns-5688667fd4-2hqfj                     1/1     Running     32 (12d ago)   98d
kube-system            helm-install-traefik-crd-kp2hl               0/1     Completed   0              98d
kube-system            helm-install-traefik-vl7x8                   0/1     Completed   2              98d
kube-system            local-path-provisioner-774c6665dc-2b9pq      1/1     Running     20 (12d ago)   98d
kube-system            metrics-server-6f4c6675d5-lljlv              1/1     Running     30 (12d ago)   98d
kube-system            svclb-traefik-dee09411-c7lzh                 2/2     Running     40 (12d ago)   98d
kube-system            traefik-c98fdf6fb-stkt7                      1/1     Running     29 (12d ago)   98d
kubernetes-dashboard   dashboard-metrics-scraper-749c668b7f-s7rjt   1/1     Running     20 (12d ago)   98d
kubernetes-dashboard   kubernetes-dashboard-76b75d676c-tq8fk        1/1     Running     27 (12d ago)   98d
nl-amis-development    kubernetes-quickstart-5b7d7db6c-dpqr6        1/1     Running     0              10m
nl-amis-development    kubernetes-quickstart-5b7d7db6c-fjfsj        1/1     Running     0              10m
nl-amis-development    kubernetes-quickstart-5b7d7db6c-ftt8v        1/1     Running     0              10m
nl-amis-development    kubernetes-quickstart-5b7d7db6c-lhhd5        1/1     Running     0              10m
nl-amis-development    kubernetes-quickstart-5b7d7db6c-pmbdg        1/1     Running     0              10m

As you can see in the output above, instead of 3 Pods, now 5 Pods were running successfully.

Then, in the Web Browser on my Windows laptop, I entered the URL:

http://localhost:8090/hello

With the following output:

Quarkus – trying out the “Helm Extension for Quarkus” lameriks 2025 11 26

I conclude this article.

In this article, you can read more about the “Helm Extension for Quarkus” I tried out. You can read about how I used the Quarkus Helm Extension to generate a Helm chart for my Quarkus application and how I used Helm to deploy it into my Kubernetes cluster. You can also read more about how I deleted my deployment and how I updated my deployment from revision 1 to revision 2.

As a base for this, I used my already existing Linux demo environment, including Quarkus and K3s (a lightweight certified Kubernetes distribution) and setup via Vagrant.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.