Kubernetes is powerful, but its YAML manifests can be about as fun as watching paint dry. Enter Helm, the package manager for Kubernetes that's here to save our sanity. Think of it as npm for Kubernetes, but with fewer existential crises.
Here's why Helm is your new best friend:
- Templating: Say goodbye to copy-pasting YAML files!
- Versioning: Roll back deployments faster than you can say "oops"
- Reusability: Share your charts and become the hero your team deserves
- Simplicity: Manage complex applications with a single command
Setting Up Your Quarkus App for Helm Greatness
Before we dive into Helm Charts, let's make sure our Quarkus app is ready for its Kubernetes debut. If you haven't already, add the Kubernetes extension to your Quarkus project:
./mvnw quarkus:add-extension -Dextensions="kubernetes"
This extension generates Kubernetes manifests for us, which we'll use as a starting point for our Helm Chart. Now, let's create a basic Dockerfile for our Quarkus app:
FROM registry.access.redhat.com/ubi8/openjdk-17:1.14
ENV LANGUAGE='en_US:en'
COPY target/quarkus-app/lib/ /deployments/lib/
COPY target/quarkus-app/*.jar /deployments/
COPY target/quarkus-app/app/ /deployments/app/
COPY target/quarkus-app/quarkus/ /deployments/quarkus/
EXPOSE 8080
USER 185
ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"
ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]
Creating Your First Helm Chart: A Journey of Discovery
Now that our Quarkus app is containerized and ready to go, let's create a Helm Chart to deploy it. First, install Helm if you haven't already:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
Next, let's create a new Helm Chart:
helm create quarkus-app
This command creates a directory structure for your Helm Chart. The main files we'll be working with are:
Chart.yaml
: Metadata about your chartvalues.yaml
: Default configuration valuestemplates/
: Directory containing Kubernetes manifest templates
Customizing the Chart: Where the Magic Happens
Let's modify the values.yaml
file to fit our Quarkus app:
replicaCount: 1
image:
repository: your-registry/quarkus-app
pullPolicy: IfNotPresent
tag: "latest"
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: "nginx"
hosts:
- host: quarkus-app.local
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
Now, let's update the templates/deployment.yaml
file to use these values:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "quarkus-app.fullname" . }}
labels:
{{- include "quarkus-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "quarkus-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "quarkus-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
{{- toYaml .Values.resources | nindent 12 }}
Deploying Your Quarkus App: The Moment of Truth
With our Helm Chart ready, it's time to deploy our Quarkus app to Kubernetes. First, make sure you're connected to your Kubernetes cluster, then run:
helm install my-quarkus-app ./quarkus-app
Boom! Your Quarkus app is now deployed and running in Kubernetes. To check the status of your deployment, use:
kubectl get pods
Upgrading and Rolling Back: Because Mistakes Happen
One of the beauties of Helm is how easy it makes upgrades and rollbacks. Let's say you've made some changes to your Quarkus app and want to deploy a new version. Simply update your Docker image tag in values.yaml
and run:
helm upgrade my-quarkus-app ./quarkus-app
If something goes wrong (we've all been there), rolling back is as simple as:
helm rollback my-quarkus-app
Advanced Techniques: Leveling Up Your Helm Game
Using Helm Hooks for Database Migrations
If your Quarkus app needs to run database migrations before starting up, you can use Helm hooks to ensure this happens at the right time. Add a new template file called templates/db-migrate-job.yaml
:
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "quarkus-app.fullname" . }}-db-migrate
annotations:
"helm.sh/hook": pre-install,pre-upgrade
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
spec:
containers:
- name: db-migrate
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
command: ["./migrate-database.sh"]
restartPolicy: Never
backoffLimit: 5
This Job will run before your main application starts, ensuring your database is up-to-date.
Implementing Canary Deployments
Helm Charts can also help you implement more advanced deployment strategies, like canary releases. Here's a quick example of how you might set up a canary deployment:
{{- if .Values.canary.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "quarkus-app.fullname" . }}-canary
spec:
replicas: {{ .Values.canary.replicaCount }}
selector:
matchLabels:
{{- include "quarkus-app.selectorLabels" . | nindent 6 }}
version: canary
template:
metadata:
labels:
{{- include "quarkus-app.selectorLabels" . | nindent 8 }}
version: canary
spec:
containers:
- name: {{ .Chart.Name }}-canary
image: "{{ .Values.image.repository }}:{{ .Values.canary.tag }}"
# ... rest of the container spec
{{- end }}
This template creates a separate canary deployment when enabled, allowing you to route a percentage of traffic to the new version.
Conclusion: Helm-ing Your Way to Kubernetes Mastery
And there you have it! We've journeyed through the land of Helm Charts and come out the other side with a sleek, manageable way to deploy our Quarkus applications to Kubernetes. No more YAML nightmares, no more deployment headaches – just smooth sailing on the Kubernetes seas.
Remember, Helm is just one tool in your Kubernetes toolkit. As you continue your journey, you might want to explore other technologies like Kustomize or Operator Frameworks. But for now, pat yourself on the back – you've taken a big step towards taming the Kubernetes beast!
"With great power comes great responsibility" – Uncle Ben, probably talking about Helm Charts
Further Reading and Resources
Now go forth and deploy with confidence! And remember, if anyone asks, you're not just a developer anymore – you're a Kubernetes wrangler, a Helm Chart artist, and a Quarkus quarterback all rolled into one. Happy coding!