Tento príspevok vznikol, pretože naši zamestnanci mali množstvo rozhovorov s klientmi o vývoji aplikácií na Kubernetes a o špecifikách tohto vývoja na OpenShift.

Zvyčajne začíname s tvrdením, že Kubernetes je len Kubernetes, zatiaľ čo OpenShift je už platforma na Kubernetes, ako Microsoft AKS alebo Amazon EKS. Každá z týchto platforiem má svoje výhody, zamerané na konkrétnu cieľovú skupinu. A potom sa už rozhovor presunie na porovnanie silných a slabých strán konkrétnych platforiem.
Celkom sme si mysleli, že napíšeme tento príspevok so záverom ako „Počujte, je to jedno, kde spúšťať kód, na OpenShift alebo na AKS, na EKS, na nejakom vlastnom Kubernetes, proste na hocijakom Kubernetes. (pre skratku nazvime to KUK) – je to naozaj jednoduché a tam, a tam.“
Potom sme plánovali vziať najjednoduchší „Hello World“ a na jeho príklade ukázať, čo majú spoločné a v čom sú rozdiely medzi KUK a Red Hat OpenShift Container Platform (ďalej OCP alebo jednoducho OpenShift).
Avšak pri písaní tohto príspevku sme si uvedomili, že sme si na OpenShift tak zvykli, že si ani neuvedomujeme, ako veľmi vyrástol a stal sa ohromnou platformou, ktorá je oveľa viac než len distribúcia Kubernetes. Zvykli sme si považovať zrelosť a jednoduchosť OpenShift za samozrejmosť, pričom sme prehliadali jeho nádheru.
Celkovo nastal čas aktívneho pokánia, a teraz krok za krokom porovnáme uvedenie nášho „Hello World“ na KUK a na OpenShift a urobíme to maximálne objektívne (no občas nebude chýbať osobný názor na tému). Ak vás zaujíma čisto subjektívny názor na túto tému, môžete si ho prečítať . A v tomto príspevku sa budeme držať iba faktov a len faktov.
Klastrovanie
Takže, pre naše „Hello World“ potrebujeme klastry. Hneď poviem „nie“ všetkým verejným cloudom, aby sme nemuseli platiť za servery, registre, siete, prenos dát atď. Preto volíme jednoduchý jednodeskový klastr na (pre KUK) a (pre klastr OpenShift). Oba tieto varianty sú naozaj jednoduché na inštaláciu, ale vyžadujú dosť veľa zdrojov na vašom notebooku.

Zostavenie na KUK
Takže, poďme na to.
Krok 1 – zostavujeme našu kontajnerovú podobu.
Začnem tým, že nasadím náš „Hello World“ na minikube. Na to budeme potrebovať:
- 1. Nainštalovaný Docker.
- 2. Nainštalovaný Git.
- 3. Nainštalovaný Maven (v tomto projekte sa v skutočnosti používa mvnw binárny súbor, takže to nie je potrebné).
- 4. Samozrejme, samotný zdrojový kód, t.j. klon repozitára
Najprv je potrebné vytvoriť projekt Quarkus. Nebojte sa, ak ste nikdy nepracovali so stránkou Quarkus.io – je to jednoduché. Stačí si vybrať komponenty, ktoré chcete vo svojom projekte použiť (RestEasy, Hibernate, Amazon SQS, Camel atď.), a potom sa Quarkus postará o nastavenie archetypu maven a všetko nahrá na github bez vášho zásahu. Teda doslova jedno kliknutie myšou – a je to. Preto máme Quarkus radi.

Najjednoduchší spôsob, ako zostaviť našu „Hello World“ do kontajnerového obrazu – je použiť rozšírenia quarkus-maven pre Docker, ktoré vykonajú všetku potrebnú prácu. S príchodom Quarkus sa to stalo naozaj ľahké a jednoduché: pridáte rozšírenie container-image-docker a môžete vytvárať obrazy príkazmi maven.
./mvnw quarkus:add-extension -Dextensions="container-image-docker"
A nakoniec zostavíme náš obraz pomocou Maven. Výsledkom je, že náš zdrojový kód sa premení na hotový kontajnerový obraz, ktorý už môžeme spustiť v prostredí kontajnerov.

./mvnw -X clean package -Dquarkus.container-image.build=true
A to je všetko, teraz môžeme spustiť kontajner príkazom docker run, pričom podmapujeme našu službu na port 8080, aby sme k nej mohli pristupovať.
docker run -i --rm -p 8080:8080 gcolman/quarkus-hello-world

Potom, čo je inštancia kontajnera spustená, stačí skontrolovať príkazom curl, či naša služba funguje:
![]()
Takže všetko funguje a bolo to naozaj jednoduché a ľahké.
Krok 2 – odosielame náš kontajner do repozitára kontajnerových obrazov
Doteraz vytvorený obraz je uložený lokálne v našom lokálnom kontajnerovom úložisku. Ak chceme tento obraz použiť v našom prostredí KÚK, musíme ho umiestniť do iného repozitára. V Kubernetes také funkcie nie sú, preto budeme používať dockerhub. Jednak je to zadarmo a jednak (takmer) všetci to robia.
Je to tiež veľmi jednoduché a potrebný je len účet na dockerhub.
Takže sa prihlásime do dockerhub a odosielame tam náš obraz.

Krok 3 – spúšťame Kubernetes
Existuje veľa spôsobov, ako zostaviť konfiguráciu kubernetes na spustenie nášho „Hello World“, ale použijeme ten najjednoduchší, sme takí ľudia...
Na začiatok spustíme klaster minikube:
minikube start
Krok 4 – nasadzujeme náš kontajnerový obraz
Teraz musíme pretransformovať náš kód a kontajnerový obraz do konfigurácií Kubernetes. Inými slovami, potrebujeme pod a definíciu nasadenia s odkazom na náš kontajnerový obraz na DockerHube. Jedným z najjednoduchších spôsobov, ako to urobiť, je spustiť príkaz create deployment a uviesť náš obraz:

kubectl create deployment hello-quarkus --image=gcolman/quarkus-hello-world:1.0.0-SNAPSHOT
Týmto príkazom sme povedali našemu KUBENETOVI, aby vytvoril konfiguráciu nasadenia, ktorá by mala obsahovať špecifikáciu podu pre náš kontajnerový obraz. Tento príkaz tiež aplikuje túto konfiguráciu na náš cluster minikube a vytvorí nasadenie, ktoré stiahne náš kontajnerový obraz a spustí pod v clustre.
Krok 5 – otvárame prístup k našej službe
Teraz, keď máme nasadený kontajnerový obraz, je čas zamyslieť sa nad tým, ako konfigurovať externý prístup k tejto Restful službe, ktorá je vlastne naprogramovaná v našom kóde.
Existuje mnoho spôsobov. Napríklad môžeme použiť príkaz expose na automatické vytvorenie príslušných komponentov Kubernetes, ako sú služby a koncové body. Presne to aj urobíme, vykonaním príkazu expose pre náš objekt nasadenia:
kubectl expose deployment hello-quarkus --type=NodePort --port=8080
Na chvíľu sa zastavme pri možnosťi "--type" príkazu expose.
Keď robíme expose a vytvárame komponenty potrebné na spustenie našej služby, potrebujeme, aby sa zvonku dalo pripojiť k službe hello-quarkus, ktorá sídli vo vnútri našej programovo definovanej siete. A parameter type nám umožňuje vytvoriť a pripojiť také veci, ako sú vyrovnávače záťaže, aby sa zrealizoval prenos dát do tejto siete.
Napríklad, zadaním type=LoadBalancer, automaticky aktivujeme vyrovnávač záťaže v verejnom cloude, aby sme sa mohli pripojiť k nášmu Kubernetes klastru. To je samozrejme skvelé, ale je potrebné pochopiť, že takáto konfigurácia bude pevne viazaná na konkrétny verejný cloud a bude ťažšie prenášateľná medzi Kubernetes inštancami v rôznych prostrediach.
V našom príklade type=NodePort, to znamená, že prístup k nášmu serveru prebieha prostredníctvom IP adresy uzla a čísla portu. Táto možnosť umožňuje nepoužívať žiadne verejné cloudové služby, avšak vyžaduje si niekoľko ďalších krokov. Po prvé, potrebujeme vlastný vyrovnávač záťaže, takže rozbehneme vyrovnávač záťaže NGINX v našom klastere.
Krok 6 – nastavujeme vyrovnávač záťaže
Minikube má množstvo natívnych funkcií, ktoré uľahčujú vytváranie potrebných komponentov na externý prístup, ako sú ingress kontroléry. Minikube prichádza spolu s ingress kontrolérom Nginx, a my ho len aktivujeme a nastavíme.
minikube addons enable ingress
Teraz pomocou jedného príkazu vytvoríme ingress kontrolér Nginx, ktorý bude fungovať v našom klastere minikube:
ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m
Krok 7 – Konfigurujeme ingress
Teraz musíme nastaviť ingress kontrolér Nginx, aby prijímal požiadavky na hello-quarkus.


A nakoniec, musíme použiť túto konfiguráciu.

kubectl apply -f ingress.yml
![]()
Keďže všetko robíme na svojom počítači, jednoducho pridáme IP adresu svojho uzla do súboru /etc/hosts, aby sme nasmerovali http požiadavky na náš minikube na vyrovnávač záťaže NGINX.
192.168.99.100 hello-quarkus.info
Hotovo, teraz je náš servis minikube prístupný zvonka cez ingress kontrolér Nginx.

No, bolo to ľahké, že? Alebo nie veľmi?

Spustenie na OpenShift (Code Ready Containers)
A teraz sa pozrieme, ako sa to všetko robí na Red Hat OpenShift Container Platform (OCP).
Rovnako ako v prípade minikube, vyberáme schému s jednodeskovým klastrom OpenShift vo forme Code Ready Containers (CRC). Predtým sa to nazývalo minishift a vychádzalo to z projektu OpenShift Origin, a teraz je to CRC a postavené na OpenShift Container Platform od Red Hat.
Tu sa, prepáčte, nemôžeme udržať a nehovoríme: „OpenShift je nádherný!“
Pôvodne sme chceli napísať, že vývoj na OpenShift sa nijako nelíši od vývoja na Kubernetes. A v podstate je to pravda. Ale počas písania tohto príspevku sme si spomenuli, koľko zbytočných pohybov musíme vykonať, keď nemáme OpenShift, a preto je, opakujeme, nádherný. Máme radi, keď sa veci robia jednoducho, a to, ako je ľahko v porovnaní s minikube naším príkladom vyvinuté a spustené na OpenShift, nás vlastne motivovalo napísať tento príspevok.
Poďme prejsť procesom a pozrime sa, čo budeme musieť urobiť.
Takže v príklade s minikube sme začínali s Docker… Počkajte, už nemusíme, aby bol Docker nainštalovaný na stroji.
A lokálny git nie je potrebný.
A Maven nie je potrebný.
A nie je potrebné vytvárať kontajnerový obraz manuálne.
A nie je potrebné hľadať žiadny repozitár kontajnerových obrazov.
A nie je potrebné inštalovať ingress-kontrolér.
A konfigurovať ingress tiež nie je potrebné.
Rozumiete, áno? Na to, aby sme nasadili a spustili našu aplikáciu na OpenShift, nie je potrebné nič z vyššie uvedeného. A samotný proces vyzerá nasledovne.
Krok 1 – Spúšťame svoj klaster OpenShift
Používame Code Ready Containers od Red Hat, ktorý v podstate je to isté ako Minikube, ale len s plnohodnotným jednouzlovým klastrom OpenShift.
crc start
Krok 2 – Vykonávame zostavenie a nasadenie aplikácie v klastru OpenShift
Práve v tomto kroku sa jednoduchosť a pohodlie OpenShift prejavujú v plnej kráse. Rovnako ako vo všetkých distribúciách Kubernetes, máme množstvo spôsobov, ako spustiť aplikáciu v klastru. A ako v prípade KÚK, vyberáme si najjednoduchšiu možnosť.
OpenShift bol vždy navrhnutý ako platforma na vytváranie a spúšťanie kontajnerových aplikácií. Zostavenie kontajnerov bolo vždy neoddeliteľnou súčasťou tejto platformy, a preto tu existuje množstvo ďalších Kubernetes-zdrojov pre príslušné úlohy.
Použijeme OpenShift proces Source 2 Image (S2I), ktorý má niekoľko rôznych spôsobov, ako získať náš zdrojový kód (kód alebo binárne súbory) a premeniť ho na kontajnerový obraz, ktorý sa spúšťa v klastru OpenShift.
Na to budeme potrebovať dve veci:
- Náš zdrojový kód v repozitári git
- Builder-obraz, na základe ktorého sa bude vykonávať zostavenie.
Existuje množstvo takýchto obrazov, pričom niektoré poskytuje Red Hat a iné sú na úrovni komunity, a my využijeme obraz OpenJDK, keďže vytváram aplikáciu v Jave.
S2I-zostavenie môžeme spustiť ako z grafickej konzoly OpenShift Developer, tak z príkazového riadku. My využijeme príkaz new-app, ktorému určíme, odkiaľ brať builder-obraz a náš zdrojový kód.

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git
Hotovo, naša aplikácia bola vytvorená. Pri tom proces S2I vykonal nasledujúce úkony:
- Vytvoril pomocný build-pod pre rôzne úlohy súvisiace so zostavením aplikácie.
- Vytvoril konfiguračný OpenShift Build.
- Stiahol builder-obraz do vnútorného docker-registra OpenShift.
- Naklonoval 'Hello World' do lokálneho repozitára.
- Všimol som si, že tam je maven pom, a preto som aplikáciu zkompiloval pomocou maven.
- Vytvoril som nový kontajnerový obraz, ktorý obsahuje skompilovanú Java aplikáciu, a uložil tento obraz do interného kontajnerového registra.
- Vytvoril som Kubernetes Deployment so špecifikáciami podu, služby a podobne.
- Spustil som nasadenie kontajnerového obrazu.
- Odstránil som dočasný build-pod.
V tomto zozname je veľa vecí, ale hlavné je, že celý proces zostavenia prebieha výhradne v rámci OpenShift, interný Docker registry sa nachádza v OpenShift a proces zostavenia vytvára všetky komponenty Kubernetes a spúšťa ich v klastri.
Ak vizuálne sledujete spustenie S2I v konzole, môžete vidieť, ako pri vykonaní zostavenia beží build pod.

A teraz sa pozrime na logy builder podu: po prvé, môžete vidieť, ako maven vykonáva svoju prácu a sťahuje závislosti na zostavenie našej java aplikácie.

Po skončení maven zostavenia sa spúšťa zostavenie kontajnerového obrazu a potom sa tento zostavený obraz odosiela do interného repozitára.

Všetko, proces zostavenia je dokončený. Teraz sa uistíme, že v klastri sú spustené pody a služby našej aplikácie.
oc get service
![]()
A je to. A všetko to bolo s jedným príkazom. Ostáva nám len sprístupniť túto službu pre prístup zvonka.
Krok 3 – sprístupnenie služby pre prístup zvonka
Rovnako ako v prípade KUB, aj pre náš „Hello World“ potrebujeme na platforme OpenShift router, ktorý smeruje externý traffic na službu vo vnútri klastra. V OpenShift je to veľmi jednoduché. Po prvé, v klastri je predvolene nainštalovaný komponent routovania HAProxy (môžete ho vymeniť za NGINX). Po druhé, sú tu špeciálne zdroje s širokými možnosťami konfigurácie, ktoré sa nazývajú Routes a pripomínajú Ingress objekty v starom dobrom Kubernetes (v skutočnosti mali openShiftské Routes veľký vplyv na dizajn Ingress objektov, ktoré sa teraz môžu používať aj v OpenShift), ale pre náš „Hello World“, a aj v takmer všetkých ostatných prípadoch, nám stačí štandardná Route bez ďalšej konfigurácie.
Aby sme vytvorili routovateľný FQDN pre „Hello World“ (áno, v OpenShift je svoj DNS pre routovanie podľa názvov služieb), jednoducho vykonáme expose pre našu službu:

oc expose service quarkus-hello-world
Ak sa pozrieme na práve vytvorený Route, môžeme tam nájsť FQDN a ďalšie informácie o routovaní:
oc get route
![]()
A nakoniec sa prihlásime k našej službe z prehliadača:

A teraz to naozaj bolo jednoduché!
Milujeme Kubernetes a všetko, čo táto technológia umožňuje, rovnako ako milujeme jednoduchosť a ľahkosť. Kubernetes bol vytvorený na to, aby mimoriadne zjednodušil prevádzku distribuovaných škálovateľných kontajnerov, ale na zavedenie aplikácií už jeho jednoduchosť nestačí. A tu prichádza do hry OpenShift, ktorý ide s dobou a ponúka Kubernetes zameraný predovšetkým na vývojárov. Bolo vynaložené veľa úsilia na prispôsobenie platformy OpenShift práve pre vývojárov, vrátane vytvorenia takých nástrojov ako S2I, ODI, Developer Portal, OpenShift Operator Framework, integrácia s IDE, Developer Catalogues, integrácia s Helm, monitoring a mnohé ďalšie.
Dúfame, že tento článok bol pre vás zaujímavý a užitočný. Ďalšie zdroje, materiály a ďalšie užitočné informácie o vývoji na platforme OpenShift môžete nájsť na portáli .
Zdroj: habr.com
