- Deploying Vert.x in Quarkus Application on GKE
- Development Environment
- Technologies Used
- Local Deployment with Minikube
- Deployment to Google Kubernetes Engine (GKE)
- Conclusion
This project demonstrates deploying a Quarkus-based Vert.x application to Google Kubernetes Engine (GKE).
- Operating System: macOS 13.2.1 (Build 22D68)
- Quarkus: A Kubernetes-native Java framework designed for fast startup and low memory footprint.
- Minikube: A tool to run a single-node Kubernetes cluster locally for development and testing.
- Google Kubernetes Engine (GKE): A managed Kubernetes service provided by Google Cloud Platform (GCP).
- Jib: A container image building tool that simplifies packaging Java applications into container images without needing a Dockerfile.
- Ensure Minikube is installed and initialized:
minikube start
Configure the local Docker client to use the Docker daemon running inside Minikube:
eval $(minikube docker-env)
Generate Kubernetes Secret to initialize the database server and grant access:
kubectl create secret generic db-credentials --from-literal=username={USERNAME} --from-literal=password={PASSWORD}
kubectl apply -f postgresql_kubernetes.yml
Build and deploy the application to Minikube with ARM64 platform support:
mvn clean package -Dquarkus.container-image.build=true \
-Dquarkus.jib.platforms=linux/arm64/v8 \
-Dquarkus.kubernetes.deploy=true
Make a request to the deployed service to ensure successful deployment:
kubectl exec -it vertx-quarkus-demo-<POD_ID> -- /bin/bash
curl http://vertx-quarkus-demo/greeting
Initialize and configure the Google Cloud SDK for authentication:
gcloud auth login
gcloud init
Configure Docker authentication information to interact with Google Artifact Registry for Docker:
gcloud auth configure-docker
Build and push the container image to Google Container Registry using Jib:
mvn clean package -Dquarkus.container-image.build=true \
-Dquarkus.container-image.push=true \
-Dquarkus.jib.platforms=linux/arm64/v8
Create a Kubernetes cluster on Google Kubernetes Engine:
Connect your terminal to the generated Kubernetes cluster on GKE:
gcloud container clusters get-credentials {YOUR_CLUSTER_NAME} --region {YOUR_REGION} --project {YOUR_PROJECT_ID}
Deploy the Quarkus application to the GKE cluster:
mvn clean package -Dquarkus.kubernetes.deploy=true
To expose a Quarkus application to the public via Ingress with a global static IP address, follow these steps:
-
Create a Global Static IP Address:
gcloud compute addresses create {A_NAME_FOR_GLOBAL_STATIC_IP} --global
-
Update Configuration: Add the following configuration, ensuring to include double quotation marks as shown:
quarkus: kubernetes: ingress: expose: true annotations: "kubernetes.io/ingress.global-static-ip-name": "{A_NAME_FOR_GLOBAL_STATIC_IP}"
-
Verify Configuration: Once configured, the generated
kubernetes.yml
manifest should contain the following in themetadata.annotations
section:metadata: annotations: kubernetes.io/ingress.global-static-ip-name: {A_NAME_FOR_GLOBAL_STATIC_IP}
-
Check Deployment: Verify if the application is deployed with the reserved static IP address:
kubectl get ingress
Example output:
NAME CLASS HOSTS ADDRESS PORTS AGE {PROJECT} <none> * {GIVEN_STATIC_IP} 80 31m
-
Test Deployment: Ensure the application is accessible using the reserved static IP address:
http http://{GIVEN_STATIC_IP}/
To point your domain to the deployed application using the reserved static IP address, you can use the Google Cloud DNS service:
gcloud dns --project={YOUR_PROJECT_NAME} record-sets create {ENTER_PREFIX_HERE}.{YOUR_DNS_NAME} --zone={YOUR_ZONE} --type="A" --ttl="300" --rrdatas={RESERVED_STATIC_IP}