See post on Kubernetes and OpenShift application development is a common topic in our client discussions.

We usually start by stating that Kubernetes is just Kubernetes, whereas OpenShift is a Kubernetes platform, like Microsoft AKS or Amazon EKS. Each platform has its own advantages tailored for different target audiences, and the conversation then shifts to comparing the strengths and weaknesses of specific platforms.
Overall, we considered writing this post with the conclusion that it doesnât really matter where you run the code, whether it's on OpenShift, AKS, EKS, or any custom Kubernetesâlet's call it KUK for brevity. âit's really just the same on both. Then we planned to take a simple 'Hello World' and show what is common and what the differences are between KUK and the Red Hat OpenShift Container Platform (hereafter referred to as OCP or simply OpenShift).
However, while writing this post, we realized that we've become so accustomed to using OpenShift that we don't even recognize how it has grown into an amazing platform, far beyond just being a Kubernetes distribution. We tend to take the maturity and simplicity of OpenShift for granted, overlooking its magnificence.
In summary, itâs time for some active reflection, and we will step by step compare deploying our 'Hello World' on KUK and OpenShift, doing so as objectively as possible (though we might occasionally express personal views). If you're interested in strictly subjective opinions on this matter, you can read it
here (EN). In this post, we will stick to facts and only facts. Clusters
So, for our 'Hello World', we need clusters. Letâs say 'no' to any public clouds to avoid charges for servers, registries, networks, data transfers, etc. Therefore, we choose a simple single-node cluster on
KUK and Code Ready Containers Building on KUK

Step 1 â building our container image
Nii et, lÀhme!
Let's start by deploying our 'Hello World' on minikube. For this, we will need:
1. Docker installed.
- 2. Git installed.
- 2. Paigaldatud Git.
- 3. Paigaldatud Maven (tegelikult kasutatakse selles projektis mvnw-binaari, seega saab ka ilma selleta hakkama).
- 4. Tegelikult lÀhtekood, st reposti kloon
Esiteks tuleb luua Quarkus'i projekt. Ărge muretsege, kui te pole kunagi Quarkus.io saidiga töötanud â see on lihtne. Lihtsalt valige komponendid, mida soovite projektis kasutada (RestEasy, Hibernate, Amazon SQS, Camel jne), ja Quarkus seadistab maven'i arhetĂŒĂŒbi ja laadib kĂ”ik github'i ilma teie sekkumiseta. See tĂ€hendab, et sĂ”na otseses mĂ”ttes piisab ĂŒhest hiireklĂ”psust â ja kĂ”ik on valmis. Selle ĂŒle me Quarkus't armastame.

Lihtsaim viis meie 'Hello World' konteineri pildi kokkupanemiseks on kasutada quarkus-maveni laiendusi Dockerile, mis teevad kogu vajaliku töö Àra. Quarkus'e tulekuga on see tÔeliselt lihtne: lisage laiendus container-image-docker ja saate luua pilte maven'i kÀskudega.
./mvnw quarkus:add-extension -Dextensions="container-image-docker"
Ja lÔpuks, teeme meie pildi koostamise Maveniga. Tulemuseks on see, et meie lÀhtekood muudetakse valmis konteineripildiks, mida saab juba konteinerite kÀitamisruumis kÀivitada.

./mvnw -X clean package -Dquarkus.container-image.build=true
Nii et see ongi, nĂŒĂŒd saab konteinerit kĂ€ivitada kĂ€suga docker run, suunates meie teenuse porti 8080, et sellele ligi pÀÀseda.
docker run -i --rm -p 8080:8080 gcolman/quarkus-hello-world

PÀrast konteineri instantsi kÀivitamist jÀÀb vaid kontrollida kÀsuga curl, et meie teenus töötab:
![]()
Nii et kÔik töötab ja see oli tÔeliselt lihtne.
Samm 2 â saadame meie konteineri konteineripiltide hoidlasse
Praegu hoitakse meie loodud pilti kohapeal, meie kohalikus konteinerite hoidlas. Kui tahame seda pilti kasutada oma KUBERA keskkonnas, tuleb see panna mÔnda teise hoidlasse. Kubernetesis ei ole selliseid funktsioone, seega kasutame dockerhub'i. Esiteks, see on tasuta ja teiseks, (peaaegu) kÔik teevad nii.
See on samuti vÀga lihtne, ja siin on vaja ainult dockerhub'i kontot.
Nii et loome dockerhub'i ja saadame sinna meie pildi.

Samm 3 â kĂ€ivitame Kubernetes'e
On palju viise, kuidas koguda kubernetes'i konfiguratsiooni meie 'Hello World'i kÀivitamiseks, kuid kasutame kÔige lihtsamat, sellised me oleme...
Alustuseks kÀivitame minikube'i klastrit:
minikube start
Samm 4 â kĂ€ivitame meie konteineripildi
NĂŒĂŒd peame meie koodi ja konteineripildi muutma kubernetes konfigureerimiseks. TeisisĂ”nu, vajame pod'i ja deployment definitsiooni, mis viitavad meie konteineripildile dockerhub'is. Ăks lihtsamaid viise seda teha on kĂ€ivitada kĂ€sk create deployment, viidates meie pildile:

kubectl create deployment hello-quarkus --image=gcolman/quarkus-hello-world:1.0.0-SNAPSHOT
Selle kÀsuga palusime meie KUBEl luua deployment konfiguratsioon, mis peab sisaldama pod'i spetsifikatsiooni meie konteineripildi jaoks. See kÀsk rakendab samuti seda konfiguratsiooni meie minikube klastri jaoks ja loob deployment'i, mis allalaadib meie konteineripildi ja kÀivitab pod'i klastris.
Samm 5 â avame juurdepÀÀsu meie teenusele
NĂŒĂŒd, kui meil on kĂ€ivitatud konteineripilt, on aeg mĂ”elda, kuidas konfigureerida vĂ€lise juurdepÀÀsu sellele Restful-teenusele, mis on tegelikult meie koodis programmeeritud.
Siin on palju viise. NÀiteks saame kasutada kÀsku expose, et automaatselt luua vastavad Kubernetes komponendid, nagu teenused ja lÔpp-punktid. Just nii me teeme, kÀivitades kÀsu expose meie deployment-objekti jaoks:
kubectl expose deployment hello-quarkus --type=NodePort --port=8080
Asetame nĂŒĂŒd tĂ€helepanu expose kĂ€su valikule â--typeâ.
Kui teeme expose ja loome komponendid, mis on vajalikud meie teenuse kĂ€ivitamiseks, peame muu hulgas tagama, et vĂ€ljastpoolt oleks vĂ”imalik ĂŒhendust saada teenusega hello-quarkus, mis asub meie tarkvara mÀÀratud vĂ”rgus. Ja parameeter type vĂ”imaldab meil luua ja ĂŒhendada selliseid asju nagu koormuse tasandajad, et suunata liiklust sellesse vĂ”rku.
NĂ€iteks, mÀÀrates type=LoadBalancer, aktiveerime automaatselt koormuse tasandaja avalikus pilves, et ĂŒhendada meie Kubernetes klastri. See, muidugi, on suurepĂ€rane, kuid tuleb mĂ”ista, et selline konfiguratsioon on tihedalt seotud konkreetse avaliku pilvega ja seda on keerulisem ĂŒle kanda erinevate keskkondade Kubernetes'i instance'ide vahel.
Meie nÀites type=NodePort, see, the request to our service is made via the node's IP address and port number. This option allows not to use any public clouds, but requires a number of additional steps. Firstly, you need your own load balancer, so we will deploy an NGINX load balancer in our cluster.
Step 6 â set up the load balancer
Minikube has a range of platform features that simplify the creation of necessary components for external access, such as ingress controllers. Minikube comes with the Nginx ingress controller, and we just need to enable and configure it.
minikube addons enable ingress
Now, with just one command, I will create an Nginx ingress controller that will operate inside our minikube cluster:
ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m
Step 7 â Configure ingress
Now we need to configure the Nginx ingress controller so that it handles requests to hello-quarkus.


And finally, we need to apply this configuration.

kubectl apply -f ingress.yml
![]()
Since we are doing all this on our own computer, we simply add the IP address of our node to the file /etc/hosts to direct HTTP requests to our minikube at the NGINX load balancer.
192.168.99.100 hello-quarkus.info
That's it, now our minikube service is available externally through the Nginx ingress controller.

Well, that was easy, right? Or not so much?

Running on OpenShift (Code Ready Containers)
Now let's see how this is done on the Red Hat OpenShift Container Platform (OCP).
As with minikube, we choose a single-node OpenShift cluster scheme in the form of Code Ready Containers (CRC). This used to be called minishift and was based on the OpenShift Origin project, but now it's CRC and built on the Red Hat OpenShift Container Platform.
Here we cannot help but say, 'OpenShift is wonderful!'
Initially, we thought to write that development on OpenShift is no different from development on Kubernetes. And in essence, thatâs true. But while writing this post, we remembered how many extra steps you have to take when you donât have OpenShift, and hence it is, we repeat, wonderful. We love when everything is easy, and the way our example is deployed and started on OpenShift compared to minikube is what actually prompted us to write this post.
Letâs go through the process and see what we will need to do.
So, in the minikube example we started with Docker... Wait, we no longer need Docker installed on the machine.
Ja kohalik git pole meile vajalik.
Ja Maven ei ole vajalik.
Ja ei pea kÀsitsi konteineripilti looma.
Ja ei pea otsima mingit konteineripiltide hoidlat.
Ja ingress-kontrollerit ei pea installima.
Ja ingress'i konfigureerimine ei ole vajalik.
Te mĂ”istate, jah? Et meie rakendust OpenShiftis kĂ€ivitada, ei vaja te midagi ĂŒlalkirjeldatut. Ja kogu protsess nĂ€eb vĂ€lja jĂ€rgmine.
Samm 1 â KĂ€ivita oma OpenShift klaster
Kasutame Red Hati Code Ready Containers't, mis on tegelikult sama, mis Minikube, kuid tĂ€isfunktsionaalne ĂŒhe sĂ”lmeline OpenShifti klaster.
crc start
Samm 2 â Teostame rakenduse koondamise ja kĂ€ivitamise OpenShifti klastris
Just sellel sammul ilmneb OpenShifti lihtsus ja mugavus tÀielikult. Nagu kÔigis Kubernetesi jaotustes, on meil palju viise, kuidas rakendust klastris kÀivitada. Ja nagu Kubernetesel, valime me spetsiaalselt kÔige lihtsama.
OpenShift on alati olnud loodud konteinerirakenduste loomise ja kĂ€itamise platvormiks. Konteinerite koondamine on alati olnud selle platvormi lahutamatu osa, seetĂ”ttu on siin palju tĂ€iendavaid Kubernetesi ressursse vastavate ĂŒlesannete jaoks.
Kasutame OpenShifti Source 2 Image (S2I) protsessi, millel on mitu erinevat viisi, kuidas vÔtta meie lÀhtekood (kas kood vÔi binaarfailid) ja muuta see konteineripildiks, mida saab kÀitada OpenShifti klastris.
Selleks vajame kahte asja:
- Meie lÀhtekood git-i hoidlas
- Builder-pilt, mille alusel koondamine toimub.
On palju selliseid pilte, mida toetavad nii Red Hat kui ka kogukond, ja me kasutame OpenJDK pilti, kuna ma koondan Java-rakendust.
S2I koondamist saab kÀivitada nii OpenShift Developeri graafilise liidese kaudu kui ka kÀsurealt. Kasutame kÀsku new-app, öeldes talle, kust vÔtta builder-pilt ja meie lÀhtekood.

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git
KÔik, meie rakendus on loodud. Samal ajal teostas S2I jÀrgmised toimingud:
- Loodi teenuse build-pod, et tegeleda rakenduse kokkupanemisega seotud asjadega.
- Loodi OpenShifti Build konfigureerimine.
- Laaditi builder-pilt OpenShifti sisemisse docker-registrisse.
- Klooniti "Hello World" kohalikku hoidlasse.
- NÀgin, et seal on maven pom, ja seetÔttu kompileerisin rakenduse maven'i abil.
- Loomisin uue konteineripildi, mis sisaldas kompileeritud Java-rakendust, ja panin selle pildi sisemisse konteineriregistrisse.
- Loomisin Kubernetes'i Deployment'i pod'i, teenuse jne spetsifikatsioonidega.
- KĂ€ivitasin konteineripildi juurutamise.
- Kustutasin teenuse build-podi.
Selles nimekirjas on palju erinevaid elemente, kuid kÔige tÀhtsam on, et kogu kogumine toimub ainult OpenShiftis, sisemine Docker-registern on OpenShiftis ja kogumisprotsess loob kÔik Kubernetes'i komponendid ning kÀivitab need klastris.
Kui visuaalselt jÀlgida S2I kÀivitamist konsoolis, siis vÔib nÀha, kuidas build pod kÀivitatakse kogumise ajal.

Ja nĂŒĂŒd vaatame builder pod'i logisid: kĂ”igepealt on seal nĂ€ha, kuidas maven oma tööd teeb ja allalaadib sĂ”ltuvusi meie java-rakenduse kogumiseks.

PÀrast maven'i kogumise lÔppu kÀivitatakse konteineripildi koostamine, ja seejÀrel saadetakse see kogutud pilt sisemisse hoidlasse.

KĂ”ik, kogumisprotsess on lĂ”petatud. NĂŒĂŒd veendume, et klastri pod'id ja teenused meie rakenduse jaoks on kĂ€ivitatud.
oc get service
![]()
Nii, ja kĂ”ik. Ainult ĂŒhe kĂ€suga. Meil jÀÀb ĂŒle ainult see teenus avada, et sellele vĂ€ljastpoolt juurde pÀÀseda.
Samm 3 - teeme teenuse avamise vÀlispidisele juurdepÀÀsule
Nagu KUK-i puhul, vajab meie "Hello World" OpenShiftis ka ruuterit, et suunata vĂ€list liiklust teenusele klastri sees. OpenShiftis on see vĂ€ga lihtne. Esiteks, klastri sees on vaikimisi paigaldatud HAProxy marsruutimise komponent (seda vĂ”ib vahetada sama NGINX-i vastu). Teiseks, siin on spetsiaalsed ja laialdased konfigureerimisvĂ”imalustega ressursid, mida nimetatakse Routes'iteks ja mis meenutavad Ingress-objekte vanas heades Kuberneteses ( tegelikult on OpenShift'i Routes tugevalt mĂ”jutanud Ingress-objektide disaini, mida saab nĂŒĂŒd kasutada ka OpenShiftis), kuid meie "Hello World'i" jaoks, ja peaaegu kĂ”igis teistes juhtumites, piisab meile tavalisest Route'ist ilma tĂ€iendava seadistamiseta.
Et luua "Hello World" jaoks marsruutitav FQDN (jah, OpenShiftis on nimega teenuste marsruutimiseks oma DNS), teeme lihtsalt meie teenuse avamise:

oc expose service quarkus-hello-world
Kui vaadata just loodud Route'i, siis sealt vÔib leida FQDN-i ja muid marsruutimisse puutuvaid andmeid:
oc get route
![]()
Ja lÔpuks, pöördume oma teenuse poole brauserist:

Aga nĂŒĂŒd oli see tĂ”esti lihtne!
Me armastame Kubernetesit ja kĂ”ike, mida see tehnoloogia vĂ”imaldab, samuti armastame me lihtsust ja kergust. Kubernetes loodi selleks, et muuta hajutatud ja skaleeritavate konteinerite haldamine uskumatult lihtsaks, kuid nĂŒĂŒd on rakenduste kĂ€ivitamiseks sellest lihtsusest juba puudu. Siin tulebki mĂ€ngu OpenShift, mis on ajaga kaasas kĂ€inud ja pakub Kubernetesit, mis on suunatud peamiselt arendajatele. OpenShift'i platvormi on arendajate jaoks kohandamiseks tehtud tohutult tööd, sealhulgas selliste tööriistade nagu S2I, ODI, Developer Portal, OpenShift Operator Framework, IDE-de integreerimine, arendaja kataloogid, Helm'i integreerimine, jĂ€lgimine ja palju muud.
Loodame, et see artikkel oli teile huvitav ja kasulik. Lisamaterjale, ressursse ja muid kasulikke arendusvahendeid OpenShift'i platvormil leiate portaalist .
Allikas: habr.com
