Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Venticinque anni fa, Java ha iniziato a diffondersi tra i programmatori, diventando uno dei fondamenti su cui si costruiscono gli stack applicativi. Tuttavia, oggi molte persone e organizzazioni che per anni sono state fedeli a Java sono impegnate nel passaggio o nell'analisi di passaggio a piattaforme Kubernetes o alle sue derivate, come Red Hat OpenShift o Amazon EKS.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

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

Il processo tradizionale di sviluppo Java

Il processo di sviluppo tradizionale Java (Fig.1) implica che lo sviluppatore scrive codice, poi crea unità di distribuzione sotto forma di file JAR o WAR, e successivamente distribuisce ed esegue questi file su un server web o un server applicazioni. Per questo scopo, si utilizza principalmente Maven dalla riga di comando o si usano IDE come IntelliJ o Eclipse per codificare e impacchettare applicazioni. Gli sviluppatori sono abituati a apportare modifiche al codice e a testare accuratamente tutto prima di fissare il codice e inviarlo al sistema di controllo versione.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Fig. 1. Processo tradizionale di sviluppo Java.

Processo di sviluppo Java per il cloud

Passando alle applicazioni cloud, nella schema descritta sopra si aggiungono Kubernetes e container. Pertanto, ora lo sviluppatore deve impacchettare le applicazioni Java in immagini dei container e creare manifesti Kubernetes che descrivono queste immagini. Quindi, questi manifesti vengono 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 nel processo di sviluppo, e molti sviluppatori si sentono ansiosi, poiché vogliono concentrarsi sul loro lavoro principale – la logica delle applicazioni – piuttosto che sul modo in cui vengono distribuite. Qui entra in gioco Eclipse JKube, che consente agli sviluppatori di utilizzare le loro librerie e plugin (JKube Kit insieme a Kubernetes Maven Plugin o OpenShift Maven Plugin), per eseguire senza sforzo operazioni relative ai container e a Kubernetes, seguendo il diagramma mostrato nella Fig. 2.

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

Processo di sviluppo per il cloud utilizzando Eclipse JKube

Esaminiamo un diagramma leggermente modificato del processo di sviluppo Java per il cloud con la Fig. 2, introducendo Eclipse JKube e il Kubernetes Maven Plugin, come mostrato nella 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 task predefiniti di Eclipse JKube, elencati nella Tab. 1.

Tab. 1. Task 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 manifesti K8s

k8s:apply
COMPILE
Applicazione dei manifesti generati a K8s

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

Nota: Se non desideri che i task utilizzino queste rigide impostazioni predefinite (impostazioni opinionali), puoi configurare manualmente Eclipse JKube, poiché supporta la configurazione tramite XML e risorse.

Ora vediamo esempi di utilizzo di Eclipse JKube e del Kubernetes Maven Plugin quando lavoriamo con le applicazioni.

Distribuiamo un'applicazione Java in Kubernetes utilizzando Eclipse JKube

In questo esempio, distribuiremo una semplice applicazione Java nel cluster Minikube utilizzando Eclipse JKube. Con Kubernetes Maven Plugin, possiamo specificare i parametri di distribuzione senza dover scrivere 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
                                 Dload  Upload   Totale   Speso    Rimanente  Velocità
100    45    0    45    0     0    818      0 --:--:-- --:--:-- --:--:--   818
{
  "id": "e80a4d10-c79b-4b9a-aaac-7c286cb37f3c"
}

Passo 1. Carica il Kubernetes Maven Plugin

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

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

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

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

Passo 2. Costruisce l'immagine docker

Il file JAR dell'applicazione può essere costruito con il comando mvn package, e poi si può utilizzare il goal mvn k8s:build per costruire l'immagine docker di quest'applicazione. Si noti che abbiamo sovrascritto il nome dell'immagine predefinito utilizzando questa proprietà:

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

Prima di creare l'immagine, assicurati che il demone docker sia esposto correttamente. Puoi farlo con il seguente comando:

$ eval $(minikube docker-env)

Successivamente, immetti il comando mvn k8s:build, e vedrai quanto segue sullo schermo durante la costruzione dell'immagine docker utilizzando 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 nel registro docker

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

~/work/repos/eclipse-jkube-demo-project : $ mvn k8s:push
[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:push (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: The push refers to repository [docker.io/rohankanojia/random-generator]
5dcd9556710f: Layer already exists 
b7139ad07aa8: Layer already exists 
b6f081e4b2b6: Layer already exists 
d8e1f35641ac: Layer already exists 
[INFO] k8s: 0.0.1: digest: sha256:9f9eda2a13b8cab1d2c9e474248500145fc09e2922fe3735692f9bda4c76002d size: 1162
[INFO] k8s: Pushed docker.io/rohankanojia/random-generator:0.0.1 in 7 seconds 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11.222 s
[INFO] Finished at: 2020-08-10T11:35:37+05:30
[INFO] ------------------------------------------------------------------------
~/work/repos/eclipse-jkube-demo-project : $ 

Dopo aver inviato l'immagine, è necessario verificare che sia stata registrata. Nel nostro caso, la vediamo semplicemente su Docker Hub, come mostrato in Fig. 4.

Sviluppo di applicazioni Java per Kubernetes utilizzando Eclipse JKube

Fig. 4. L'immagine inviata è apparsa su Docker Hub.

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

Ora che abbiamo creato l'immagine dell'applicazione, 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 un altro). È anche possibile configurare il manifesto utilizzando un file XML di configurazione e posizionando frammenti raw (frammenti del manifesto delle risorse richieste) nella cartella src/main/jkube dell'applicazione. In tal caso, la tua configurazione verrà caricata nei manifesti generati.

Nel nostro esempio, lasciamo tutto com'è, quindi Eclipse JKube genera un manifesto per il deployment predefinito e per il servizio di tipo ClusterIP. In seguito, 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 dello schermo dopo aver richiesto a Eclipse JKube di eseguire il task resource mvn k8s:resource.

~/work/repos/eclipse-jkube-demo-project : $ mvn k8s:resource
[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:resource (default-cli) @ random-generator ---
[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: jkube-controller: Adding a default Deployment
[INFO] k8s: jkube-service: Adding a default service 'random-generator' with ports [8080]
[INFO] k8s: jkube-healthcheck-spring-boot: Adding readiness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 10 seconds
[INFO] k8s: jkube-healthcheck-spring-boot: Adding liveness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 180 seconds
[INFO] k8s: jkube-revision-history: Adding revision history limit to 2
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.344 s
[INFO] Finished at: 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. Distribuzione dell'applicazione nel cluster Kubernetes

Ora siamo pronti per procedere con la distribuzione dell'applicazione: abbiamo generato la sua immagine e poi automaticamente creato i manifesti delle risorse. Non resta che applicare tutto questo al cluster Kubernetes. Per distribuire l'applicazione, possiamo naturalmente utilizzare il comando kubectl apply -f, ma il plugin può farlo per noi. Ecco cosa apparirà sullo schermo dopo che chiederemo a Eclipse JKube di eseguire il task apply con 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. Effettuare l'undeploy dell'applicazione dal cluster Kubernetes

A tal fine si utilizza il task undeploy, che elimina semplicemente tutte le risorse applicate nel passaggio precedente, ovvero durante l'esecuzione del task apply. Ecco cosa vedremo sullo schermo dopo aver chiesto a Eclipse JKube di eseguire il task di undeploy mvn k8s:undeploy:

~/work/repos/eclipse-jkube-demo-project : $ kubectl get all
NOME                                    PRONTO   STATO    RIAVVII   ETÀ
pod/random-generator-58b7847d7f-9m9df   1/1     In esecuzione   0          5m21s

NOME                       TIPO        CLUSTER-IP      EXTERNAL-IP   PORT(I)          ETÀ
service/kubernetes         ClusterIP   10.96.0.1               443/TCP          18d
service/random-generator   NodePort    10.97.172.147           8080:32186/TCP   5m21s

NOME                               PRONTO   AGGIORNATO   DISPONIBILE   ETÀ
deployment.apps/random-generator   1/1     1            1           5m21s

NOME                                          DESIDERATO   ATTUALE   PRONTO   ETÀ
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
NOME                 TIPO        CLUSTER-IP   EXTERNAL-IP   PORT(I)   ETÀ
service/kubernetes   ClusterIP   10.96.0.1            443/TCP   18d
~/work/repos/eclipse-jkube-demo-project : $

Cosa altro si può fare con Eclipse JKube

Abbiamo visto 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 da tastiera, puoi scriverli nella configurazione del plugin, ad esempio in questo modo:

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

Vale la pena notare che in questo articolo non abbiamo trattato tutti gli obiettivi disponibili in Eclipse JKube e nel Kubernetes Maven Plugin, quindi riportiamo nella Tab. 2 un elenco di ulteriori obiettivi che potrebbero esserti utili.

Tab. 2. Ulteriori obiettivi di Eclipse JKube.

Compito
Fase
Descrizione

k8s:log
VALIDA
Ottenere i log dall'applicazione in esecuzione su Kubernetes.

k8s:debug
PACCHETTO
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 l'attività Install e applicazione dei manifesti generati al cluster Kubernetes proprio come nel caso dell'attività apply.

k8s:watch
PACCHETTO
Distribuzione automatica e immediata dell'applicazione tramite il monitoraggio del suo spazio dei nomi.

Distribuzione di applicazioni Java su Red Hat OpenShift utilizzando il plugin OpenShift Maven

Per distribuire l'applicazione dal nostro esempio sulla piattaforma Red Hat OpenShift, utilizziamo il plugin OpenShift Maven. L'unica differenza sarà che il prefisso delle attività cambierà da k8s a oc. Per default, il plugin Kubernetes Maven esegue docker-build, mentre il plugin OpenShift Maven esegue build S2I. Non apportiamo modifiche al nostro progetto, tranne che per rimuovere la proprietà jkube.generator.name, poiché non è necessaria durante l'invio al registro (nella fase di build OpenShift posiziona l'immagine nel proprio registro interno). Ecco cosa apparirà sullo schermo quando eseguiamo il nostro esempio, nel quale, tra l'altro, eseguiamo l'obiettivo delle attività non una alla volta, ma tutte insieme:

~/work/repos/eclipse-jkube-demo-project : $ mvn oc:build oc:resource oc:apply
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] oc: Using OpenShift build with strategy S2I
[INFO] oc: Running in OpenShift mode
[INFO] oc: Running generator spring-boot
[INFO] oc: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] oc: [random-generator:0.0.1] "spring-boot": Created docker source tar /home/rohaan/work/repos/eclipse-jkube-demo-project/target/docker/random-generator/0.0.1/tmp/docker-build.tar
[INFO] oc: Adding to Secret pullsecret-jkube
[INFO] oc: Using Secret pullsecret-jkube
[INFO] oc: Creating BuildServiceConfig random-generator-s2i for Source build
[INFO] oc: Creating ImageStream random-generator
[INFO] oc: Starting Build random-generator-s2i
[INFO] oc: Waiting for build random-generator-s2i-1 to complete...
[INFO] oc: Caching blobs under "/var/cache/blobs".
[INFO] oc: Getting image source signatures
[INFO] oc: Copying blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copying blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copying blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copying config sha256:52d6788fcfdd39595264d34a3959464a5dabc1d4ef0ae188802b20fc2d6a857b
[INFO] oc: Writing manifest to image destination
[INFO] oc: Storing signatures
[INFO] oc: Generating dockerfile with builder image quay.io/jkube/jkube-java-binary-s2i:0.0.7
[INFO] oc: STEP 1: FROM quay.io/jkube/jkube-java-binary-s2i:0.0.7
[INFO] oc: STEP 2: LABEL "io.openshift.build.source-location"="/tmp/build/inputs"       "io.openshift.build.image"="quay.io/jkube/jkube-java-binary-s2i:0.0.7"
[INFO] oc: STEP 3: ENV JAVA_APP_DIR="/deployments"     OPENSHIFT_BUILD_NAME="random-generator-s2i-1"     OPENSHIFT_BUILD_NAMESPACE="default"
[INFO] oc: STEP 4: USER root
[INFO] oc: STEP 5: COPY upload/src /tmp/src
[INFO] oc: STEP 6: RUN chown -R 1000:0 /tmp/src
[INFO] oc: STEP 7: USER 1000
[INFO] oc: STEP 8: RUN /usr/local/s2i/assemble
[INFO] oc: INFO S2I source build with plain binaries detected
[INFO] oc: INFO S2I binary build from fabric8-maven-plugin detected
[INFO] oc: INFO Copying binaries from /tmp/src/deployments to /deployments ...
[INFO] oc: random-generator-0.0.1.jar
[INFO] oc: INFO Copying deployments from deployments to /deployments...
[INFO] oc: '/tmp/src/deployments/random-generator-0.0.1.jar' -> '/deployments/random-generator-0.0.1.jar'
[INFO] oc: STEP 9: CMD /usr/local/s2i/run
[INFO] oc: STEP 10: COMMIT temp.builder.openshift.io/default/random-generator-s2i-1:48795e41
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Image operating system mismatch: image uses "", expecting "linux""
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Image architecture mismatch: image uses "", expecting "amd64""
[INFO] oc: Getting image source signatures
[INFO] oc: Copying blob sha256:d8e1f35641acb80b562f70cf49911341dfbe8c86f4d522b18efbf3732aa74223
[INFO] oc: Copying blob sha256:b6f081e4b2b6de8be4b1dec132043d14c121e968384dd624fb69c2c07b482edb
[INFO] oc: Copying blob sha256:b7139ad07aa8ce4ed5a132f7c5cc9f1de0f5099b5e155027a23d57f7fbe78b16
[INFO] oc: Copying blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copying config sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Writing manifest to image destination
[INFO] oc: Storing signatures
[INFO] oc: --> 27aaadaf28e
[INFO] oc: 27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Getting image source signatures
[INFO] oc: 
[INFO] oc: Pushing image image-registry.openshift-image-registry.svc:5000/default/random-generator:0.0.1 ...
[INFO] oc: Copying blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copying blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copying blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copying blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copying config sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Writing manifest to image destination
[INFO] oc: Storing signatures
[INFO] oc: Successfully pushed image-registry.openshift-image-registry.svc:5000/default/random-generator@sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: Push successful
[INFO] oc: Build random-generator-s2i-1 in status Complete
[INFO] oc: Found tag on ImageStream random-generator tag: sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: ImageStream random-generator written to /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: Using docker image name of namespace: default
[INFO] oc: Running generator spring-boot
[INFO] oc: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] oc: jkube-controller: Adding a default DeploymentConfig
[INFO] oc: jkube-service: Adding a default service 'random-generator' with ports [8080]
[INFO] oc: jkube-healthcheck-spring-boot: Adding readiness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 10 seconds
[INFO] oc: jkube-healthcheck-spring-boot: Adding liveness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 180 seconds
[INFO] oc: jkube-revision-history: Adding revision history limit to 2
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] oc: Using OpenShift at https://api.crc.testing:6443/ in namespace default with manifest /home/rohaan/work/repos/eclipse-jkube-demo-project/target/classes/META-INF/jkube/openshift.yml 
[INFO] oc: OpenShift platform detected
[INFO] oc: Using project: default
[INFO] oc: Creating a Service from openshift.yml namespace default name random-generator
[INFO] oc: Created Service: target/jkube/applyJson/default/service-random-generator.json
[INFO] oc: Creating a DeploymentConfig from openshift.yml namespace default name random-generator
[INFO] oc: Created DeploymentConfig: target/jkube/applyJson/default/deploymentconfig-random-generator.json
[INFO] oc: Creating Route default:random-generator host: null
[INFO] oc: HINT: Use the command `oc get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:07 min
[INFO] Finished at: 2020-08-10T12:08:00+05:30
[INFO] ------------------------------------------------------------------------
~/work/repos/eclipse-jkube-demo-project : $ oc get pods -w
NAME                           READY     STATUS      RESTARTS   AGE
random-generator-1-deploy      1/1       Running     0          14s
random-generator-1-vnrm9       0/1       Running     0          11s
random-generator-s2i-1-build   0/1       Completed   0          1m
random-generator-1-vnrm9   1/1       Running   0         24s
random-generator-1-deploy   0/1       Completed   0         28s
~/work/repos/eclipse-jkube-demo-project : $ oc get routes
NAME                HOST/PORT                                    PATH      SERVICES            PORT      TERMINATION   WILDCARD
random-generator    random-generator-default.apps-crc.testing              random-generator    8080                    None
~/work/repos/eclipse-jkube-demo-project : $ curl random-generator-default.apps-crc.testing/random 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45    0    45    0     0   1666      0 --:--:-- --:--:-- --:--:--  1730
{
  "id": "d80052d9-2f92-43cb-b9eb-d7cffb879798"
}
~/work/repos/eclipse-jkube-demo-project : $

Video tutorial

Per scoprire come semplificare lo sviluppo di Kubernetes con Eclipse JKube, guarda il video tutorial su come distribuire rapidamente una semplice applicazione Spring Boot su Minikube:

Riproduci video

Conclusione

In questo articolo abbiamo mostrato come Eclipse JKube renda la vita più facile per gli sviluppatori Java che lavorano con Kubernetes. Ulteriori 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