Déployer une application Quarkus dans Cloud Run
Quarkus est un framework de développement de microservice pensé pour le cloud et les conteneurs.
Il est pensé pour avoir une utilisation mémoire réduite et un temps de démarrage le plus court possible.
Il se base principalement sur des standards (Jakarta EE, Eclipse MicroProfile, …) et permet l’utilisation de librairies Java matures et très répandues via ses extensions (Hibernate, RESTeasy, Vert.X, Kafka, …).
Quarkus a été pensé pour le cloud dès sa conception, il permet le développement d’applications Cloud Ready (tel que défini par le principe des applications 12 Factors ) et Cloud Native (utilisation les capacités des clouds publics pour développer vos applications).
Google Cloud Run est une solution de Container As A Service qui permet d’exécuter des services d’interface et de backend, des jobs par lot, des LLM hôtes et des charges de travail de traitement de file d’attente sans avoir à gérer l’infrastructure.
Quarkus est donc une bonne solution pour développer une application à déployer dans Cloud Run.
Créer une application Quarkus
Première étape, créer une application Quarkus:
quarkus create app quarkus-cloud-run
Le projet sera généré dans un répertoire quarkus-cloud-run, déplacez-vous à la racine de celui-ci puis lancer l’application via quarkus dev.
Vous pouvez tester l’application via curl localhost:8080/hello.
Une application Quarkus peut fonctionner dans une JVM ou comme une application native, nous allons ici choisir un déploiment en image native qui est plus adapté aux déploiements cloud.
Pour builder l’application en image native, vous pouvez utiliser la commande suivante :
cp src/main/docker/Dockerfile.native Dockerfile quarkus build --native
Déployer dans Google Cloud Run
Par défaut, gcloud va envoyer tous les fichiers de votre application sauf ceux définis dans votre .gitignore pour packager votre application, vous pouvez ajouter dans un fichier .gcloudignore des répertoires ou fichier à ignorer, par exemple le répertoire de l’application : src/.
Pour créer un conteneur, nous allons utiliser le Dockerfile fournit par Quakus dans src/main/docker/Dockerfile.native, il suffit de le copier à la racine pour qu’il soit utilisé par défaut :
cp src/main/docker/Dockerfile.native Dockerfile
Attention : ce Dockerfile contient une directive qui n’est pas compatible avec Cloud Build, il faut en modifier la directive COPY pour en retirer les options --chown et chmod :
COPY target/*-runner /work/application
Cloud Build peut packager votre application et la mettre à disposition de Cloud Run dans la container registry de Google Cloud. Vous pouvez utiliser la commande suivante qui va utiliser par défaut le Dockerfile situé à la racine de votre application :
gcloud builds submit --tag gcr.io/PROJECT-ID/quarkus-cloud-run
Une fois le build terminé, vous pouvez lancer votre application via Cloud Run grâce à la commande suivante qui va utiliser pour cela le conteneur précédemment créer par Cloud Build:
gcloud run deploy --image gcr.io/PROJECT-ID/quarkus-cloud-run
Une fois l’application déployée, gcloud va afficher dans ses logs le Service URL qui nous permet d’accéder à l’application.
Vous pouvez tester l’application via curl SERVICE_URL/hello.
Ajouter un Health Check
Cloud Run supporte l’utilisation de Health Check sous forme de startup probe, liveness probe et readiness probe.
Quarkus supporte les Health Check via l’extension SmallRye Health, vous pouvez l’ajouter à votre application via :
quarkus extension add smallrye-health
Il faut ensuite builder de nouveau l’application :
quarkus build --native gcloud builds submit --tag gcr.io/PROJECT-ID/quarkus-cloud-run
Lors du déploiement, il faut spécifier à Cloud Run les health checks de l’application, ici, j’ai uniquement spécifié une startup probe :
gcloud run deploy --image gcr.io/PROJECT-ID/quarkus-cloud-run \ --startup-probe httpGet.path=/q/health/started,httpGet.port=8080
Quarkus expose différentes endpoints pour health check :
- /q/health/started
- /q/health/live
- /q/health/ready
Vous pouvez les utiliser pour les différents health checks supportés par Cloud Run. Plus d’information sur les health checks de cloud run et la manière de les déclarer ici.
Si vous appelez le endpoint /q/health/started utilisé par Cloud Run comme startup probe, vous devrez avoir une réponse comme celle-ci :
{
"status": "UP",
"checks": [
]
}