Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

25 anni fa Java è entrato a far parte delle masse di programmatori, diventando alla fine uno dei pilastri attorno ai quali si costruiscono gli stack delle applicazioni. Tuttavia, oggi molte persone e organizzazioni, fedeli a Java da anni, stanno passando o pensando di passare a una piattaforma Kubernetes o ai suoi derivati, come Red Hat OpenShift o Amazon EKS.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Purtroppo, Kubernetes ha una curva di apprendimento ripida e introduce un ulteriore livello operativo nel processo di sviluppo familiare per i programmatori Java. Oggi parleremo di come utilizzare Eclipse JKube, per semplificare queste operazioni aggiuntive legate a Kubernetes e ai container, oltre a garantire una migrazione indolore verso una piattaforma cloud mantenendo l'ecosistema Java usuale. Inoltre, mostreremo come distribuire applicazioni Java sulla piattaforma OpenShift utilizzando il plugin OpenShift Maven.

Il processo tradizionale di sviluppo Java

Il processo tradizionale di sviluppo Java (Fig. 1) implica che il programmatore scriva il codice, poi crei unità di distribuzione sotto forma di file JAR o WAR e infine distribuisca ed esegua questi file su un server web o un server applicativo. Fondamentalmente, ciò viene realizzato tramite Maven dalla riga di comando o utilizzando IDE come IntelliJ o Eclipse, per codificare e impacchettare le applicazioni. Gli sviluppatori sono abituati a apportare modifiche al codice e a testare tutto accuratamente prima di archiviare il codice e inviarlo al sistema di gestione delle versioni.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Fig. 1. Processo tradizionale di sviluppo Java.

Il processo di sviluppo Java per il cloud

Passando alle applicazioni cloud, la schematizzazione sopra descritta aggiunge Kubernetes e container. Pertanto, ora il programmatore deve impacchettare le applicazioni Java in immagini di container e creare manifesti Kubernetes che descrivono queste immagini. Questi manifesti vengono quindi applicati al server di produzione dove opera Kubernetes. A sua volta, Kubernetes preleva queste immagini dal registro e distribuisce le applicazioni secondo le configurazioni che abbiamo specificato nei manifesti, che di solito sono file YAML.

La metamorfosi del processo tradizionale di sviluppo Java nel passaggio al cloud è mostrata nella Fig. 2.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Fig. 2. Processo di sviluppo Java per il cloud.

Eclipse JKube

Il passaggio a Kubernetes aggiunge un ulteriore livello operativo al processo di sviluppo, e molti sviluppatori ne sono nervosi, poiché vogliono concentrarsi sul loro lavoro principale – la logica delle applicazioni – e non su come distribuirle. E qui entra in gioco Eclipse JKube, che consente agli sviluppatori di utilizzare le proprie librerie e plugin (JKube Kit insieme a Kubernetes Maven Plugin o OpenShift Maven Plugin), per eseguire senza sforzi le operazioni relative ai contenitori e a Kubernetes, seguendo lo schema mostrato in Fig. 2.

Nella parte restante di questo articolo, mostreremo come semplificare il processo di sviluppo di Java in un ambiente Kubernetes utilizzando Eclipse JKube con il plugin Kubernetes Maven Plugin.

Il processo di sviluppo per il cloud utilizzando Eclipse JKube

Consideriamo uno schema leggermente modificato dello sviluppo Java per il cloud con la Fig. 2, integrando Eclipse JKube e il Kubernetes Maven Plugin, come mostrato in Fig. 3.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Fig. 3. Processo di sviluppo Java per il cloud utilizzando Eclipse JKube.

Come possiamo vedere, tutte le operazioni di interazione con Kubernetes e i contenitori (evidenziate in rosso nello schema) vengono sostituite dai goal predefiniti di Eclipse JKube, che sono elencati nella Tab. 1.

Tab. 1. Obiettivi predefiniti di Eclipse JKube.

Compito
Fase
Descrizione

k8s:build
PRE_INTEGRATION_TEST
Costruzione delle immagini docker

k8s:push
INSTALL
Invio delle immagini docker nel registry

k8s:resource
PROCESS_RESOURCES
Generazione dei manifest K8s

k8s:apply
COMPILE
Applicazione dei manifest generati a K8s

k8s:undeploy
UNDEPLOY
Rimozione delle risorse K8s che sono state distribuite tramite k8s:apply e k8s:deploy

Nota: Se non si desidera che gli obiettivi utilizzino queste impostazioni predefinite rigide (opinionated defaults), è possibile configurare manualmente Eclipse JKube secondo le proprie esigenze, dato che supporta la configurazione tramite XML e risorse.

Ora consideriamo alcuni esempi di utilizzo di Eclipse JKube e del Kubernetes Maven Plugin nel lavoro con le app.

Distribuiamo un'app Java in Kubernetes utilizzando Eclipse JKube

In questo esempio, distribuiremo una semplice applicazione Java nel cluster Minikube utilizzando Eclipse JKube. Usando il Kubernetes Maven Plugin, possiamo specificare i parametri di distribuzione senza dover definire alcuna configurazione.

Come esempio di applicazione utilizziamo un semplice generatore di numeri casuali, che restituisce un output JSON all'endpoint /random:

~\/work\/repos\/eclipse-jkube-demo-project : $ curl localhost:8080\/random | jq .
  % Totale    % Ricevuto % Trasferito  Velocità Media   Tempo    Tempo     Tempo  Corrente
                                 Scarico  Carico   Totale   Trascorso    Rimanente  Velocità
100    45    0    45    0     0    818      0 --:--:-- --:--:-- --:--:--   818
{
  "id": "e80a4d10-c79b-4b9a-aaac-7c286cb37f3c"
}

Passo 1. Carichiamo il Plugin Maven Kubernetes

Il Plugin Maven Kubernetes si trova nel repository Maven Central Repository. Per utilizzare Eclipse JKube è necessario aggiungere il Plugin Maven Kubernetes al proprio pom.xml come dipendenza:

org.eclipse.jkube
     kubernetes-maven-plugin
     ${jkube.version}

Se invece di Kubernetes puro si utilizza OpenShift, il pom.xml viene modificato nel seguente modo:

org.eclipse.jkube
     openshift-maven-plugin
     ${jkube.version}

Passo 2. Costruiamo l'immagine Docker

Il file JAR dell'applicazione può essere costruito con il comando mvn package, dopodiché si può usare il goal mvn k8s:build per creare l'immagine Docker di questa applicazione. Si noti che abbiamo sovrascritto il nome dell'immagine predefinito utilizzando la seguente proprietà:

docker.io/rohankanojia/random-generator:${project.version}

Prima di costruire l'immagine, è necessario assicurarsi che il demone Docker sia esposto correttamente. Questo può essere fatto con il seguente comando:

$ eval $(minikube docker-env)

Dopo, inseriamo il comando mvn k8s:build, ecco cosa vedremo sullo schermo durante la costruzione dell'immagine Docker con il task di build di Eclipse JKube:

~/work/repos/eclipse-jkube-demo-project : $ mvn k8s:build
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] k8s: Running in Kubernetes mode
[INFO] k8s: Building Docker image in Kubernetes mode
[INFO] k8s: Running generator spring-boot
[INFO] k8s: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] k8s: [docker.io/rohankanojia/random-generator:0.0.1] "spring-boot": Created docker-build.tar in 251 milliseconds
[INFO] k8s: [docker.io/rohankanojia/random-generator:0.0.1] "spring-boot": Built image sha256:a20e5
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.053 s
[INFO] Finished at: 2020-08-10T11:28:23+05:30
[INFO] ------------------------------------------------------------------------
~/work/repos/eclipse-jkube-demo-project : $

Passo 3. Inviamo l'immagine al registro Docker

Dopo aver costruito l'immagine Docker con il registro di push impostato (nel nostro caso docker.io), possiamo inviare quest'immagine al registro. Ecco cosa apparirà sullo schermo dopo aver chiesto a Eclipse JKube di eseguire il task di push mvn k8s:push:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:push
[INFO] Scansione dei progetti...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Costruzione di random-generator 0.0.1
[INFO] -------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:push (default-cli) @ random-generator ---
[INFO] k8s: Esecuzione in modalità Kubernetes
[INFO] k8s: Creazione dell'immagine Docker in modalità Kubernetes
[INFO] k8s: Esecuzione del generatore spring-boot
[INFO] k8s: spring-boot: Utilizzo dell'immagine Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 come base \/ builder
[INFO] k8s: Il push si riferisce al repository [docker.io\/rohankanojia\/random-generator]
5dcd9556710f: Layer già esistente 
b7139ad07aa8: Layer già esistente 
b6f081e4b2b6: Layer già esistente 
d8e1f35641ac: Layer già esistente 
[INFO] k8s: 0.0.1: digest: sha256:9f9eda2a13b8cab1d2c9e474248500145fc09e2922fe3735692f9bda4c76002d dimensione: 1162
[INFO] k8s: Caricato docker.io\/rohankanojia\/random-generator:0.0.1 in 7 secondi 
[INFO] ------------------------------------------------------------------------
[INFO] COSTRUZIONE RIUSCITA
[INFO] ------------------------------------------------------------------------
[INFO] Tempo totale:  11.222 s
[INFO] Terminato alle: 2020-08-10T11:35:37+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ 

Dopo aver inviato l'immagine, è necessario verificare che sia stata caricata nel registro. Nel nostro caso, possiamo semplicemente vederla in Docker Hub, come mostrato in Fig. 4.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Fig. 4. L'immagine inviata al registro è apparsa in Docker Hub.

Passaggio 4. Generiamo i manifesti delle risorse Kubernetes per l'applicazione

Quindi, abbiamo costruito l'immagine dell'applicazione, ora dobbiamo scrivere i manifesti Kubernetes. A tal fine, in Eclipse JKube c'è un'attività che genera manifesti rigidi delle risorse, basandosi sul framework Java sottostante (Spring Boot, Quarkus, Vert.x o qualsiasi altro). È anche possibile configurare il manifesto utilizzando un file XML di configurazione e posizionando frammenti raw (frammenti del manifesto delle risorse richieste) nella cartella dell'applicazione src\/main\/jkube. In tal caso, la vostra configurazione sarà iniettata nei manifesti generati.

Nel nostro esempio, lasciamo tutto così com'è, e quindi Eclipse JKube genera un manifesto per il deployment predefinito e per il servizio di tipo ClusterIP. Successivamente, modifichiamo il manifesto del servizio per cambiare il tipo di servizio in NodePort. È possibile sovrascrivere il comportamento predefinito utilizzando la seguente proprietà:

NodePort

Ecco come appare l'output a schermo dopo che chiediamo a Eclipse JKube di eseguire il task delle risorse mvn k8s:resource.

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:resource
[INFO] Scansione dei progetti...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Creazione random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:resource (default-cli) @ random-generator ---
[INFO] k8s: Esecuzione del generatore spring-boot
[INFO] k8s: spring-boot: Utilizzo dell'immagine Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 come base \/ builder
[INFO] k8s: jkube-controller: Aggiunta di un Deployment predefinito
[INFO] k8s: jkube-service: Aggiunta di un servizio predefinito 'random-generator' con porte [8080]
[INFO] k8s: jkube-healthcheck-spring-boot: Aggiunta di un probe di prontezza sulla porta 8080, percorso='\/actuator\/health', schema='HTTP', con un ritardo iniziale di 10 secondi
[INFO] k8s: jkube-healthcheck-spring-boot: Aggiunta di un probe di vitalità sulla porta 8080, percorso='\/actuator\/health', schema='HTTP', con un ritardo iniziale di 180 secondi
[INFO] k8s: jkube-revision-history: Aggiunta di un limite alla cronologia delle revisioni di 2
[INFO] ------------------------------------------------------------------------
[INFO] COSTRUZIONE RIUSCITA
[INFO] ------------------------------------------------------------------------
[INFO] Tempo totale:  3.344 s
[INFO] Completato il: 2020-08-10T11:38:11+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ ls target\/classes\/META-INF\/jkube\/kubernetes
random-generator-deployment.yml  random-generator-service.yml
~\/work\/repos\/eclipse-jkube-demo-project : $ cat target\/classes\/META-INF\/jkube\/kubernetes\/random-generator-deployment.yml | head -n10
---
apiVersion: apps\/v1
kind: Deployment
metadata:
  annotations:
    jkube.io\/git-url: git@github.com:rohanKanojia\/eclipse-jkube-demo-project.git
    jkube.io\/git-commit: 1ef9ef2ef7a6fcbf8eb64c293f26f9c42d026512
    jkube.io\/git-branch: master
    jkube.io\/scm-url: https:\/\/github.com\/spring-projects\/spring-boot\/spring-boot-starter-parent\/random-generator
    jkube.io\/scm-tag: HEAD
~\/work\/repos\/eclipse-jkube-demo-project : $

Passo 5. Distribuiamo l'applicazione nel cluster Kubernetes

Ora abbiamo tutto pronto per eseguire il deployment dell'applicazione: abbiamo generato la sua immagine e poi abbiamo generato automaticamente i manifesti delle risorse. Ora non resta che applicare tutto ciò al cluster Kubernetes. Per distribuire l'applicazione, ovviamente, possiamo utilizzare il comando kubectl apply -f, ma il plugin può farlo per noi. Ecco cosa apparirà sullo schermo dopo che avremo chiesto a Eclipse JKube di eseguire il compito di apply mvn k8s:apply:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:apply
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] k8s: Using Kubernetes at https://192.168.39.145:8443/ in namespace default with manifest /home/rohaan/work/repos/eclipse-jkube-demo-project/target/classes/META-INF/jkube/kubernetes.yml 
[INFO] k8s: Using namespace: default
[INFO] k8s: Creating a Service from kubernetes.yml namespace default name random-generator
[INFO] k8s: Created Service: target/jkube/applyJson/default/service-random-generator.json
[INFO] k8s: Creating a Deployment from kubernetes.yml namespace default name random-generator
[INFO] k8s: Created Deployment: target/jkube/applyJson/default/deployment-random-generator.json
[INFO] k8s: HINT: Use the command `kubectl get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  7.306 s
[INFO] Finished at: 2020-08-10T11:40:57+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get pods -w
NAME                                                     READY   STATUS             RESTARTS   AGE
random-generator-58b7847d7f-9m9df                        0\/1     Running            0          7s
random-generator-58b7847d7f-9m9df                        1\/1     Running            0          17s
^C~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get svc
NAME                                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
io-openliberty-sample-getting-started   NodePort    10.110.4.104            9080:30570\/TCP    44h
kubernetes                              ClusterIP   10.96.0.1               443\/TCP           18d
random-generator                        NodePort    10.97.172.147           8080:32186\/TCP    22s
~\/work\/repos\/eclipse-jkube-demo-project : $ curl `minikube ip`:32186\/random | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45    0    45    0     0   1800      0 --:--:-- --:--:-- --:--:--  1875
{
  "id": "42e5571f-a20f-44b3-8184-370356581d10"
}

Passo 6. Eseguiamo l'undeploy dell'applicazione dal cluster Kubernetes

Per questo si utilizza il compito undeploy, che elimina semplicemente tutte le risorse che sono state applicate nel passaggio precedente, ovvero durante l'esecuzione del compito apply. Ecco cosa vedremo sullo schermo dopo che chiederemo a Eclipse JKube di eseguire il compito di undeploy mvn k8s:undeploy:

~/work/repos/eclipse-jkube-demo-project : $ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/random-generator-58b7847d7f-9m9df   1/1     In esecuzione   0          5m21s

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes         ClusterIP   10.96.0.1               443/TCP          18d
service/random-generator   NodePort    10.97.172.147           8080:32186/TCP   5m21s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/random-generator   1/1     1            1           5m21s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/random-generator-58b7847d7f   1         1         1       5m21s
~/work/repos/eclipse-jkube-demo-project : $ mvn k8s:undeploy
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:undeploy (default-cli) @ random-generator ---
[INFO] k8s: Using Kubernetes at https://192.168.39.145:8443/ in namespace default with manifest /home/rohaan/work/repos/eclipse-jkube-demo-project/target/classes/META-INF/jkube/kubernetes.yml 
[INFO] k8s: Using namespace: default
[INFO] k8s: Deleting resource Deployment default/random-generator
[INFO] k8s: Deleting resource Service default/random-generator
[INFO] k8s: HINT: Use the command `kubectl get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.412 s
[INFO] Finished at: 2020-08-10T11:46:22+05:30
[INFO] ------------------------------------------------------------------------
~/work/repos/eclipse-jkube-demo-project : $ kubectl get pods -w
^C~/work/repos/eclipse-jkube-demo-project : $ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1            443/TCP   18d
~/work/repos/eclipse-jkube-demo-project : $

Cosa altro si può fare con Eclipse JKube

Quindi, abbiamo esaminato i principali obiettivi di Eclipse JKube e del Kubernetes Maven Plugin, che semplificano lo sviluppo di applicazioni Java per la piattaforma Kubernetes. Se non vuoi digitare continuamente questi obiettivi, puoi scriverli nella configurazione del plugin, ad esempio, in questo modo:

org.eclipse.jkube
     kubernetes-maven-plugin
     ${project.version}
     
         
             
                  build
                  resource
                  apply

Va detto che in questo articolo abbiamo esaminato solo alcune delle possibili operazioni, disponibili in Eclipse JKube e nel Kubernetes Maven Plugin, pertanto presentiamo nella Tab.2 un elenco di ulteriori attività che potrebbero esserti utili.

Tab. 2. Ulteriori operazioni disponibili in Eclipse JKube.

Compito
Fase
Descrizione

k8s:log
VALIDATE
recuperare i log da un'applicazione in esecuzione su Kubernetes.

k8s:debug
PACKAGE
Apertura della porta di debug per eseguire il debug dell'applicazione in esecuzione su Kubernetes direttamente dall'IDE.

k8s:deploy
INSTALL
Creazione di un fork per il task di installazione e applicazione dei manifesti generati al cluster Kubernetes proprio come nel caso del task apply.

k8s:watch
PACKAGE
Distribuzione automatica e istantanea dell'applicazione monitorando il suo namespace.

Distribuzione di applicazioni Java su Red Hat OpenShift utilizzando OpenShift Maven Plugin.

Per distribuire l'applicazione dal nostro esempio sulla piattaforma Red Hat OpenShift, utilizzeremo il plugin OpenShift Maven. L'unica differenza sarà che il prefisso dei task cambierà da k8s a oc. Per impostazione predefinita, il plugin Kubernetes Maven esegue docker-build, mentre il plugin OpenShift Maven esegue build. S2I. Non apportiamo alcuna modifica al nostro progetto, ad eccezione della rimozione della proprietà jkube.generator.name, poiché non è necessaria quando si invia al registro (nella fase di build, OpenShift colloca l'immagine nel suo registro interno). Ecco cosa apparirà sullo schermo quando eseguiremo il nostro esempio, in cui, a proposito, eseguiamo i goal dei task non uno alla volta, ma tutti insieme:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn oc:build oc:resource oc:apply
[INFO] Scansione dei progetti in corso...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Creazione di random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] oc: Utilizzando la build di OpenShift con strategia S2I
[INFO] oc: Esecuzione in modalità OpenShift
[INFO] oc: Esecuzione del generatore spring-boot
[INFO] oc: spring-boot: Utilizzo dell'immagine Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 come base \/ builder
[INFO] oc: [random-generator:0.0.1] "spring-boot": Creata tar sorgente docker \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/docker\/random-generator\/0.0.1\/tmp\/docker-build.tar
[INFO] oc: Aggiunta a Secret pullsecret-jkube
[INFO] oc: Utilizzo del Secret pullsecret-jkube
[INFO] oc: Creazione di BuildServiceConfig random-generator-s2i per la build di sorgente
[INFO] oc: Creazione di ImageStream random-generator
[INFO] oc: Avvio della build random-generator-s2i
[INFO] oc: In attesa che la build random-generator-s2i-1 si completi...
[INFO] oc: Memorizzazione dei blob in "\/var\/cache\/blobs".
[INFO] oc: Ottenimento delle firme delle sorgenti delle immagini
[INFO] oc: Copia del blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copia del blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copia del blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copia della configurazione sha256:52d6788fcfdd39595264d34a3959464a5dabc1d4ef0ae188802b20fc2d6a857b
[INFO] oc: Scrittura del manifesto nella destinazione dell'immagine
[INFO] oc: Memorizzazione delle firme
[INFO] oc: Generazione del Dockerfile con l'immagine builder quay.io\/jkube\/jkube-java-binary-s2i:0.0.7
[INFO] oc: PASSO 1: DA quay.io\/jkube\/jkube-java-binary-s2i:0.0.7
[INFO] oc: PASSO 2: ETICHETTA "io.openshift.build.source-location"="\/tmp\/build\/inputs"       "io.openshift.build.image"="quay.io\/jkube\/jkube-java-binary-s2i:0.0.7"
[INFO] oc: PASSO 3: ENV JAVA_APP_DIR="\/deployments"     OPENSHIFT_BUILD_NAME="random-generator-s2i-1"     OPENSHIFT_BUILD_NAMESPACE="default"
[INFO] oc: PASSO 4: UTENTE root
[INFO] oc: PASSO 5: COPIA upload\/src \/tmp\/src
[INFO] oc: PASSO 6: ESEGUI chown -R 1000:0 \/tmp\/src
[INFO] oc: PASSO 7: UTENTE 1000
[INFO] oc: PASSO 8: ESEGUI \/usr\/local\/s2i\/assemble
[INFO] oc: INFO Build S2I sorgente con binari semplici rilevato
[INFO] oc: INFO Build S2I binaria da fabric8-maven-plugin rilevato
[INFO] oc: INFO Copia dei binari da \/tmp\/src\/deployments a \/deployments ...
[INFO] oc: random-generator-0.0.1.jar
[INFO] oc: INFO Copia delle distribuzioni da deployments a \/deployments...
[INFO] oc: '\/tmp\/src\/deployments\/random-generator-0.0.1.jar' -> '\/deployments\/random-generator-0.0.1.jar'
[INFO] oc: PASSO 9: CMD \/usr\/local\/s2i\/run
[INFO] oc: PASSO 10: IMPEGNARE temp.builder.openshift.io\/default\/random-generator-s2i-1:48795e41
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Mismatch nel sistema operativo dell'immagine: l'immagine usa "", aspettandosi "linux""
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Mismatch nell'architettura dell'immagine: l'immagine usa "", aspettandosi "amd64""
[INFO] oc: Ottenimento delle firme delle sorgenti delle immagini
[INFO] oc: Copia del blob sha256:d8e1f35641acb80b562f70cf49911341dfbe8c86f4d522b18efbf3732aa74223
[INFO] oc: Copia del blob sha256:b6f081e4b2b6de8be4b1dec132043d14c121e968384dd624fb69c2c07b482edb
[INFO] oc: Copia del blob sha256:b7139ad07aa8ce4ed5a132f7c5cc9f1de0f5099b5e155027a23d57f7fbe78b16
[INFO] oc: Copia del blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copia della configurazione sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Scrittura del manifesto nella destinazione dell'immagine
[INFO] oc: Memorizzazione delle firme
[INFO] oc: --> 27aaadaf28e
[INFO] oc: 27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Ottenimento delle firme delle sorgenti delle immagini
[INFO] oc: 
[INFO] oc: Invio dell'immagine image-registry.openshift-image-registry.svc:5000\/default\/random-generator:0.0.1 ...
[INFO] oc: Copia del blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copia del blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copia del blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copia del blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copia della configurazione sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Scrittura del manifesto nella destinazione dell'immagine
[INFO] oc: Memorizzazione delle firme
[INFO] oc: Immagine-invio avvenuto con successo image-registry.openshift-image-registry.svc:5000\/default\/random-generator@sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: Invio avvenuto con successo
[INFO] oc: Build random-generator-s2i-1 nello stato Completo
[INFO] oc: Trovato tag su ImageStream random-generator tag: sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: ImageStream random-generator scritto in \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/random-generator-is.yml
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:resource (default-cli) @ random-generator ---
[INFO] oc: Utilizzo del nome dell'immagine docker dello spazio dei nomi: default
[INFO] oc: Esecuzione del generatore spring-boot
[INFO] oc: spring-boot: Utilizzo dell'immagine Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 come base \/ builder
[INFO] oc: jkube-controller: Aggiunta di un DeploymentConfig predefinito
[INFO] oc: jkube-service: Aggiunta di un servizio predefinito 'random-generator' con porte [8080]
[INFO] oc: jkube-healthcheck-spring-boot: Aggiunta della probe di prontezza sulla porta 8080, percorso='\/actuator\/health', schema='HTTP', con un ritardo iniziale di 10 secondi
[INFO] oc: jkube-healthcheck-spring-boot: Aggiunta della probe di liveness sulla porta 8080, percorso='\/actuator\/health', schema='HTTP', con un ritardo iniziale di 180 secondi
[INFO] oc: jkube-revision-history: Aggiunta del limite della cronologia delle revisioni a 2
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] oc: Utilizzo di OpenShift su https:\/\/api.crc.testing:6443\/ nello spazio dei nomi default con manifesto \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/classes\/META-INF\/jkube\/openshift.yml 
[INFO] oc: Piattaforma OpenShift rilevata
[INFO] oc: Utilizzo del progetto: default
[INFO] oc: Creazione di un servizio da openshift.yml spazio dei nomi default nome random-generator
[INFO] oc: Servizio creato: target\/jkube\/applyJson\/default\/service-random-generator.json
[INFO] oc: Creazione di un DeploymentConfig da openshift.yml spazio dei nomi default nome random-generator
[INFO] oc: DeploymentConfig creato: target\/jkube\/applyJson\/default\/deploymentconfig-random-generator.json
[INFO] oc: Creazione di Route default:random-generator host: null
[INFO] oc: HINT: Utilizza il comando `oc get pods -w` per monitorare l'avvio dei tuoi pods
[INFO] ------------------------------------------------------------------------
[INFO] BUILD RIUSCITO
[INFO] ------------------------------------------------------------------------
[INFO] Tempo totale:  01:07 min
[INFO] Terminato alle: 2020-08-10T12:08:00+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ oc get pods -w
NOME                           PRONTO     STATO      RISTARTS   ETA
random-generator-1-deploy      1\/1       Esecuzione     0          14s
random-generator-1-vnrm9       0\/1       Esecuzione     0          11s
random-generator-s2i-1-build   0\/1       Completato   0          1m
random-generator-1-vnrm9   1\/1       Esecuzione   0         24s
random-generator-1-deploy   0\/1       Completato   0         28s
~\/work\/repos\/eclipse-jkube-demo-project : $ oc get routes
NOME                HOST\/PORT                                    PERCORSO      SERVIZI            PORTA      TERMINAZIONE   WILDCARD
random-generator    random-generator-default.apps-crc.testing              random-generator    8080                    Nessuno
~\/work\/repos\/eclipse-jkube-demo-project : $ curl random-generator-default.apps-crc.testing\/random 
  % Totale    % Ricevuto % Trasferito  Media Velocità   Tempo    Tempo     Tempo  Corrente
                                 Dscarica  Carica   Totale   Speso   Rimasto  Velocità
100    45    0    45    0     0   1666      0 --:--:-- --:--:-- --:--:--  1730
{
  "id": "d80052d9-2f92-43cb-b9eb-d7cffb879798"
}
~\/work\/repos\/eclipse-jkube-demo-project : $

Video-lezione

Per saperne di più su come semplificare lo sviluppo Kubernetes con Eclipse JKube, guarda la video-lezione su come distribuire rapidamente una semplice applicazione Spring Boot su Minikube:

Guarda il video

Conclusione

In questo articolo abbiamo mostrato come Eclipse JKube faciliti la vita ai programmatori Java quando lavorano con Kubernetes. Maggiori informazioni su Eclipse JKube possono essere trovate su sito del progetto e su GitHub.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster