Development with OpenShift Dev Spaces
In this article, you will learn how to use OpenShift Dev Spaces to simplify the development of containerized apps. OpenShift Dev Spaces is a Red Hat product based on the open-source Eclipse Che project optimized for running on OpenShift. Eclipse Che allows you to use your favorite IDE directly on Kubernetes. However, it is not just a web-based IDE running in containers. It is also a concept that helps to organize software-defined developer environments inside your Kubernetes cluster.
If you are interested in similar articles about the differences between OpenShift and vanilla Kubernetes you can read my previous post about GitOps and multi-cluster environments. In the current article, we will also discuss the odo
tool. If you need more information about it go the following post.
Introduction
Eclipse Che is a Kubernetes-native IDE and developer collaboration platform. OpenShift Dev Spaces is built on top of Eclipse Che and allows you to run it easily on OpenShift. We can install Dev Spaces using an operator. After that, you will get a ready platform that automatically integrates with the OpenShift authorization mechanism.
In this article, I’ll show you step-by-step how to install Dev Spaces on the OpenShift platform. However, you can as well try a hosted option. By default, OpenShift Dev Spaces runs as part of the Developer Sandbox. Developer Sandbox gives you immediate access to the cloud-managed OpenShift cluster for 30 days. You don’t have to install and configure anything there. Since everything is ready for use, you will just access your Dev Spaces dashboard to start development in one of the available IDEs including Theia, IntelliJ, and Visual Studio.
The picture visible below shows the architecture of our solution. Let’s imagine there are many developers working with our instance of OpenShift. Firstly, they need to login into the OpenShift cluster. Once they do it they can access a dashboard of Dev Spaces. Dev Spaces automatically creates a namespace for a developer based on username. It also automatically starts a pod containing our IDE after we choose a git repository with the app source code. Then we can use OpenShift developer tools to easily build the app from the source code and deploy it in the current namespace.
Prerequisites
In order to do the whole exercise with me, you need to have a running instance of OpenShift. Of course, you can use a developer sandbox, but you may have only a single user there. There are various methods of running OpenShift instance including a local instance or cloud-managed instances on AWS or Azure. You can find a detailed information about all available installation methods here. For running on the local computer use OpenShift Local.
Install and Configure Dev Spaces on OpenShift
Once we have a running instance of OpenShift, we may proceed to the Dev Spaces installation. You need to go the “Operator Hub” in OpenShift Console and choose the Red Hat OpenShift Dev Spaces operator. You can install it using default settings. That operator will also automatically install another operator – DevWorkspace
. After you install Dev Spaces you would have to create an instance of CheCluster
. You can find a link in the “Provided APIs” section.
Then, you need to click the “Create CheCluster” button. You will be redirected into the creation form. You can also leave defaults there. I create my instance of CheCluster
in the spaces
namespace.
After creating CheCluster we will switch to the spaces namespace for a moment just to verify if everything works fine.
$ oc project spaces
You should have a similar list of pods as me:
$ oc get pod
NAME READY STATUS RESTARTS AGE
che-gateway-548fdd95b5-zhczp 4/4 Running 0 1m
devfile-registry-6cbbc6c87b-hzdcb 1/1 Running 0 1m
devspaces-86cfb5b664-bqs7l 1/1 Running 0 1m
devspaces-dashboard-56b68b4649-xlrgc 1/1 Running 0 1m
plugin-registry-89f7d7684-pw9wg 1/1 Running 0 1m
postgres-6cb6cb646f-6dvbq 1/1 Running 0 1m
You can easily access Dev Spaces dashboard through the DNS address using the OpenShift Route
object.
Use Dev Spaces on OpenShift
I have already created three users on OpenShift: user1
, user2
and user3
. We can use a simple htpasswd
authentication for that. At the beginning those users do not have access to any project (or namespace) on OpenShift. I also have the admin
user for managing installation and viewing the status across all the namespaces.
Now, we will access Dev Spaces dashboard using each user one by one. Let’s see how it looks for the first user – user1
. You can just put an address of the Git repository with the app source code and create a workspace. There are also some example repositories available, but you can use my repository containing some simple Quarkus apps.
By default, OpenShift Dev Spaces runs Theia as developer IDE. Since we would like to use IntelliJ, we need to customize a worspace creation command. We could pass the name of our IDE using the devfile.yaml
file in the root directory of our repository. But we can as well pass it in the URL. The picture visible below illustrates the algorithm used for customizing workspace creation using URL. We just need to pass the repository URL and set the che-editor
parameter with the che-incubator/che-idea/latest
value.
Finally, we will start our new workspace. We need to wait a moment until the pod with our IDE starts.
Once it is ready for use, you will be redirected into the URL with your IDE. Now, you can start development 🙂
If you back for a moment to the Dev Spaces dashboard you will see the new workspace on the list of available workspaces for user1
. You can do some actions on workspaces like restart or deletion.
Now, we will repeat exactly the same steps for user2
and user3
. All these users will have their own instances of Dev Spaces in the separated namespaces <username>-devspaces
. Let’s display a list of the DevWorkspaces
objects across all the namespaces. They represent all the existing workspaces inside the whole OpenShift clusters. We can verify a status of the workspace (Running
, Starting
, Stopped
) and URL.
$ oc get devworkspaces -A
NAMESPACE NAME DEVWORKSPACE ID PHASE INFO
user1-devspaces sample-quarkus-applications workspace4b02dc6434b54a0e Running https://devspaces.apps.cluster-rh520e.gcp.redhatworkshops.io/workspace4b02dc6434b54a0e/idea-rhel8/8887/?backgroundColor=434343&wss
user2-devspaces sample-quarkus-applications workspaceadfbc8426d774988 Running https://devspaces.apps.cluster-rh520e.gcp.redhatworkshops.io/workspaceadfbc8426d774988/idea-rhel8/8887/?backgroundColor=434343&wss
user3-devspaces sample-quarkus-applications workspace810c8d6cdb1a4c7d Starting Waiting for workspace deployment
Use IntelliJ on OpenShift
After running IntelliJ instance on OpenShift we can verify some settings. Of course, you can do everything the same as in standard IntelliJ on your computer. But what is important here, our development environment is preconfigured and ready for work. There are OpenJDK, Maven and oc
client installed and configured. Moreover, there is also odo
client, which is used to build and deploy the directly from local version of source code. The user is currently logged in into the OpenShift cluster. Since we are inside the cluster, we can act with it using internal networking. If we still need to install some additional components, we can prepare our own version of the devfile.yaml
and put it e.g. in the Git repository root directory.
One of the most important thing here is that you are interacting with OpenShift cluster internally. That has a huge impact on deployment time when using inner-development loop tools like odo
. That’s because you don’t have to upload the source code over the network. Let’s just try it. As I mentioned before odo
is by default installed in your workspace. So now, the only thing you need to do is to choose one app from our sample Quarkus Git repository. For me, it is person-service
.
$ cd person-service
In the first step, we need to create an app with odo
. There are several components available depending on the language or even framework. You can list all of them by running the following command: odo catalog list components
. Since our code is written in Quarkus we will choose the java-quarkus
component.
$ odo create java-quarkus person
In order to build and deploy app on OpenShift just run the following command.
$ odo push
Let’s analyze what happened. Here is the output from the odo push
command. It automatically creates a Route
to expose app outside the cluster. After performing the Maven build it finally pushes the app with the name person
to OpenShift.
To view the status of the cluster we can install the OpenShift Toolkit plugin in IntelliJ.
Let’s display a list of deployments in the user1-devspaces
namespace. As you see our Quarkus app is deployed under the person-app
name. I also had to deploy Postgresql (person-db
) on OpenShift since the our apps connects to the database.
Finally, if you want want do have an inner-development loop with odo
and Dev Spaces just run the command odo watch in the IntelliJ terminal.
Customize OpenShift Dev Spaces
We can customize the behaviour of Dev Spaces by modifying the CheCluster
object. Here are the default settings. We can override e.g. :
- The namespace name template (1)
- The duration after which a workspace will be idled if there is no activity (2).
- The maximum duration a workspace runs (3).
- Storage option from per user into the mode where each workspace has its own individual PVC (4).
apiVersion: org.eclipse.che/v2
kind: CheCluster
metadata:
name: devspaces
namespace: spaces
spec:
components:
cheServer:
debug: false
logLevel: INFO
database:
credentialsSecretName: postgres-credentials
externalDb: false
postgresDb: dbche
postgresHostName: postgres
postgresPort: '5432'
pvc:
claimSize: 1Gi
imagePuller:
enable: false
metrics:
enable: true
devEnvironments:
defaultNamespace:
template: <username>-devspaces # (1)
secondsOfInactivityBeforeIdling: 1800 # (2)
secondsOfRunBeforeIdling: -1 # (3)
storage:
pvcStrategy: per-user # (4)
networking:
auth:
gateway:
configLabels:
app: che
component: che-gateway-config
So, if there is no activity Dev Spaces should automatically destroy the pod with your IDE after 30 minutes. Of course, you can change the value of that timeout. However, you can modify the YAML of each DevWorkspace
object to shut it down manually. You just need to set the spec.started
parameter value to false
.
Let’s verify the status of DevWorkspace objects after disabling all of them manually.
$ oc get devworkspace -A
NAMESPACE NAME DEVWORKSPACE ID PHASE INFO
user1-devspaces sample-quarkus-applications workspace4b02dc6434b54a0e Stopped Stopped
user2-devspaces sample-quarkus-applications workspaceadfbc8426d774988 Stopped Stopped
user3-devspaces sample-quarkus-applications workspace810c8d6cdb1a4c7d Stopped Stopped
Final Thoughts
OpenShift Dev Spaces helps you to standardize development process across the whole organization on OpenShift. Thanks to that tool you can accelerate project and developer onboarding. As a zero-install development environment that runs in your browser, it makes it easy for anyone to join your team and contribute to a project. It may be especially useful for enabling fast inner-development loop with the remote Kubernetes or OpenShift clusters.
Leave a Reply