Deploy di un'applicazione Quarkus su OpenShift

banner

Per effettuare il deploy dell’applicazione Quarkus su OpenShift, è necessario eseguire i seguenti passaggi:

  1. effettuare il login sul cluster OpenShift fornito dalla Developer Sandbox di Red Hat;

  2. build e deploy dell’applicazione Quarkus su OpenShift;

Per eseguire il login sul cluster OpenShift fornito dalla Developer Sandbox di Red Hat, è necessario eseguire il comando oc login in due possibili modalità: tramite username e password o tramite token. A seguire i comandi per effettuare il login sul cluster OpenShift.

# Login tramite username e password (richiesta dopo l'esecuzione del comando)
oc login -u myusername

# Login tramite token (via preferenziale)
oc login --token=<tuo-token> --server=<tuo-cluster>

Per ottenere il token di accesso al cluster OpenShift fornito dalla Developer Sandbox di Red Hat, è necessario accedere alla Developer Sandbox di Red Hat e cliccare sul pulsante Copy Login Command per copiare il comando di login che contiene il token di accesso al cluster OpenShift. A seguire un esempio di comando di login con token.

come ottenere login url1

Come ottenere il comando di login con token

come ottenere login url2

Pagina che mostra il Token API e il comando di login tramite OC e cURL

Se il login è andato a buon fine, dovreste vedere un messaggio simile a quello mostrato a seguire, dov’è indicato il nome del cluster OpenShift, l’utente con cui avete effettuato il login e il progetto di default in cui siete loggati.

come ottenere login url3

Messaggio di login completato con successo

Dopo aver effettuato il login sul cluster OpenShift, è possibile procedere con il processo di build e deploy dell’applicazione Quarkus su OpenShift. Per fare ciò, è necessario eseguire il comando mvn clean package -Dquarkus.openshift.deploy=true che effettuerà la build dell’applicazione Quarkus e il deploy su OpenShift. A seguire un esempio di output (parziale) del comando di build e deploy che mostra il buon esito dell’operazione.

Ricordo che, è sempre possibile monitorare l’operazione di build e deploy dell’applicazione Quarkus su OpenShift tramite la console Web di OpenShift o tramite la CLI di OpenShift. Per chi volesse vedere l’intera operazione di build e deploy dell’applicazione Quarkus su OpenShift, è possibile visualizzare l’asciinema Primo deploy su OpenShift dell’applicazione Quarkus Event Bus Logging Filter JAX-RS.

[INFO] Scanning for projects...
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Pushing image image-registry.openshift-image-registry.svc:5000/antonio-musarra-dev/eventbus-logging-filter-jaxrs:1.0.0-SNAPSHOT ...
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Getting image source signatures
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:dc4586ee36f78ddcdcf0f695ddfab9f607315ef196793fc7c00d96c196864290
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:eca9236fb686825c1ec7ba1f1b339f6300ed2d4fffdf50611dde66cb8f6eeaa9
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:dc35b837139a95d1b9f7f7b0435a024a74ab972416bdc248f3f608c9f917a753
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying config sha256:9df58fd4ebf70122955dbc07d06435e22ab1b3425b06538927f0c6cc38f2dc62
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Writing manifest to image destination
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Successfully pushed image-registry.openshift-image-registry.svc:5000/antonio-musarra-dev/eventbus-logging-filter-jaxrs@sha256:eaaa9125c441238b6940326ebd218c1873a0a270ffd5a218926390e079916c2c
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Push successful
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Deploying to openshift server: https://api.sandbox-m2.ll9k.p1.openshiftapps.com:6443/ in namespace: antonio-musarra-dev.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: Service eventbus-logging-filter-jaxrs.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: ImageStream openjdk-21.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: ImageStream eventbus-logging-filter-jaxrs.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: BuildConfig eventbus-logging-filter-jaxrs.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: Deployment eventbus-logging-filter-jaxrs.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: Route eventbus-logging-filter-jaxrs.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] The deployed application can be accessed at: http://eventbus-logging-filter-jaxrs-antonio-musarra-dev.apps.sandbox-m2.ll9k.p1.openshiftapps.com
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 235171ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  04:08 min
[INFO] Finished at: 2024-04-14T15:10:46+02:00
[INFO] ------------------------------------------------------------------------

L’operazione di build e in particolare quella di deploy potrebbe durare diversi minuti perché il plugin quarkus-openshift deve eseguire diverse operazioni sul cluster, tra cui la creazione di un certo numero di risorse quali: Deployment, Pods, Service, Route, ConfigMap,Secret oltre a l’immagine dell’applicazione Quarkus che viene caricata sul registry del cluster OpenShift. Da tenere anche in considerazione che la Developer Sandbox di Red Hat è un ambiente condiviso e quindi la velocità di risposta potrebbe variare in base al carico di lavoro del cluster. Nel mio caso l’operazione di build e deploy è durata circa 4 minuti.

Al termine dell’operazione di build e deploy, il comando di build e deploy restituirà l’URL dell’applicazione Quarkus su OpenShift. Per accedere all’applicazione Quarkus su OpenShift è sufficiente copiare l’URL e incollarlo nel browser.

Anche se build e deploy è stato completato con successo, siete del tutto sicuri che l’applicazione sia disponibile?

La risposta è negativa. Puntando alla URL dell’applicazione Quarkus, otterreste il messaggio di errore HTTP/503. Questo accade perché l’applicazione potrebbe non essere ancora pronta per ricevere il traffico. A seguire l’output mostrato dal comando curl -I http://eventbus-logging-filter-jaxrs-antonio-musarra-dev.apps.sandbox-m2.ll9k.p1.openshiftapps.com e dal browser che evidenziano proprio l’indisponibilità dell’applicazione.

HTTP/1.1 503 Service Unavailable
pragma: no-cache
cache-control: private, max-age=0, no-cache, no-store
content-type: text/html
Date: Sun, 14 Apr 2024 13:46:49 GMT
Connection: close

deploy openshift prima volta1

Messaggio di errore HTTP/503 mostrato dal browser per l’applicazione Quarkus non pronta

È probabile che molti di voi abbiano già intuito il motivo dell’indisponibilità dell’applicazione ma cerchiamo in ogni caso di capire il motivo di questa indisponibilità utilizzando la CLI di OpenShift e il modo di risolvere il problema. In questi casi la prima azione da compiere che potrebbe senza dubbio dare l’indicazione di ciò che sia andato storto, è la verifica degli eventi che sono accaduti durante il deploy dell’applicazione. Per fare ciò, è necessario eseguire il comando oc get events che restituirà l’elenco degli eventi accaduti durante il deploy. A seguire l’output del comando oc get events.

Le informazioni riportate dal comando oc get events mostrano che l’applicazione non è pronta per ricevere il traffico (Startup probe failed: HTTP probe failed with statuscode: 503). Questo accade perché l’applicazione non ha superato le probe di Startup; tra le altre cose il pod è stato ucciso e riavviato più volte (Back-off restarting failed container).

deploy openshift prima volta2

Output del comando oc get events per verificare il motivo per l’applicazione sia non pronta

Visto che il problema è sul pod dell’applicazione, è necessario verificare il motivo per cui l’applicazione non è pronta per ricevere il traffico. In questo caso possiamo andare a vedere direttamente il log del pod dell’applicazione per capire il motivo per cui l’applicazione non è pronta per ricevere il traffico. Per fare ciò, è necessario eseguire il comando oc logs <pod-name> che restituirà il log del pod dell’applicazione.

Dai log è evidente il motivo della non disponibilità dell’applicazione, ovvero la mancata connessione al broker AMQP. Questo accade perché l’applicazione Quarkus non è riuscita a connettersi al broker AMQP e quindi non è pronta per ricevere il traffico. Questa evidenza è anche confermata dal log della probe di Startup che mostra il fallimento della connessione al broker AMQP.

2024-04-14 14:19:33,709 ERROR [io.sma.rea.mes.amqp] (vert.x-eventloop-thread-0) SRMSG16215: Unable to connect to the broker, retry will be attempted: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:5672
Caused by: java.net.ConnectException: Connection refused
    at java.base/sun.nio.ch.Net.pollConnect(Native Method)
    at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:682)
    at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:973)
    at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:337)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:339)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:776)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:1583)

2024-04-14 14:19:36,100 INFO  [io.sma.rea.mes.amqp] (executor-thread-1) SRMSG16212: Establishing connection with AMQP broker
2024-04-14 14:19:36,543 INFO  [io.sma.health] (vert.x-eventloop-thread-1) SRHCK01001: Reporting health down status: {"status":"DOWN","checks":[{"name":"SmallRye Reactive Messaging - startup check","status":"DOWN","data":{"http-response-in":"[KO]","http-response-out":"[KO]","http-request-in":"[KO]","http-request-out":"[KO]"}}]}
2024-04-14 14:19:36,583 INFO  [io.quarkus] (Shutdown thread) eventbus-logging-filter-jaxrs stopped in 0.024s

Dopo questa breve analisi le idee dovrebbero essere più chiare. Se ricordate bene, l’applicazione ha delle dipendenze esterne, verso il database NoSQL MongoDB e verso il broker AMQP Apache ActiveMQ Artemis. Fino a quando siamo stati nella fase di sviluppo dell’applicazione, queste dipendenze non ci hanno dato problemi perché eravamo in un ambiente controllato e locale e per di più abbiamo fatto uso dei Dev Services di Quarkus che hanno reso trasparente per noi l’uso di queste dipendenze.

Passando all’ambiente di “produzione” o comunque diverso dal nostro ambiente di sviluppo locale, le cose sono cambiate, queste dipendenze non sono più disponibili e il plugin quarkus-openshift non crea i descrittori necessari per creare tutte le risorse indispensabili per tirare su le dipendenze sull’ambiente di deploy OpenShift.

Se andassimo a vedere il contenuto del file target/kubernetes/openshift.yml , all’interno non troveremmo nessuna risorsa per il broker AMQP Apache ActiveMQ Artemis e per il database NoSQL MongoDB. Questo è il motivo per cui l’applicazione non è pronta per ricevere il traffico, poiché non riesce a connettersi al broker AMQP Apache ActiveMQ Artemis e quindi non è pronta per ricevere il traffico.

Per risolvere il problema occorre quindi, creare le risorse per il broker AMQP Apache ActiveMQ Artemis e per il database NoSQL MongoDB sul cluster OpenShift e configurare opportunamente l’applicazione Quarkus per connettersi a queste risorse.

Risorse utili

Post correlati

#TheRedComics

Giugno

A cura di Sophie Aiello, copy di Chiara Romano

La dura vita di una madre tech - Meme

TheRedCode Digest

La tecnologia corre, e tu devi correre più veloce per rimanere sempre sul pezzo! 🚀

Riceverai una volta al mese (o anche meno) con codici sconto per partecipare agli eventi del settore, quiz per vincere dei gadget e i recap degli articoli più interessanti pubblicati sul blog

Ci sto!

Partners

Community, aziende e persone che supportano attivamente il blog

Logo di Codemotion
Logo di GrUSP
Logo di Python Milano
Logo di Schrodinger Hat
Logo di Python Biella Group
Logo di Fuzzy Brains
Logo di Django Girls
Logo di Improove
Logo del libro open source
Logo di NgRome
Logo de La Locanda del Tech

Vuoi diventare #tech content writer? 🖊️

Se vuoi raccontare la tua sul mondo #tech con dei post a tema o vuoi condividere la tua esperienza con la community, sei nel posto giusto! 😉

Manda una mail a collaborazioni[at]theredcode.it con la tua proposta e diventa la prossima penna del blog!

Ma sì, facciamolo!