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]
Next, I clicked on the “Quarkus – Helm” link.
[https://quarkus.io/extensions/io.quarkiverse.helm/quarkus-helm/]
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.
Next, I clicked on the “Helm | Helm Extension for Quarkus” link.
[https://docs.quarkiverse.io/quarkus-helm/dev/index.html]
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.
[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]
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).
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-portquarkus.kubernetes.remote-debug.enabled=truequarkus.kubernetes.remote-debug.address-port=5005quarkus.package.jar.type=mutable-jarquarkus.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>
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.
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”:
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.
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:
With the following output:
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:
With the following output:
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.
