Desarrollo de aplicaciones Java para Kubernetes utilizando Eclipse JKube

Hace 25 años, Java se incorporó a las masas programadoras, convirtiéndose en uno de los pilares alrededor de los cuales se construyen los stacks de aplicaciones. Sin embargo, hoy en día, muchas personas y organizaciones que durante años han sido leales a Java están ocupadas en la transición o considerando la posibilidad de cambiarse a la plataforma Kubernetes o sus derivados, como Red Hat OpenShift o Amazon EKS.

Desarrollo de aplicaciones Java para Kubernetes utilizando Eclipse JKube

Lamentablemente, Kubernetes presenta una curva de aprendizaje pronunciada y introduce un nivel operativo adicional en el proceso de desarrollo familiar para los programadores de Java. Hoy vamos a hablar sobre cómo utilizar Eclipse JKube, para simplificar estas operaciones adicionales relacionadas con Kubernetes y contenedores, así como asegurar una migración fluida a la plataforma en la nube manteniendo el ecosistema familiar de Java. Además, mostraremos cómo desplegar aplicaciones Java en la plataforma OpenShift utilizando el complemento OpenShift Maven.

El proceso tradicional de desarrollo en Java

El proceso de desarrollo tradicional Java (Ilustración 1) implica que el desarrollador escribe código, luego crea unidades de despliegue en forma de archivos JAR o WAR, y luego despliega y ejecuta estos archivos en un servidor web o en un servidor de aplicaciones. Generalmente, se utiliza Maven desde la línea de comandos o se emplea una IDE, como IntelliJ o Eclipse, para codificar y empaquetar aplicaciones. Los desarrolladores están acostumbrados a realizar cambios en el código y a probarlo exhaustivamente antes de consolidarlo y enviarlo al sistema de control de versiones.

Desarrollo de aplicaciones Java para Kubernetes utilizando Eclipse JKube

Ilustración 1. Proceso tradicional de desarrollo en Java.

Proceso de desarrollo en Java para la nube

Al migrar a aplicaciones en la nube, se añaden Kubernetes y contenedores. Por lo tanto, ahora el desarrollador debe empaquetar las aplicaciones Java en imágenes de contenedor y crear manifiestos de Kubernetes que describan estas imágenes. Luego, estos manifiestos se aplican al servidor de producción que ejecuta Kubernetes. A su vez, Kubernetes toma estas imágenes del registro y despliega las aplicaciones de acuerdo con las configuraciones que especificamos en los manifiestos, que generalmente son archivos YAML.

La metamorfosis del proceso tradicional de desarrollo en Java al pasar a la nube se muestra en la Ilustración 2.

Desarrollo de aplicaciones Java para Kubernetes utilizando Eclipse JKube

Ilustración 2. Proceso de desarrollo en Java para la nube.

Eclipse JKube

La transición a Kubernetes añade un nivel operativo adicional al proceso de desarrollo, lo cual inquieta a muchos desarrolladores, ya que desean concentrarse en su trabajo principal: la lógica de las aplicaciones, en lugar de cómo desplegarlas. Aquí es donde entra Eclipse JKube, que permite a los desarrolladores utilizar sus bibliotecas y plugins (JKube Kit junto con Kubernetes Maven Plugin o OpenShift Maven Plugin), para realizar tareas relacionadas con contenedores y Kubernetes con facilidad, siguiendo el esquema en la Fig. 2.

En el resto de este artículo, mostraremos cómo simplificar el proceso de desarrollo Java en el entorno de Kubernetes utilizando Eclipse JKube con el plugin Kubernetes Maven Plugin.

El proceso de desarrollo para la nube usando Eclipse JKube

Tomemos un esquema ligeramente modificado del desarrollo Java para la nube según la Fig. 2, introduciendo Eclipse JKube y el plugin Kubernetes Maven Plugin, como se muestra en la Fig. 3.

Desarrollo de aplicaciones Java para Kubernetes utilizando Eclipse JKube

Fig. 3. Proceso de desarrollo Java para la nube utilizando Eclipse JKube.

Como podemos ver, todas las operaciones de interacción con Kubernetes y contenedores (resaltadas en rojo en el esquema) son reemplazadas por las tareas de goals predeterminadas de Eclipse JKube, que se enumeran en la Tab. 1.

Tabl. 1. Tareas predeterminadas de Eclipse JKube.

Tarea
Etapa
Descripción

k8s:build
PRE_INTEGRATION_TEST
Construcción de imágenes docker

k8s:push
INSTALL
Envío de imágenes docker al registro

k8s:resource
PROCESS_RESOURCES
Generación de manifiestos K8s

k8s:apply
COMPILE
Aplicación de los manifiestos generados a K8s

k8s:undeploy
UNDEPLOY
Eliminación de recursos K8s que fueron desplegados a través de k8s:apply y k8s:deploy

Nota: Si no deseas que las tareas usen estos defaults rígidos (defaults opinativos), puedes configurar manualmente Eclipse JKube a tu gusto, ya que éste soporta configuración a través de XML y recursos.

Ahora veamos ejemplos de uso de Eclipse JKube y Kubernetes Maven Plugin al trabajar con aplicaciones.

Desplegando una aplicación Java en Kubernetes con Eclipse JKube

En este ejemplo, desplegaremos una sencilla aplicación Java en un clúster de Minikube usando Eclipse JKube. Con el plugin Kubernetes Maven Plugin, podemos especificar los parámetros de despliegue sin tener que escribir ninguna configuración.

Como ejemplo de aplicación, utilizamos un generador sencillo de números aleatorios, que devuelve un JSON-output en el endpoint /random:

~\/work\/repos\/eclipse-jkube-demo-project : $ curl localhost:8080\/random | jq .\n  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n100    45    0    45    0     0    818      0 --:--:-- --:--:-- --:--:--   818\n{\n  \"id\": \"e80a4d10-c79b-4b9a-aaac-7c286cb37f3c\"\n}

Paso 1. Cargamos el Plugin de Maven para Kubernetes

El Plugin de Maven para Kubernetes se encuentra en el repositorio Repositorio Central de Maven. Para usar Eclipse JKube, debes agregar el Plugin de Maven para Kubernetes en tu pom.xml como una dependencia:

<plugin>\n     <groupId>org.eclipse.jkube<\/groupId>\n     <artifactId>kubernetes-maven-plugin<\/artifactId>\n     <version>${jkube.version}<\/version>\n <\/plugin>

Si se utiliza OpenShift en lugar de Kubernetes puro, entonces se modifica el pom.xml de la siguiente manera:

<plugin>\n     <groupId>org.eclipse.jkube<\/groupId>\n     <artifactId>openshift-maven-plugin<\/artifactId>\n     <version>${jkube.version}<\/version>\n <\/plugin>

Paso 2. Construimos la imagen de Docker

El archivo JAR de la aplicación se puede construir con el comando mvn package, y luego se puede usar la tarea goal mvn k8s:build para construir la imagen de Docker de esta aplicación. Ten en cuenta que hemos sobrescrito el nombre de la imagen por defecto con esta propiedad:

<jkube.generator.name>docker.io\/rohankanojia\/random-generator:${project.version}<\/jkube.generator.name>

Antes de construir la imagen, debes asegurarte de que el demonio de Docker esté correctamente expuesto. Esto se puede hacer con el siguiente comando:

$ eval $(minikube docker-env)

Luego, ingresamos el comando mvn k8s:build, y esto es lo que veremos en la pantalla al construir la imagen de Docker con la tarea de construcción de Eclipse JKube:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:build\n[INFO] Escaneando proyectos...\n[INFO] \n[INFO] ----------------------< meetup:random-generator >-----------------------\n[INFO] Construyendo random-generator 0.0.1\n[INFO] --------------------------------[ jar ]---------------------------------\n[INFO] \n[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---\n[INFO] k8s: Ejecutando en modo Kubernetes\n[INFO] k8s: Construyendo imagen de Docker en modo Kubernetes\n[INFO] k8s: Ejecutando generador spring-boot\n[INFO] k8s: spring-boot: Usando imagen de Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 como base \/ generador\n[INFO] k8s: [docker.io\/rohankanojia\/random-generator:0.0.1] "spring-boot": Creado docker-build.tar en 251 milisegundos\n[INFO] k8s: [docker.io\/rohankanojia\/random-generator:0.0.1] "spring-boot": Imagen construida sha256:a20e5\n[INFO] ------------------------------------------------------------------------\n[INFO] CONSTRUCCIÓN EXITOSA\n[INFO] ------------------------------------------------------------------------\n[INFO] Tiempo total:  5.053 s\n[INFO] Finalizado a: 2020-08-10T11:28:23+05:30\n[INFO] ------------------------------------------------------------------------\n~\/work\/repos\/eclipse-jkube-demo-project : $

Paso 3. Enviamos la imagen al registro de Docker

Después de haber construido la imagen de Docker con el registro de push configurado (en nuestro caso es docker.io), podemos enviar esta imagen al registro. Esto es lo que aparecerá en la pantalla después de que le pidamos a Eclipse JKube que ejecute la tarea de push mvn k8s:push:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:push
[INFO] Escaneando proyectos...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Construyendo random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:push (default-cli) @ random-generator ---
[INFO] k8s: Ejecutando en modo Kubernetes
[INFO] k8s: Construyendo la imagen Docker en modo Kubernetes
[INFO] k8s: Ejecutando generador spring-boot
[INFO] k8s: spring-boot: Usando imagen Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 como base \/ constructor
[INFO] k8s: El push se refiere al repositorio [docker.io\/rohankanojia\/random-generator]
5dcd9556710f: La capa ya existe 
b7139ad07aa8: La capa ya existe 
b6f081e4b2b6: La capa ya existe 
d8e1f35641ac: La capa ya existe 
[INFO] k8s: 0.0.1: digest: sha256:9f9eda2a13b8cab1d2c9e474248500145fc09e2922fe3735692f9bda4c76002d tamaño: 1162
[INFO] k8s: Publicado docker.io\/rohankanojia\/random-generator:0.0.1 en 7 segundos 
[INFO] ------------------------------------------------------------------------
[INFO] CONSTRUCCIÓN EXITOSA
[INFO] ------------------------------------------------------------------------
[INFO] Tiempo total:  11.222 s
[INFO] Terminado en: 2020-08-10T11:35:37+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ 

Después de enviar la imagen, debemos verificar que haya ido al registro. En nuestro caso, simplemente la vemos en Docker Hub, como se muestra en la Fig. 4.

Desarrollo de aplicaciones Java para Kubernetes utilizando Eclipse JKube

Fig. 4. La imagen enviada al registro apareció en Docker Hub.

Paso 4. Generamos los manifiestos de recursos de Kubernetes para la aplicación

Entonces, hemos construido la imagen de la aplicación, ahora debemos escribir los manifiestos de Kubernetes. Para ello, Eclipse JKube tiene una tarea que genera manifiestos de recursos rígidos, basándose en el marco Java subyacente (Spring Boot, Quarkus, Vert.x o algún otro). También se puede configurar el manifiesto utilizando un archivo XML de configuración y colocando fragmentos en crudo (fragmentos del manifiesto de recursos requerido) en la carpeta de la aplicación src\/main\/jkube. En tal caso, su configuración se incorporará en los manifiestos generados.

En nuestro ejemplo dejamos todo como está, y por lo tanto Eclipse JKube genera un manifiesto para el despliegue predeterminado y para el servicio con tipo ClusterIP. Luego modificamos el manifiesto del servicio para cambiar el tipo de servicio a NodePort. Se puede sobrescribir el comportamiento predeterminado con la siguiente propiedad:

<jkube.enricher.jkube-service.type>NodePort<\/jkube.enricher.jkube-service.type>

Así es como se ve la salida en pantalla después de que pedimos a Eclipse JKube que ejecute la tarea de recursos mvn k8s:resource.

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:resource
[INFO] Escaneando proyectos...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Construyendo random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:resource (default-cli) @ random-generator ---
[INFO] k8s: Ejecutando generador spring-boot
[INFO] k8s: spring-boot: Usando imagen de Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 como base \/ constructor
[INFO] k8s: jkube-controller: Agregando un despliegue por defecto
[INFO] k8s: jkube-service: Agregando un servicio por defecto 'random-generator' con puertos [8080]
[INFO] k8s: jkube-healthcheck-spring-boot: Agregando sonda de disponibilidad en el puerto 8080, ruta='\/actuator\/health', esquema='HTTP', con un retraso inicial de 10 segundos
[INFO] k8s: jkube-healthcheck-spring-boot: Agregando sonda de vivacidad en el puerto 8080, ruta='\/actuator\/health', esquema='HTTP', con un retraso inicial de 180 segundos
[INFO] k8s: jkube-revision-history: Agregando límite de historial de revisiones a 2
[INFO] ------------------------------------------------------------------------
[INFO] CONSTRUCCIÓN EXITOSA
[INFO] ------------------------------------------------------------------------
[INFO] Tiempo total:  3.344 s
[INFO] Terminado en: 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 : $

Paso 5. Desplegando la aplicación en el clúster de Kubernetes

Entonces, estamos listos para desplegar la aplicación: hemos generado su imagen y luego hemos generado automáticamente los manifiestos de recursos. Ahora solo queda aplicar todo esto al clúster de Kubernetes. Para desplegar la aplicación, se puede utilizar el comando kubectl apply -f, pero el plugin también puede hacerlo por nosotros. Esto es lo que aparecerá en la pantalla después de que le pidamos a Eclipse JKube que ejecute la tarea de aplicar mvn k8s:apply:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:apply
[INFO] Escaneando proyectos...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Construyendo random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] k8s: Usando Kubernetes en https:\/\/192.168.39.145:8443\/ en el namespace default con el manifiesto \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/classes\/META-INF\/jkube\/kubernetes.yml 
[INFO] k8s: Usando namespace: default
[INFO] k8s: Creando un Servicio desde kubernetes.yml namespace default nombre random-generator
[INFO] k8s: Servicio creado: target\/jkube\/applyJson\/default\/service-random-generator.json
[INFO] k8s: Creando un Deployment desde kubernetes.yml namespace default nombre random-generator
[INFO] k8s: Deployment creado: target\/jkube\/applyJson\/default\/deployment-random-generator.json
[INFO] k8s: SUGERENCIA: Usa el comando `kubectl get pods -w` para observar el inicio de tus pods
[INFO] ------------------------------------------------------------------------
[INFO] CONSTRUCCIÓN EXITOSA
[INFO] ------------------------------------------------------------------------
[INFO] Tiempo total:  7.306 s
[INFO] Terminado en: 2020-08-10T11:40:57+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get pods -w
NOMBRE                                                LISTO   ESTADO             REINICIOS   EDAD
random-generator-58b7847d7f-9m9df                   0\/1     En ejecución      0          7s
random-generator-58b7847d7f-9m9df                   1\/1     En ejecución      0          17s
^C~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get svc
NOMBRE                                    TIPO        CLUSTER-IP      EXTERNAL-IP   PUERTO(S)           EDAD
io-openliberty-sample-getting-started   NodePort    10.110.4.104    <none>        9080:30570\/TCP    44h
kubernetes                              ClusterIP   10.96.0.1       <none>        443\/TCP           18d
random-generator                        NodePort    10.97.172.147   <none>        8080:32186\/TCP    22s
~\/work\/repos\/eclipse-jkube-demo-project : $ curl `minikube ip`:32186\/random | jq .
  % Total    % Recibido % Transferido  Velocidad Media   Tiempo    Tiempo     Tiempo  Actual
                                 Dload  Upload   Total   Gastado  Queda  Velocidad
100    45    0    45    0     0   1800      0 --:--:-- --:--:-- --:--:--  1875
{
  "id": "42e5571f-a20f-44b3-8184-370356581d10"
}

Paso 6. Realizando undeploy de la aplicación desde el clúster de Kubernetes

Para esto se utiliza la tarea undeploy, que simplemente elimina todos los recursos que fueron aplicados en el paso anterior, es decir, al ejecutar la tarea apply. Esto es lo que veremos en la pantalla después de que le pidamos a Eclipse JKube que ejecute la tarea de 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     Running   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 : $

¿Qué más se puede hacer con Eclipse JKube?

Hemos revisado los objetivos principales de Eclipse JKube y el Plugin de Maven para Kubernetes, que facilitan el desarrollo de aplicaciones Java para la plataforma Kubernetes. Si no deseas ingresar constantemente estos objetivos manualmente, puedes escribirlos en la configuración del plugin, por ejemplo, de esta manera:

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

Cabe destacar que en este artículo solo hemos abordado algunos de los objetivos de Eclipse JKube y del Plugin de Maven para Kubernetes, por lo que presentamos en la Tabla 2 una lista de tareas adicionales que también pueden ser útiles.

Tabla 2. Tareas adicionales de Eclipse JKube.

Tarea
Etapa
Descripción

k8s:log
VALIDAR
Obteniendo registros de la aplicación que se ejecuta en Kubernetes.

k8s:debug
PAQUETE
Abrir el puerto de depuración para depurar la aplicación que se ejecuta en Kubernetes directamente desde la IDE.

k8s:deploy
INSTALL
Crear un fork para la tarea de Install y aplicar los manifiestos generados al clúster de Kubernetes de la misma manera que en la tarea apply.

k8s:watch
PAQUETE
Implementación automática en caliente de la aplicación mediante el seguimiento de su espacio de nombres.

Despliegue de aplicaciones Java en Red Hat OpenShift utilizando OpenShift Maven Plugin

Para desplegar la aplicación de nuestro ejemplo en la plataforma Red Hat OpenShift, aplicaremos el plugin OpenShift Maven. La única diferencia será que el prefijo de las tareas cambiará de k8s a oc. Por defecto, el plugin Kubernetes Maven hace docker-construcciones, mientras que el plugin OpenShift Maven realiza construcciones S2I. No haremos ningún cambio en nuestro proyecto, excepto eliminar la propiedad jkube.generator.name, ya que no es necesaria al enviar a un registro (en la etapa de construcción, OpenShift coloca la imagen en su registro interno). Y esto es lo que aparecerá en la pantalla cuando ejecutemos nuestro ejemplo, donde, por cierto, estamos ejecutando las tareas goal no una por una, sino todas a la vez:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn oc:build oc:resource oc:apply
[INFO] Escaneando proyectos...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Construyendo random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] oc: Usando la construcción de OpenShift con estrategia S2I
[INFO] oc: Ejecutando en modo OpenShift
[INFO] oc: Ejecutando generador spring-boot
[INFO] oc: spring-boot: Usando la imagen Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 como base \/ builder
[INFO] oc: [random-generator:0.0.1] "spring-boot": Creada la tar de fuente docker \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/docker\/random-generator\/0.0.1\/tmp\/docker-build.tar
[INFO] oc: Añadiendo a Secret pullsecret-jkube
[INFO] oc: Usando Secret pullsecret-jkube
[INFO] oc: Creando BuildServiceConfig random-generator-s2i para construcción de Fuente
[INFO] oc: Creando ImageStream random-generator
[INFO] oc: Iniciando Build random-generator-s2i
[INFO] oc: Esperando a que finalice la construcción random-generator-s2i-1...
[INFO] oc: Almacenando blobs bajo "\/var\/cache\/blobs".
[INFO] oc: Obteniendo firmas de fuente de imagen
[INFO] oc: Copiando blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copiando blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copiando blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copiando config sha256:52d6788fcfdd39595264d34a3959464a5dabc1d4ef0ae188802b20fc2d6a857b
[INFO] oc: Escribiendo el manifiesto en el destino de la imagen
[INFO] oc: Almacenando firmas
[INFO] oc: Generando dockerfile con la imagen builder quay.io\/jkube\/jkube-java-binary-s2i:0.0.7
[INFO] oc: PASO 1: FROM quay.io\/jkube\/jkube-java-binary-s2i:0.0.7
[INFO] oc: PASO 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: PASO 3: ENV JAVA_APP_DIR="\/deployments"     OPENSHIFT_BUILD_NAME="random-generator-s2i-1"     OPENSHIFT_BUILD_NAMESPACE="default"
[INFO] oc: PASO 4: USER root
[INFO] oc: PASO 5: COPY upload\/src \/tmp\/src
[INFO] oc: PASO 6: RUN chown -R 1000:0 \/tmp\/src
[INFO] oc: PASO 7: USER 1000
[INFO] oc: PASO 8: RUN \/usr\/local\/s2i\/assemble
[INFO] oc: INFO Se detectó una construcción S2I con binarios en plano
[INFO] oc: INFO Se detectó una construcción S2I binaria del fabric8-maven-plugin
[INFO] oc: INFO Copiando binarios de \/tmp\/src\/deployments a \/deployments ...
[INFO] oc: random-generator-0.0.1.jar
[INFO] oc: INFO Copiando despliegues de deployments a \/deployments...
[INFO] oc: '\/tmp\/src\/deployments\/random-generator-0.0.1.jar' -> '\/deployments\/random-generator-0.0.1.jar'
[INFO] oc: PASO 9: CMD \/usr\/local\/s2i\/run
[INFO] oc: PASO 10: COMMITEAR temp.builder.openshift.io\/default\/random-generator-s2i-1:48795e41
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Desajuste del sistema operativo de la imagen: la imagen usa "", esperando "linux""
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Desajuste de arquitectura de la imagen: la imagen usa "", esperando "amd64""
[INFO] oc: Obteniendo firmas de fuente de imagen
[INFO] oc: Copiando blob sha256:d8e1f35641acb80b562f70cf49911341dfbe8c86f4d522b18efbf3732aa74223
[INFO] oc: Copiando blob sha256:b6f081e4b2b6de8be4b1dec132043d14c121e968384dd624fb69c2c07b482edb
[INFO] oc: Copiando blob sha256:b7139ad07aa8ce4ed5a132f7c5cc9f1de0f5099b5e155027a23d57f7fbe78b16
[INFO] oc: Copiando blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copiando config sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Escribiendo el manifiesto en el destino de la imagen
[INFO] oc: Almacenando firmas
[INFO] oc: --> 27aaadaf28e
[INFO] oc: 27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Obteniendo firmas de fuente de imagen
[INFO] oc: 
[INFO] oc: Empujando la imagen image-registry.openshift-image-registry.svc:5000\/default\/random-generator:0.0.1 ...
[INFO] oc: Copiando blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copiando blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copiando blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copiando blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copiando config sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Escribiendo el manifiesto en el destino de la imagen
[INFO] oc: Almacenando firmas
[INFO] oc: Imagen pushada exitosamente - image-registry.openshift-image-registry.svc:5000\/default\/random-generator@sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: Push exitoso
[INFO] oc: Build random-generator-s2i-1 en estado Completo
[INFO] oc: Encontrada etiqueta en ImageStream random-generator etiqueta: sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: ImageStream random-generator escrito en \/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: Usando el nombre de imagen docker del namespace: default
[INFO] oc: Ejecutando generador spring-boot
[INFO] oc: spring-boot: Usando la imagen Docker quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 como base \/ builder
[INFO] oc: jkube-controller: Añadiendo un DeploymentConfig predeterminado
[INFO] oc: jkube-service: Añadiendo un servicio predeterminado 'random-generator' con puertos [8080]
[INFO] oc: jkube-healthcheck-spring-boot: Añadiendo probe de disponibilidad en el puerto 8080, ruta='\/actuator\/health', esquema='HTTP', con un retraso inicial de 10 segundos
[INFO] oc: jkube-healthcheck-spring-boot: Añadiendo probe de vivacidad en el puerto 8080, ruta='\/actuator\/health', esquema='HTTP', con un retraso inicial de 180 segundos
[INFO] oc: jkube-revision-history: Añadiendo límite de historial de revisiones a 2
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] oc: Usando OpenShift en https:\/\/api.crc.testing:6443\/ en el namespace default con el manifiesto \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/classes\/META-INF\/jkube\/openshift.yml 
[INFO] oc: Plataforma OpenShift detectada
[INFO] oc: Usando proyecto: default
[INFO] oc: Creando un Servicio desde openshift.yml namespace default nombre random-generator
[INFO] oc: Servicio creado: target\/jkube\/applyJson\/default\/service-random-generator.json
[INFO] oc: Creando un DeploymentConfig desde openshift.yml namespace default nombre random-generator
[INFO] oc: DeploymentConfig creado: target\/jkube\/applyJson\/default\/deploymentconfig-random-generator.json
[INFO] oc: Creando Route default:random-generator host: null
[INFO] oc: SUGERENCIA: Usa el comando `oc get pods -w` para observar cómo se inician tus pods
[INFO] ------------------------------------------------------------------------
[INFO] CONSTRUCCIÓN EXITOSA
[INFO] ------------------------------------------------------------------------
[INFO] Tiempo total:  01:07 min
[INFO] Finalizado en: 2020-08-10T12:08:00+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ oc get pods -w
NOMBRE                           LISTO     ESTADO      REINICIOS   EDAD
random-generator-1-deploy      1\/1       En ejecución     0          14s
random-generator-1-vnrm9       0\/1       En ejecución     0          11s
random-generator-s2i-1-build   0\/1       Completado   0          1m
random-generator-1-vnrm9   1\/1       En ejecución   0         24s
random-generator-1-deploy   0\/1       Completado   0         28s
~\/work\/repos\/eclipse-jkube-demo-project : $ oc get routes
NOMBRE                HOST\/PUERTO                                    RUTA      SERVICIOS            PUERTO      TERMINACIÓN   WILDCARD
random-generator    random-generator-default.apps-crc.testing              random-generator    8080                    Ninguno
~\/work\/repos\/eclipse-jkube-demo-project : $ curl random-generator-default.apps-crc.testing\/random 
  % Total    % Recibido % Transferido  Velocidad Media   Tiempo    Tiempo     Tiempo  Actual
                                 Dload  Subida   Total   Gastado   Restante  Velocidad
100    45    0    45    0     0   1666      0 --:--:-- --:--:-- --:--:--  1730
{
  "id": "d80052d9-2f92-43cb-b9eb-d7cffb879798"
}
~\/work\/repos\/eclipse-jkube-demo-project : $

Video tutorial

Para saber más sobre cómo simplificar el desarrollo de Kubernetes con Eclipse JKube, vea el video tutorial sobre el despliegue rápido de una aplicación Spring Boot simple en Minikube:

Reproducir video

Conclusión

En este artículo, mostramos cómo Eclipse JKube facilita la vida a los desarrolladores de Java que trabajan con Kubernetes. Más información sobre Eclipse JKube se puede encontrar en el sitio del proyecto y en GitHub.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster