Ova objava je napisana jer su naši zaposlenici imali puno razgovora s klijentima o razvoju aplikacija na Kubernetesu i specifičnostima takvog razvoja na OpenShift-u.

Obično počinjemo s tezom da je Kubernetes jednostavno Kubernetes, dok je OpenShift već Kubernetes platforma, poput Microsoft AKS ili Amazon EKS. Svaka od ovih platformi ima svoje prednosti, usmjerene na određenu ciljanu publiku. Nakon toga, razgovor se prelijeva u usporedbu snaga i slabosti konkretnih platformi.
U suštini, razmišljali smo o tome da napišemo ovu objavu s zaključkom tipa „Slušajte, zapravo nije važno gdje pokrećete kod, na OpenShift-u ili na AKS-u, na EKS-u, na nekom prilagođenom Kubernetes-u, zapravo na bilo kojem Kubernetes-u (radi jednostavnosti, nazovimo ga KUK) – to je stvarno jednostavno, i tamo i ovdje.
Zatim smo planirali uzeti najjednostavniji „Hello World“ i na njegovom primjeru prikazati što je zajedničko i koje su razlike između KUK-a i Red Hat OpenShift Container Platform (dalje, OCP ili jednostavno OpenShift).
Međutim, tijekom pisanja ove objave, shvatili smo da smo se toliko dugo i snažno navikli koristiti OpenShift, da jednostavno ne primjećujemo koliko je narastao i postao nevjerojatna platforma koja je mnogo više od običnog Kubernetes distribucije. Navikli smo doživljavati zrelost i jednostavnost OpenShift-a kao nešto podrazumijevano, zanemarujući njegovu veličanstvenost.
U suštini, došlo je vrijeme za aktivno pokajanje, i sada ćemo korak po korak usporediti uvođenje svog „Hello World“ na KUK-u i na OpenShift-u, i to ćemo učiniti što objektivnije (pa možda i iskazujući povremeno osobni odnos prema temi). Ako vas zanima isključivo subjektivno mišljenje o ovoj temi, možete pročitati . A u ovoj objavi ćemo se držati činjenica i samo činjenica.
Klasteri
Dakle, za naš „Hello World“ potrebni su klasteri. Odmah kažemo „ne“ svim javnim oblacima, kako ne bismo plaćali za servere, registre, mreže, prijenos podataka itd. Stoga biramo jednostavni jednoključni klaster na (za KUK) i (za OpenShift klaster). Obje ove opcije su zapravo jednostavne za instalaciju, ali će zahtijevati prilično mnogo resursa na vašem laptopu.

Izgradnja na KUK-u
Dakle, idemo.
Korak 1 – izradimo našu kontejnersku sliku
Započnimo s tim da ćemo implementirati naš „Hello World“ na minikube-u. Za to će biti potrebno:
- 1. Instalirani Docker.
- 2. Instalirani Git.
- 3. Instalirani Maven (usput, u ovom projektu koristi se mvnw binarna verzija, pa se može proći i bez njega).
- 4. Sam izvorni kod, tj. klon repozitorija
Prvo što treba učiniti je stvoriti Quarkus projekt. Ne bojte se ako nikada niste radili sa stranicom Quarkus.io – to je lako. Samo odaberite komponente koje želite koristiti u projektu (RestEasy, Hibernate, Amazon SQS, Camel itd.), a zatim će Quarkus sam, bez vašeg sudjelovanja, postaviti Maven arhetip i sve objaviti na github. Drugim riječima, doslovno jedan klik mišem – i gotovo. Zato volimo Quarkus.

Najlakši način za izradu našeg 'Hello World' u kontejnerski obrazac je korištenje quarkus-maven ekstenzija za Docker, koje će odraditi sav potreban posao. Sa dolaskom Quarkusa, ovo je postalo zaista lako i jednostavno: dodajte ekstenziju container-image-docker i možete stvarati slike s Maven komandama.
./mvnw quarkus:add-extension -Dextensions="container-image-docker"
I konačno, izvodimo izgradnju našeg obrasca koristeći Maven. Kao rezultat, naš izvorni kod se pretvara u gotov kontejnerski obrazac, koji se već može pokrenuti u okruženju kontejnera.

./mvnw -X clean package -Dquarkus.container-image.build=true
Eto, to je to, sada možemo pokrenuti kontejner s docker run, mapirajući naš servis na port 8080, kako bismo mu mogli pristupiti.
docker run -i --rm -p 8080:8080 gcolman/quarkus-hello-world

Nakon što se instanca kontejnera pokrene, ostaje samo provjeriti s komandama curl da naš servis radi:
![]()
Dakle, sve radi, i to je bilo zaista lako i jednostavno.
Korak 2 – šaljemo naš kontejner u repozitorij kontejnerskih slika
Za sada, stvorena slika se čuva lokalno, u našem lokalnom kontejnerskom skladištu. Ako želimo koristiti ovu sliku u svom K8S okruženju, trebamo je pohraniti u neki drugi repozitorij. U Kubernetesu nema takvih funkcija, pa ćemo koristiti dockerhub. Zato što, prvo, besplatan je, a drugo, (skoro) svi tako rade.
To je također vrlo jednostavno, a ovdje je potreban samo račun na dockerhub.
Dakle, kreiramo dockerhub i šaljemo našu sliku tamo.

Korak 3 – pokrećemo Kubernetes
Postoji mnogo načina za izradu konfiguracije kubernetes za pokretanje našeg 'Hello World', ali koristit ćemo najjednostavniji od njih, takvi smo ljudi…
Za početak pokrećemo minikube klaster:
minikube start
Korak 4 – implementiramo naš kontejnerski imidž
Sada je potrebno pretvoriti naš kod i kontejnerski imidž u Kubernetes konfiguracije. Drugim riječima, potrebna nam je definicija pod-a i deployment-a s referencom na naš kontejnerski imidž na DockerHubu. Jedan od najlakših načina da to učinimo je pokretanje komande create deployment, ukazujući na naš imidž:

kubectl create deployment hello-quarkus --image=gcolman/quarkus-hello-world:1.0.0-SNAPSHOT
Ovom komandom smo rekli našem KUBET-u da stvori konfiguraciju deployment-a koja bi trebala sadržavati specifikaciju pod-a za naš kontejnerski imidž. Ova komanda takođe primenjuje ovu konfiguraciju na naš minikube klaster i stvara deployment koji će preuzeti naš kontejnerski imidž i pokrenuti pod u klasteru.
Korak 5 – otvaramo pristup našoj usluzi
Sada kada imamo implementirani kontejnerski imidž, vreme je da razmislimo kako konfigurisati spoljašnji pristup ovom Restful servisu, koji je zapravo programiran u našem kodu.
Postoji mnogo načina na koje to možemo učiniti. Na primer, možemo koristiti komandu expose da automatski kreiramo odgovarajuće Kubernetes komponente, kao što su usluge i krajnje tačke. U biti, to ćemo i uraditi, izvršavajući komandu expose za naš objekat deployment-a:
kubectl expose deployment hello-quarkus --type=NodePort --port=8080
Zaustavimo se na trenutak na opciji "--type" komande expose.
Kada radimo expose i kreiramo komponente potrebne za pokretanje naše usluge, među ostalim, trebamo omogućiti spoljnu vezu sa uslugom hello-quarkus koja se nalazi unutar naše softverski definisane mreže. I parametar type omogućava nam da kreiramo i povežemo stvari kao što su balansatori opterećenja, kako bismo usmerili saobraćaj u tu mrežu.
Na primer, upisivanjem type=LoadBalancer, automatski inicijalizujemo balansator opterećenja u javnom oblačnosti kako bismo pristupili našem Kubernetes klasteru. To, naravno, zvuči sjajno, ali treba razumeti da će takva konfiguracija biti čvrsto vezana za određeno javno oblačnost i biće teže prenosiva između Kubernetes instanci u različitim okruženjima.
U našem primeru type=NodePort, odnosno, pristup našem servisu ide putem IP adrese čvora i broja porta. Ova opcija ne zahtijeva korištenje javnih oblaka, ali zahtijeva određene dodatne korake. Prvo, potreban nam je vlastiti balansirnik opterećenja, pa ćemo u svom klasteru postaviti balansirnik opterećenja NGINX.
Korak 6 – postavljamo balansirnik opterećenja
Minikube ima niz platformskih funkcija koje olakšavaju kreiranje potrebnih komponenti za pristup izvana, poput ingress kontrolera. Minikube dolazi s ingress kontrolerom Nginx, a samo ga trebamo uključiti i konfigurirati.
minikube addons enable ingress
Sada ćemo samo jednim naredbom stvoriti ingress kontroler Nginx koji će raditi unutar našeg minikube klastera:
ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Pokreće se 1 33m
Korak 7 – Konfiguriramo ingress
Sada trebamo konfigurirati ingress kontroler Nginx kako bi procesirao zahtjeve hello-quarkus.


I, konačno, trebamo primijeniti ovu konfiguraciju.

kubectl apply -f ingress.yml
![]()
Budući da sve to radimo na svom računalu, jednostavno dodajemo IP adresu svog čvora u datoteku /etc/hosts kako bismo usmjerili http zahtjeve na naš minikube na balansirnik opterećenja NGINX.
192.168.99.100 hello-quarkus.info
Sve, sada je naš minikube servis dostupan izvana putem ingress kontrolera Nginx.

Pa, to je bilo lako, zar ne? Ili ne tako lako?

Pokretanje na OpenShiftu (Code Ready Containers)
A sada pogledajmo kako se sve to radi na Red Hat OpenShift Container Platform (OCP).
Kao u slučaju s minikube, biramo shemu s jednodesnim klasterom OpenShift u obliku Code Ready Containers (CRC). Ranije je to bilo poznato kao minishift i temeljilo se na projektu OpenShift Origin, a sada je to CRC i izgrađeno na Red Hat-ovoj OpenShift Container Platform.
Ovdje se, izvinjavamo se, ne možemo suzdržati a da ne kažemo: „OpenShift je divan!“
Isprva smo mislili napisati da razvoj na OpenShiftu ne razlikuje se od razvoja na Kubernetesu. U suštini, to i jest tako. No tijekom pisanja ovog posta sjetili smo se koliko dodatnih koraka treba poduzeti kada nemate OpenShift, i stoga, ponavljamo, divan je. Volimo kada je sve lako, i to koliko je lako u usporedbi s minikube kada se naš primjer postavlja i pokreće na OpenShift, zapravo nas je potaknulo na pisanje ovog posta.
Prođimo kroz postupak i vidimo što ćemo trebati učiniti.
Dakle, u primjeru s minikube počeli smo s Docker-om… Čekaj, više nam ne treba da na mašini bude instaliran Docker.
Lokalni git nam također nije potreban.
Maven također nije potreban.
Nije potrebno ručno stvarati kontejnersku sliku.
Nije potrebno tražiti neki repozitorij kontejnerskih slika.
Nije potrebno instalirati ingress kontroler.
Nije potrebno niti konfigurirati ingress.
Razumijete, zar ne? Da biste pokrenuli i pokrenuli našu aplikaciju na OpenShift-u, nije potrebno ništa od navedenog. A sam proces izgleda ovako.
Korak 1 – Pokrećemo svoj OpenShift klaster.
Koristimo Code Ready Containers od Red Hat-a, koji je u suštini kao Minikube, ali s punim jednomodnim OpenShift klasterom.
crc start
Korak 2 – Izvršavamo izgradnju i implementaciju aplikacije u OpenShift klasteru.
Ovdje se jednostavnost i korisnost OpenShift-a očituje u punom sjaju. Kao i u svim distribucijama Kubernetes-a, imamo mnogo načina za pokretanje aplikacije unutar klastera. I, kao u slučaju KUB-a, posebno biramo najjednostavniji način.
OpenShift je uvijek bio osmišljen kao platforma za izradu i pokretanje kontejnerskih aplikacija. Izgradnja kontejnera uvijek je bila neodvojiv dio ove platforme, stoga ovdje postoji puno dodatnih Kubernetes resursa za odgovarajuće zadatke.
Koristit ćemo OpenShift-ov proces Source 2 Image (S2I), koji ima nekoliko različitih načina za preuzimanje našeg izvornog koda (koda ili binarnih datoteka) i pretvorbu u kontejnersku sliku koja se pokreće u OpenShift klasteru.
Za to će nam biti potrebne dvije stvari:
- Naš izvorni kod u git repozitoriju.
- Builder slika na temelju koje će se izgradnja izvršiti.
Postoji mnogo takvih slika, podržanih kao od strane Red Hat-a, tako i na razini zajednice, a mi ćemo koristiti sliku OpenJDK, budući da gradim Java aplikaciju.
Pokretanje S2I izgradnje moguće je, kao iz grafičkog sučelja OpenShift Developer-a, tako i iz naredbenog retka. Mi ćemo koristiti naredbu new-app, navodeći joj odakle preuzeti builder sliku i naš izvorni kod.

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git
Sve, naša aplikacija je stvorena. Pri tome je S2I proces izvršio sljedeće stvari:
- Stvorio je pomoćni build-pod za razne stvari vezane za izgradnju aplikacije.
- Stvorio je OpenShift Build konfiguraciju.
- Preuzeo je builder sliku u unutarnji Docker registar OpenShift-a.
- Klonirao je 'Hello World' u lokalni repozitorij.
- Primijetio sam da postoji maven pom, pa sam sastavio aplikaciju koristeći maven.
- Stvorio sam novu sliku kontejnera koja sadrži sastavljenu Java aplikaciju i smjestio tu sliku u interni registar kontejnera.
- Stvorio sam Kubernetes Deployment sa specifikacijama pod-a, servisa itd.
- Pokrenuo sam deploy slike kontejnera.
- Izbrisao sam pomoćni build-pod.
Na ovom popisu ima puno toga, ali važno je da se cijela izrada odvija isključivo unutar OpenShifta; unutarnji Docker registar nalazi se unutar OpenShifta, a proces izrade stvara sve komponente Kubernetes-a i pokreće ih u klasteru.
Ako vizualno pratite pokretanje S2I u konzoli, možete vidjeti kako se prilikom izrade pokreće build pod.

Sada pogledajmo logove builder pod-a: prvo, tu se vidi kako maven obavlja svoj posao i preuzima ovisnosti za izgradnju naše java aplikacije.

Nakon što je završena maven izrada, pokreće se izrada slike kontejnera, a zatim se ta napravljena slika šalje u internu repozitorij.

Sve, proces izrade je završen. Sada se uvjerimo da su se podovi i servisi naše aplikacije pokrenuli u klasteru.
oc get service
![]()
To je to. I samo jedna naredba. Ostaje nam samo izvesti ovaj servis za pristup izvana.
Korak 3 – izvodimo servis za pristup izvana
Kao i u slučaju KUB-a, našemu "Hello World" na OpenShiftu također je potreban usmjerivač za usmjeravanje vanjskog prometa na servis unutar klastera. U OpenShiftu je to vrlo jednostavno. Prvo, komponenta usmjeravanja HAProxy je po defaultu instalirana u klasteru (može se zamijeniti s NGINX-om). Drugo, ovdje postoje specijalni resursi koji podržavaju opsežnu prilagodbu, koji se nazivaju Routes i podsjećaju na Ingress objekte u starom dobrom Kubernetes-u (zaista, OpenShift-ovi Routes su snažno utjecali na dizajn Ingress objekata, koji se sada mogu koristiti i u OpenShiftu), ali za naš "Hello World", kao i za gotovo sve ostale slučajeve, postaće dovoljna standardna Route bez dodatne prilagodbe.
Da stvorimo usmjerivi FQDN za "Hello World" (da, u OpenShiftu postoji vlastiti DNS za usmjeravanje po imenima servisa), jednostavno ćemo izvesti naš servis:

oc expose service quarkus-hello-world
Ako pogledamo upravo stvoreni Route, možemo pronaći FQDN i druge informacije o usmjeravanju:
oc get route
![]()
I konačno, obrati se našem servisu iz preglednika:

A sada je to zaista bilo lako!
Volimo Kubernetes i sve što ova tehnologija omogućava, a također cijenimo jednostavnost i lakoću. Kubernetes je razvijen kako bi nevjerojatno pojednostavio upravljanje distribuiranim skalabilnim kontejnerima, ali za puštanje aplikacija u rad, njegovoj jednostavnosti danas više nije dovoljno. I tu dolazi OpenShift, koji prati trendove i nudi Kubernetes koji je prvenstveno usmjeren na programere. Uloženi su ogromni napori kako bi se platforma OpenShift prilagodila baš programerima, uključujući razvoj alata poput S2I, ODI, Developer Portal, OpenShift Operator Framework, integraciju s IDE-ima, Developer Catalogues, integraciju s Helm-om, praćenje i mnoge druge.
Nadamo se da je ovaj članak bio zanimljiv i koristan za vas. Dodatne resurse, materijale i druge korisne stvari za razvoj na platformi OpenShift možete pronaći na portalu .
Izvor: habr.com
