DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Please enter at least three characters to search
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Zones

Culture and Methodologies Agile Career Development Methodologies Team Management
Data Engineering AI/ML Big Data Data Databases IoT
Software Design and Architecture Cloud Architecture Containers Integration Microservices Performance Security
Coding Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Culture and Methodologies
Agile Career Development Methodologies Team Management
Data Engineering
AI/ML Big Data Data Databases IoT
Software Design and Architecture
Cloud Architecture Containers Integration Microservices Performance Security
Coding
Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance
Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks

The software you build is only as secure as the code that powers it. Learn how malicious code creeps into your software supply chain.

Apache Cassandra combines the benefits of major NoSQL databases to support data management needs not covered by traditional RDBMS vendors.

Generative AI has transformed nearly every industry. How can you leverage GenAI to improve your productivity and efficiency?

Modernize your data layer. Learn how to design cloud-native database architectures to meet the evolving demands of AI and GenAI workloads.

Related

  • Fast Deployments of Microservices Using Ansible and Kubernetes
  • Docker and Kubernetes Transforming Modern Deployment
  • Kubernetes Remote Development in Java Using Kubernetes Maven Plugin
  • A Guide to Container Runtimes

Trending

  • Understanding IEEE 802.11(Wi-Fi) Encryption and Authentication: Write Your Own Custom Packet Sniffer
  • Designing a Java Connector for Software Integrations
  • Mastering Advanced Aggregations in Spark SQL
  • Is Agile Right for Every Project? When To Use It and When To Avoid It
  1. DZone
  2. Software Design and Architecture
  3. Cloud Architecture
  4. Deploy Maven Apps to Kubernetes With JKube Kubernetes Maven Plugin

Deploy Maven Apps to Kubernetes With JKube Kubernetes Maven Plugin

By 
Rohan Kumar user avatar
Rohan Kumar
·
Nov. 13, 20 · Tutorial
Likes (4)
Comment
Save
Tweet
Share
14.4K Views

Join the DZone community and get the full member experience.

Join For Free

In this article you’ll learn how to containerize your Maven application into Docker Images and automatically generate and deploy Kubernetes Manifests with the help of Eclipse JKube’s Kubernetes Maven Plugin.

eclipse jkube

A Brief Introduction to Kubernetes

Kubernetes is an open source project, originally developed by Google, which is now managed by Cloud Native Computing Foundation. It surged in popularity in 2017 among people who were already using container technologies introduced by Docker. It’s an orchestration engine that underlies how operations staff deploy and manage containers at scale. For more detailed information about Kubernetes, you can checkout these articles:

  • DZone: A Beginner’s guide to Kubernetes

  •  DZone: A Complete introduction to Kubernetes

Eclipse JKube - Java Tooling for Kubernetes:

All right, now that we know about Kubernetes. We can now take a look at the project which we’ll be talking about in this blogpost: Eclipse JKube. It is a project which you can use to package your applications into Docker Images and deploy to Kubernetes smoothly. It is the successor to famous Fabric8 Maven Plugin.

At Eclipse Cloud Tooling we have been focused on making Java developers’ experience smoother when it comes to creating, building, deploying and managing microservices on top of Kubernetes for some time. Most of the Java developers are used to application servers, creating deployment jars/wars, deploying then and running them in web application containers. They mostly use   their build tools like Maven/Gradle or their IDE to do most of the work.

Hence we thought about providing a developer experience in which working on top of Kubernetes would look just like working on an application server to a Java developer. So building and deploying applications from maven to Kubernetes would look exactly like it would with other maven plugins like spring-boot, tomcat, jetty, wildfly, quarkus etc. This can get Java developers get started quickly with Kubernetes since they can treat it like an application server. 

We’ll now be taking a look at Eclipse JKube Kubernetes Maven Plugin and how it provides a similar developer experience on top of Kubernetes like you usually have with your application frameworks like  Spring Boot, Quarkus, Vert.x etc.

XML
 




x


 
1
<plugin>
2
  <groupId>org.eclipse.jkube</groupId>
3
  <artifactId>kubernetes-maven-plugin</artifactId>
4
  <version>${jkube.version}</version>
5
</plugin>


Setting Up Your Maven Project:

Do you have an existing maven project for your Java application? Maybe it’s a Quarkus or Spring Boot application; or a flat classpath, fat jar? If you don’t have a maven application, you can simply visit code.quarkus.io or start.spring.io and create one. You can also pick up a quickstart from Eclipse JKube quickstarts.

You can find latest version of Eclipse JKube on Maven Central as usual. To add Eclipse JKube Kubernetes Maven Plugin in your project you can simply add this section in your pom.xml like this:

XML
 




x


 
1
<plugin>
2
  <groupId>org.eclipse.jkube</groupId>
3
  <artifactId>kubernetes-maven-plugin</artifactId>
4
  <version>1.0.2</version>
5
</plugin>



Note that all Eclipse JKube Quickstarts already have Kubernetes Maven Plugin enabled so you can simply skip above step.

Now that we have Kubernetes Maven Plugin integrated into our project we can do something interesting stuff. Let’s take a short look the the goals this plugin provides. We’ll be taking a closer look at each of these goals later:

Goal Name

Description

K8s:build

Containerize your application into an image
K8s:push Push the Image built to a container registry
K8s:resource Generate Kubernetes Manifests
K8s:deploy Apply these manifests on top of Kubernetes
K8s:log View logs of your application running in Kubernetes Cluster
K8s:debug Debug your application running into Kubernetes

All right, let’s take a look at each of these goals in detail one by one:

1. Containerizing Your Application:

Kubernetes Maven Plugin makes containerizing your Maven applications extremely easy. It allows building Docker images without providing any configuration with the help of it’s opinionated defaults. Of course, you can customize this very easily by allowing customization of image via XML Configuration or by providing your own Dockerfile.

To build Docker image of your application, just run the k8s:build goal(Default strategy for building images Is Docker so It requires access to a docker daemon):

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:build



This will create a Docker Image in the daemon you performed this goal against. You can check the image build using docker images command. If you don’t have access to docker daemon, you can change build strategy to JIB like this:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:build -Djkube.build.strategy=jib



It will generate a tar file for your image which can be copied and loaded in any other docker daemon.

2. Pushing Image to a Registry:

Once you’ve build an image, you might want to push it to a remote registry like DockerHub or Quay. You can easily achieve this with Kubernetes Maven Plugin. Before doing it, you need to make sure that the image you’ve build is correct ${registry}/${user}/${image-name}:${tag} format. If you’re providing your own XML Configuration for building image, you can simply change image name by changing name section like this: 

XML
 




xxxxxxxxxx
1
19


 
1
  <plugin>
2
    <groupId>org.eclipse.jkube</groupId>
3
    <artifactId>kubernetes-maven-plugin</artifactId>
4
    <version>${jkube.version}</version>
5
    <configuration>
6
      <images>
7
        <image>
8
          <!-- Registry: quay.io -->
9
          <!-- Username: rohankanojia -->
10
          <name>quay.io/rohankanojia/helloapp:${project.version}</name>
11
          <alias>hello-world</alias>
12
          <build>
13
            <from>openjdk:latest</from>
14
            <cmd>java -jar maven/${project.artifactId}-${project.version}.jar</cmd>
15
          </build>
16
        </image>
17
      </images>
18
    </configuration>
19
  </plugin>



If you’re using Kubernetes Maven Plugin’s Zero Configuration, you need to change default image name generated by Kubernetes Maven Plugin by providing this property:

XML
 




xxxxxxxxxx
1


 
1
<!-- Registry: quay.io -->
2
<!-- Username: rohankanojia -->
3
<jkube.generator.name>quay.io/rohankanojia/helloapp:${project.version}</jkube.generator.name>



For registry authentication, Kubernetes Maven Plugin automatically detects credentials from these locations:

  • ~/.docker/config.json(docker login config file)
  • ~/.m2/settings.xml(store container registry credentials like maven registry)
  • In <auth> section in plugin configuration

You can check these in detail in Kubernetes Maven Plugin Authentication Docs.

In order to push image to specified registry, you can go ahead and use k8s:push goal:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:push



Or if you had built your image with JIB build strategy, you can do:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:push -Djkube.build.strategy=jib



3. Generate Kubernetes Manifests:

Kubernetes Maven Plugin also automatically generates opinionated Kubernetes Manifests by inspecting your project’s dependencies. Of course, it can easily be customized by providing your own manifests or small portions of YAML in src/main/jkube directory, For more information check out plugin documentation about Resource Fragments.

In order to generate Kubernetes Manifests, you just need to run k8s:resource goal:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:resource



This would generate Kubernetes manifests which would be available in target/ directory, as shown in listing below:

Shell
 




xxxxxxxxxx
1


 
1
eclipse-jkube-demo-project : $ tree target/classes/META-INF/jkube/
2
target/classes/META-INF/jkube/
3
├── kubernetes
4
│   ├── random-generator-deployment.yml
5
│   └── random-generator-service.yml
6
└── kubernetes.yml
7
 
          
8
1 directory, 3 files


4. Deploying To Kubernetes:

You can use Kubernetes Maven Plugin’s deploy goal in order to apply the Kubernetes YAML manifests generated in previous step on top of Kubernetes Cluster. You just need to be logged into a Kubernetes cluster. If you want to make whole deployment to Kubernetes a single step operation you can bind various goals like this:

XML
 




xxxxxxxxxx
1
16


 
1
<plugin>
2
  <groupId>org.eclipse.jkube</groupId>
3
  <artifactId>kubernetes-maven-plugin</artifactId>
4
  <version>${jkube.version}</version>
5
 
          
6
  <!-- Connect k8s:resource, k8s:build to lifecycle phases -->
7
  <executions>
8
    <execution>
9
       <id>jkube</id>
10
       <goals>
11
         <goal>resource</goal>
12
         <goal>build</goal>
13
       </goals>
14
    </execution>
15
  </executions>
16
</plugin>



Then you can deploy your application in just one step using k8s:deploy goal:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:deploy



This will build your java code and run your unit tests, generate the docker image, create the kubernetes manifest and deploy them into kubernetes.

To remove your application from kubernetes just use the k8s:undeploy goal:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:undeploy


5. Inspect Logs:

Once your application has been deployed into Kubernetes using Kubernetes Maven Plugin; you might want to inspect its logs. You can use k8s:log goal which would output logs for your application running inside Kubernetes:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:log



Use Ctrl+C to stop tailing the log

If you wish to get the log of the app and then terminate immediately then use this option:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:log -Djkube.log.follow=false


6. Live Debugging App Running Inside Kubernetes:

To debug your application deployed using `k8s:deploy` goal, just run the k8s:debug goal:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:debug



This will use the default Java remote debugging port of 5005. You can also specify a different port if you want:

Shell
 




xxxxxxxxxx
1


 
1
mvn k8s:debug -Djkube.debug.port=8000



Once goal is up and running, a debug port would be opened on your laptop(localhost) which then connects using Kubernetes Pod Port forwarding to your latest application Pod.

You can add a debug execution in IntelliJ like this:

adding debug execution


This concludes the overview of common Kubernetes Maven Plugin goals.  There are other goals too like k8s:helm and k8s:watch But we won't be covering them in this blog.

Demo:

You can watch these short YouTube videos in order to see this plugin in action:


You can also checkout our Getting started course on Katakoda: https://katacoda.com/jkubeio

Conclusion

Please try out Kubernetes Maven Plugin and let us know via Community or via Issue Tracker .Are you interested in joining us to make this project better? Don’t be shy about joining our welcoming community:

  • Provide feedback on GitHub
  • Craft code and push a pull request to the Eclipse JKube repository.
  • Interact with the Eclipse JKube team on Gitter and the JKube mailing list .
  • Ask questions and get answers on Stack Overflow .
Kubernetes Apache Maven Docker (software) Web application

Opinions expressed by DZone contributors are their own.

Related

  • Fast Deployments of Microservices Using Ansible and Kubernetes
  • Docker and Kubernetes Transforming Modern Deployment
  • Kubernetes Remote Development in Java Using Kubernetes Maven Plugin
  • A Guide to Container Runtimes

Partner Resources

×

Comments
Oops! Something Went Wrong

The likes didn't load as expected. Please refresh the page and try again.

ABOUT US

  • About DZone
  • Support and feedback
  • Community research
  • Sitemap

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 100
  • Nashville, TN 37211
  • support@dzone.com

Let's be friends:

Likes
There are no likes...yet! 👀
Be the first to like this post!
It looks like you're not logged in.
Sign in to see who liked this post!