Java application development for Kubernetes using Eclipse JKube

25 years ago, Java entered the realm of programmers to ultimately become one of the pillars around which application stacks are built. However, today many individuals and organizations who remained loyal to Java for years are transitioning or contemplating a move to the platform Kubernetes or its derivatives, such as Red Hat OpenShift or Amazon EKS.

Java application development for Kubernetes using Eclipse JKube

Unfortunately, Kubernetes has a steep learning curve and adds yet another operational layer to the development process familiar to Java programmers. Today, we'll discuss how to utilize Eclipse JKube, to simplify these additional operations associated with Kubernetes and containers, as well as ensure a seamless migration to the cloud platform while preserving the familiar Java ecosystem. Furthermore, we will demonstrate how to deploy Java applications on OpenShift using the OpenShift Maven plugin.

The traditional Java development process

The traditional development process Java. (Fig. 1) involves the developer writing code, then creating deployment units in the form of JAR or WAR files, and finally deploying and running these files on a web server or application server. This is mainly done using Maven from the command line or utilizing an IDE, such as IntelliJ or Eclipse, to code and package applications. Developers are accustomed to making changes to the code and thoroughly testing everything before finalizing the code and submitting it to version control.

Java application development for Kubernetes using Eclipse JKube

Fig. 1. Traditional Java development process.

The Java development process for the cloud

When transitioning to cloud applications, Kubernetes and containersare incorporated into the above schema. Therefore, the developer now needs to package Java applications into container images and create Kubernetes manifests describing these images. These manifests are then applied to the production server where Kubernetes operates. In turn, Kubernetes retrieves these images from the registry and deploys the applications according to the configurations specified in the manifests, which are usually YAML files.

The metamorphosis of the traditional Java development process when transitioning to the cloud is illustrated in Fig. 2.

Java application development for Kubernetes using Eclipse JKube

Fig. 2. Java development process for the cloud.

Eclipse JKube

Transitioning to Kubernetes adds another operational layer to the development process, which unsettles many developers as they wish to focus on their core work—application logic—rather than deployment concerns. This is where Eclipse JKube, which allows developers to utilize their libraries and plugins (JKube Kit together with Kubernetes Maven Plugin or OpenShift Maven Plugin), comes into play, enabling effortless execution of container and Kubernetes-related operations, following the scheme shown in Fig. 2.

In the remainder of this article, we will demonstrate how to simplify the Java development process in a Kubernetes environment using Eclipse JKube with the Kubernetes Maven Plugin.

Cloud Development Process Using Eclipse JKube

Let’s consider a slightly modified cloud Java development scheme with Fig. 2, introducing Eclipse JKube and the Kubernetes Maven Plugin, as illustrated in Fig. 3.

Java application development for Kubernetes using Eclipse JKube

Fig. 3. Java Development Process for the Cloud Using Eclipse JKube.

As we can see, all operations interacting with Kubernetes and containers (highlighted in red in the diagram) are replaced by the default goal tasks of Eclipse JKube, listed in Table 1.

Table 1. Default Tasks of Eclipse JKube.

Task
The
Description

k8s:build
PRE_INTEGRATION_TEST
Building Docker Images

k8s:push
INSTALL
Pushing Docker Images to the Registry

k8s:resource
PROCESS_RESOURCES
Generating K8s Manifests

k8s:apply
COMPILE
Applying Generated Manifests to K8s

k8s:undeploy
UNDEPLOY
Removing K8s Resources Deployed via k8s:apply and k8s:deploy

Note: If you prefer not to use these opinionated defaults, you can manually configure Eclipse JKube to suit your needs, as it supports configuration via XML and resources.

Now let's look at examples of using Eclipse JKube and the Kubernetes Maven Plugin with applications.

Deploying a Java Application to Kubernetes Using Eclipse JKube

In this example, we will deploy a simple Java application in a cluster Minikube using Eclipse JKube. By utilizing the Kubernetes Maven Plugin, we can specify the deployment parameters without needing to define any configuration.

For our application example, we will use a simple random number generator, which outputs JSON at the endpoint /random:

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

Step 1. Uploading the Kubernetes Maven Plugin

The Kubernetes Maven Plugin is located in the repository Maven Central Repository. To use Eclipse JKube, you need to add the Kubernetes Maven Plugin to your pom.xml as a dependency:

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

If OpenShift is used instead of pure Kubernetes, then pom.xml needs to be modified as follows:

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

Step 2. Building the Docker Image

The application JAR file can be assembled with the command mvn package, and then you can use the goal task mvn k8s:build to build the Docker image of this application. Note that we have overridden the default image name with the following property:

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

Before building the image, make sure that the Docker daemon is correctly exposed. This can be done with the following command:

$ eval $(minikube docker-env)

Next, we enter the command mvn k8s:build, and here is what we will see on the screen when building the Docker image with the Eclipse JKube build task:

~/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 : $

Step 3. Pushing the Image to the Docker Registry

After we have built the Docker image with the configured push registry (in our case this is docker.io), we can push this image to the registry. Here is what will be displayed on the screen after we ask Eclipse JKube to execute the push task 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 : $ 

After pushing the image, we need to verify that it has entered the registry. In our case, we can simply see it in Docker Hub, as shown in Fig. 4.

Java application development for Kubernetes using Eclipse JKube

Fig. 4. The image pushed to the registry appeared in Docker Hub.

Step 4. Generating Kubernetes resource manifests for the application

Now that we have built the application image, we need to write the Kubernetes manifests. For this, Eclipse JKube has a task that generates strict resource manifests based on the underlying Java framework (Spring Boot, Quarkus, Vert.x, or another one). You can also set up the manifest using a configuration XML file and placing raw fragments (the required resource manifest fragments) in the application folder src\/main\/jkube. In this case, your configuration will be injected into the generated manifests.

In our example, we will leave everything as is, and therefore Eclipse JKube generates a manifest for the default deployment and for a service with type ClusterIP. We will then modify the service manifest to change the service type to NodePort. You can override the default behavior using the following property:

NodePort

Here is what the console output looks like after we ask Eclipse JKube to execute the resource task 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 : $

Step 5. Deploying the application in the Kubernetes cluster

Now, we are all set to proceed with the application deployment: we generated its image and then automatically created the resource manifests. The only thing left is to apply all this to the Kubernetes cluster. To deploy the application, you can certainly use the kubectl apply -f command, but the plugin can do this for us as well. Here’s what will appear on the screen after we ask Eclipse JKube to execute the apply task 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"
}

Step 6. Undeploying the application from the Kubernetes cluster

This is done using the undeploy task, which simply removes all the resources that were applied in the previous step, i.e., during the execution of the apply task. Here's what we will see on the screen after we ask Eclipse JKube to execute the undeploy task 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 : $

What else can be done with Eclipse JKube

So, we have covered the main goals of Eclipse JKube and the Kubernetes Maven Plugin that simplify the development of Java applications for the Kubernetes platform. If you prefer not to continuously input these goals from the keyboard, you can write them in the plugin configuration, like this:

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

It should be noted that this article does not cover all the goals available in Eclipse JKube and the Kubernetes Maven Plugin, so we provide in Table 2 a list of additional tasks that may also be useful to you.

Table 2. Additional goals of Eclipse JKube.

Task
The
Description

k8s:log
VALIDATE
Retrieving logs from an application running on Kubernetes.

k8s:debug
PACKAGE
Opening a debug port to debug the application running on Kubernetes directly from the IDE.

k8s:deploy
INSTALL
Creating a fork for the Install task and applying the generated manifests to the Kubernetes cluster just like in the case of the apply task.

k8s:watch
PACKAGE
Automatic hot deployment of the application by monitoring its namespace.

Deploying Java applications on Red Hat OpenShift using the OpenShift Maven Plugin.

To deploy the application from our example on the Red Hat OpenShift platform, we will use the OpenShift Maven. The only difference will be that the task prefix will change from k8s to oc. By default, the Kubernetes Maven plugin performs docker-builds, while the OpenShift Maven plugin performs builds S2I. We do not make any changes to our project, except for removing the property jkube.generator.name, as it is not required when pushing to the registry (at the build stage, OpenShift places the image in its internal registry). And this is what will appear on the screen when we run our example, where, by the way, we execute the goal tasks not one by one but all at once:

~\/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 Lesson

To learn more about simplifying Kubernetes development with Eclipse JKube, watch the video lesson on quickly deploying a simple Spring Boot application on Minikube:

Play video

Conclusion

In this article, we demonstrated how Eclipse JKube makes life easier for Java developers working with Kubernetes. You can find more information about Eclipse JKube at project site and on GitHub.

Source: habr.com

Buy reliable website hosting with DDoS protection, VPS VDS servers šŸ”„ Buy reliable website hosting with DDoS protection, VPS VDS servers | ProHoster