Java Development on OpenShift with odo
OpenShift Do (odo) is a CLI tool for running applications on OpenShift. Opposite to the oc client, it is a tool for developers. It automates all the things required to deploy your application on OpenShift. Thanks to odo you can focus on the most important aspect – code. In order to start, you just need to download the latest release from GitHub and add it to your path.
Source Code
If you would like to try it by yourself, you may always take a look at my source code. In order to do that you need to clone my GitHub repository. It is the simple Spring Boot application we are going to deploy on OpenShift. Then you should just follow my instructions.
Before we begin with OpenShift odo
It is important to understand some key concepts related to odo before we begin. If you want to deploy a new application you should create a component. Each component can be run and deployed separately. There are two types of components: Devfile and S2I. The S2I component is based on the Source-To-Image process. Therefore, your application is built on the server-side with the S2I builder. With the Devfile component, you run the application with the mvn spring-boot:run
command. Here’s the list of available components. We will use the java
component.
You can also check out the list of services by executing the command odo catalog list services
. A service is a software that your component links to or depends on. However, I won’t focus on that feature. Currently, the Service Catalog is deprecated in OpenShift. Instead, you can operators with odo the same as you would use templates.
The Spring Boot application
Let’s take a moment on discussing our sample Spring Boot application. It is a REST-based application, which connects to MongoDB. We will use JDK 11 for compilation.
<groupId>pl.piomin.samples</groupId>
<artifactId>sample-spring-boot-on-kubernetes</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
...
</dependencies>
The MongoDB connection settings are set inside application.yml
. We will use environment variables for getting credentials and database name. We will set these values in the local configuration using odo.
spring:
application:
name: sample-spring-boot-on-kubernetes
data:
mongodb:
uri: mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@mongodb/${MONGO_DATABASE}
Creating configuration with odo
Ok, let’s by creating a new component. We need to choose java
S2I type and then set a name of our component.
$ odo create java sample-spring-boot
After that odo is creating a file config.yaml
inside the .odo
directory in the project root catalog. It’s pretty simple.
kind: LocalConfig
apiversion: odo.dev/v1alpha1
ComponentSettings:
Type: java
SourceLocation: ./
SourceType: local
Ports:
- 8443/TCP
- 8778/TCP
- 8080/TCP
Application: app
Project: pminkows-workshop
Name: sample-spring-boot
Then, we will add some additional configuration properties. Firstly, we need to expose our application outside the cluster. The command visible below creates a Route
to the Service
on OpenShift on the 8080 port.
$ odo url create --port 8080
In the next step, we add environment variables to the odo configuration responsible for establishing MongoDB connection: MONGO_USERNAME
, MONGO_PASSWORD
, and MONGO_DATABASE
. Just to simplify, I created a standalone instance of MongoDB on OpenShift using the template. Here are the values in the mongodb
secret.
Let’s set environment variables using odo config
command. Of course, all things are still available only in the local configuration.
$ odo config set --env MONGO_USERNAME=userJ5Q
$ odo config set --env MONGO_PASSWORD=UrfgtUKohNOFVqbQ
$ odo config set --env MONGO_DATABASE=sampledb
Finally, we are ready to deploy our application on OpenShift. To do that, we need to execute odo push
command. If you would like to see the logs from the build add option --show-log
.
Instead of using environment variables to provide MongoDB connection settings, you may take advantage of
odo link
command. This feature helps to connect an odo component to a service or another component. However, to use it you first need to install the Service Binding Operator on OpenShift. Then you may install a database like MongoDB with an operator and link to your application component.
Verify S2I build on OpenShift
After running odo push let’s switch to oc client. Our application is running on OpenShift as shown below. The same with MongoDB.
We can also navigate to the OpenShift Management Console. The environment variables set inside odo configuration has been applied to the DeploymentConfig
.
Now, let’s say we need to provide some changes in our code. Fortunately, we can execute the command that watches for changes in the directory for current component. After detecting such a change, the new version of application is immediately deployed on OpenShift.
$ odo watch
Waiting for something to change in /Users/pminkows/IdeaProjects/sample-spring-boot-on-kubernetes
Using OpenShift odo in Devfile mode
In opposition to the S2I approach, we may use Devfile mode. In order to do that we will choose the java-springboot
component.
As a result, OpenShift odo creates devfile.yaml
in the project root directory.
schemaVersion: 2.0.0
metadata:
name: java-springboot
version: 1.1.0
starterProjects:
- name: springbootproject
git:
remotes:
origin: "https://github.com/odo-devfiles/springboot-ex.git"
components:
- name: tools
container:
image: quay.io/eclipse/che-java11-maven:nightly
memoryLimit: 768Mi
mountSources: true
endpoints:
- name: '8080-tcp'
targetPort: 8080
volumeMounts:
- name: m2
path: /home/user/.m2
- name: m2
volume:
size: 3Gi
commands:
- id: build
exec:
component: tools
commandLine: "mvn clean -Dmaven.repo.local=/home/user/.m2/repository package -Dmaven.test.skip=true"
group:
kind: build
isDefault: true
- id: run
exec:
component: tools
commandLine: "mvn -Dmaven.repo.local=/home/user/.m2/repository spring-boot:run"
group:
kind: run
isDefault: true
- id: debug
exec:
component: tools
commandLine: "java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=${DEBUG_PORT},suspend=n -jar target/*.jar"
group:
kind: debug
isDefault: true
Of course, all next steps are the same as for S2I component.
Install OpenShift Intellij Plugin
If you do not like command-line tools, you may install the Intellij OpenShift plugin as well. It uses odo for build and deploy. The good news is that the latest version of this plugin supports odo in 2.0.3 version.
Thanks to that plugin you can for example easily create component with OpenShift odo.
Conclusion
With odo you can easily deploy your application on OpenShift in a few seconds. You may also continuously watch for changes in the code, and immediately deploy a new version of application. Moreover, you don’t need to create any Kubernetes YAML manifests.
OpenShift odo is a similar tool to Skaffold. If you would like to compare both these tools used to run the Spring Boot application you may read the following article about Skaffold.
Leave a Reply