Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Tento príspevok bol napísaný, pretože naši zamestnanci mali pomerne veľa rozhovorov s klientmi o vývoji aplikácií na Kubernetes a špecifikách takéhoto vývoja na OpenShift.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Zvyčajne začíname tézou, že Kubernetes je len Kubernetes a OpenShift je už platforma Kubernetes, ako napríklad Microsoft AKS alebo Amazon EKS. Každá z týchto platforiem má svoje výhody zamerané na konkrétne cieľové publikum. A potom sa rozhovor zvrtne na porovnanie silných a slabých stránok konkrétnych platforiem.

Vo všeobecnosti nás napadlo napísať tento príspevok so záverom ako „Počúvajte, nezáleží na tom, kde spustiť kód, na OpenShift alebo na AKS, na EKS, na niektorých vlastných Kubernetes alebo na akomkoľvek Kubernetes. (pre stručnosť to nazvime KUK) "Je to naozaj jednoduché, tam aj tam."

Potom sme plánovali vziať najjednoduchšie „Hello World“ a na jeho príklade ukázať, čo je spoločné a aký je rozdiel medzi KUC a Red Hat OpenShift Container Platform (ďalej len OCP alebo jednoducho OpenShift).

Keď sme však písali tento príspevok, uvedomili sme si, že sme boli tak dlho zvyknutí používať OpenShift, že sme si jednoducho neuvedomili, ako sa rozrástol a zmenil sa na úžasnú platformu, ktorá sa stala oveľa viac než len distribúciou Kubernetes. Máme tendenciu považovať vyspelosť a jednoduchosť OpenShift za samozrejmosť a strácame zo zreteľa jeho brilantnosť.

Vo všeobecnosti nastal čas na aktívne pokánie a teraz krok za krokom porovnáme uvedenie nášho „Hello World“ do prevádzky na KUK a na OpenShift a urobíme to čo najobjektívnejšie (dobre, až na to, že niekedy ukážeme osobný postoj k téme). Ak vás zaujíma čisto subjektívny názor na túto problematiku, tak si ho môžete prečítať tu (EN). A v tomto príspevku sa budeme držať faktov a len faktov.

Zhluky

Takže náš „Ahoj svet“ vyžaduje klastre. Okamžite povieme „nie“ akýmkoľvek verejným cloudom, aby sme neplatili za servery, registre, siete, prenos údajov atď. Podľa toho zvolíme jednoduchý jednouzlový klaster zapnutý Minikube (pre KUK) a Kontajnery pripravené na kód (pre klaster OpenShift). Obe tieto možnosti sa naozaj ľahko inštalujú, ale budú vyžadovať pomerne veľa zdrojov na vašom notebooku.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Montáž na KUK-e

Tak poďme.

Krok 1 – vytvorenie imidžu nášho kontajnera

Začnime nasadením nášho „Hello World“ do minikube. K tomu budete potrebovať:

  1. 1. Docker nainštalovaný.
  2. 2. Git nainštalovaný.
  3. 3. Nainštalovaný Maven (v skutočnosti tento projekt používa binárny súbor mvnw, takže sa bez neho zaobídete).
  4. 4. Vlastne samotný zdroj, t.j. klon úložiska github.com/gcolman/quarkus-hello-world.git

Prvým krokom je vytvorenie projektu Quarkus. Nezľaknite sa, ak ste s Quarkus.io nikdy nepracovali – je to jednoduché. Vy si len vyberiete komponenty, ktoré chcete v projekte použiť (RestEasy, Hibernate, Amazon SQS, Camel atď.), a potom samotný Quarkus bez vašej účasti nakonfiguruje maven archetyp a všetko dá na github. To znamená doslova jedno kliknutie myšou a máte hotovo. To je dôvod, prečo milujeme Quarkus.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Najjednoduchší spôsob, ako postaviť náš „Hello World“ do kontajnerového obrazu, je použiť rozšírenia quarkus-maven pre Docker, ktoré urobia všetku potrebnú prácu. S príchodom Quarkusu sa to stalo skutočne jednoduchým a jednoduchým: pridajte rozšírenie container-image-docker a môžete vytvárať obrázky pomocou príkazov maven.

./mvnw quarkus:add-extension -Dextensions=”container-image-docker”

Nakoniec vytvoríme náš imidž pomocou Maven. Výsledkom je, že náš zdrojový kód sa zmení na hotový obrázok kontajnera, ktorý už možno spustiť v prostredí kontajnera.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

./mvnw -X clean package -Dquarkus.container-image.build=true

To je v skutočnosti všetko, teraz môžete spustiť kontajner pomocou príkazu docker run po namapovaní našej služby na port 8080, aby bol prístupný.

docker run -i — rm -p 8080:8080 gcolman/quarkus-hello-world

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Po spustení inštancie kontajnera zostáva už len pomocou príkazu curl skontrolovať, či je naša služba spustená:

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Takže všetko funguje a bolo to naozaj ľahké a jednoduché.

Krok 2 – odošlite náš kontajner do úložiska obrázkov kontajnera

Obrázok, ktorý sme vytvorili, je zatiaľ uložený lokálne, v našom lokálnom kontajnerovom úložisku. Ak chceme tento obrázok použiť v našom prostredí COOK, musí byť umiestnený v nejakom inom úložisku. Kubernetes takéto funkcie nemá, preto použijeme dockerhub. Lebo po prvé je to zadarmo a po druhé to robí (takmer) každý.

Toto je tiež veľmi jednoduché a všetko, čo potrebujete, je účet dockerhub.

Takže nainštalujeme dockerhub a pošleme tam náš obrázok.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Krok 3 – spustite Kubernetes

Existuje mnoho spôsobov, ako zostaviť konfiguráciu kubernetes na spustenie nášho „Hello World“, ale my použijeme ten najjednoduchší z nich, takí sme...

Najprv spustíme klaster minikube:

minikube start

Krok 4 – nasaďte náš obrázok kontajnera

Teraz musíme previesť náš kód a obrázok kontajnera do konfigurácií kubernetes. Inými slovami, potrebujeme pod a definíciu nasadenia, ktorá ukazuje na náš obrázok kontajnera na dockerhub. Jedným z najjednoduchších spôsobov, ako to urobiť, je spustiť príkaz create deployment ukazujúci na náš obrázok:

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

kubectl create deployment hello-quarkus — image =gcolman/quarkus-hello-world:1.0.0-SNAPSHOT

Týmto príkazom sme povedali nášmu COO, aby vytvoril konfiguráciu nasadenia, ktorá by mala obsahovať špecifikáciu pod pre náš obrázok kontajnera. Tento príkaz tiež použije túto konfiguráciu na náš klaster minikube a vytvorí nasadenie, ktoré stiahne náš obrázok kontajnera a spustí modul v klastri.

Krok 5 – otvorte prístup k našej službe

Teraz, keď máme nasadený obrázok kontajnera, je čas premýšľať o tom, ako nakonfigurovať externý prístup k tejto službe Restful, ktorá je v skutočnosti naprogramovaná v našom kóde.

Tu je veľa spôsobov. Môžete napríklad použiť príkaz expose na automatické vytvorenie príslušných komponentov Kubernetes, ako sú služby a koncové body. V skutočnosti to urobíme vykonaním príkazu expose pre náš objekt nasadenia:

kubectl expose deployment hello-quarkus — type=NodePort — port=8080

Poďme sa na chvíľu pozrieť na možnosť „-type“ príkazu expose.

Keď odhalíme a vytvoríme komponenty potrebné na spustenie našej služby, okrem iného musíme byť schopní pripojiť sa zvonku k službe hello-quarkus, ktorá je umiestnená v našej softvérovo definovanej sieti. A parameter typ nám umožňuje vytvárať a spájať veci, ako sú nástroje na vyvažovanie záťaže na smerovanie prevádzky do tejto siete.

Napríklad písaním type=LoadBalancer, automaticky poskytujeme nástroj na vyvažovanie záťaže vo verejnom cloude na pripojenie k nášmu klastru Kubernetes. To je, samozrejme, skvelé, ale musíte pochopiť, že takáto konfigurácia bude striktne viazaná na konkrétny verejný cloud a bude náročnejšia na prenos medzi inštanciami Kubernetes v rôznych prostrediach.

V našom príklade type=NodePort, to znamená, že k našej službe sa pristupuje pomocou adresy IP uzla a čísla portu. Táto možnosť vám umožňuje nepoužívať žiadne verejné cloudy, ale vyžaduje si množstvo ďalších krokov. Po prvé, potrebujete vlastný nástroj na vyrovnávanie zaťaženia, takže nástroj na vyrovnávanie zaťaženia NGINX nasadíme do nášho klastra.

Krok 6 – nainštalujte vyvažovač záťaže

minikube má množstvo funkcií platformy, ktoré uľahčujú vytváranie externe prístupných komponentov, ako sú napríklad kontroléry vstupu. Minikube je dodávaný s kontrolérom vstupu Nginx a všetko, čo musíme urobiť, je povoliť a nakonfigurovať ho.

minikube addons enable ingress

Teraz vytvoríme vstupný kontrolér Nginx iba jedným príkazom, ktorý bude fungovať v našom minikube klastri:

ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m

Krok 7 – Nastavenie vstupu

Teraz musíme nakonfigurovať kontrolér vstupu Nginx tak, aby prijímal požiadavky hello-quarkus.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

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

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

kubectl apply -f ingress.yml

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Keďže to všetko robíme na vlastnom počítači, jednoducho pridáme IP adresu nášho uzla do súboru /etc/ hosts, aby sme http požiadavky smerovali do nášho minikube do vyrovnávača zaťaženia NGINX.

192.168.99.100 hello-quarkus.info

To je všetko, teraz je naša služba minikube prístupná externe prostredníctvom kontroléra vstupu Nginx.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

No, to bolo ľahké, však? Alebo nie až tak veľa?

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Beží na OpenShift (kontajnery pripravené na kód)

Teraz sa pozrime, ako sa to všetko robí na Red Hat OpenShift Container Platform (OCP).

Rovnako ako v prípade minikube volíme jednouzlový dizajn klastra OpenShift vo forme kontajnerov pripravených na kód (CRC). Predtým sa nazýval minishift a bol založený na projekte OpenShift Origin, ale teraz je to CRC a je postavený na OpenShift Container Platform spoločnosti Red Hat.

Tu si, prepáčte, nemôžeme pomôcť, ale povedať: „OpenShift je úžasný!“

Pôvodne sme chceli napísať, že vývoj na OpenShift sa nelíši od vývoja na Kubernetes. A v podstate to tak je. Ale v procese písania tohto príspevku sme si spomenuli, koľko zbytočných pohybov musíte urobiť, keď nemáte OpenShift, a preto je to opäť krásne. Máme radi, keď sú veci jednoduché, a to, aké ľahké je nasadiť a spustiť náš príklad na OpenShift v porovnaní s minikube, nás inšpirovalo k napísaniu tohto príspevku.

Poďme si prejsť procesom a uvidíme, čo musíme urobiť.

Takže v príklade minikube sme začali s Dockerom... Počkajte, už nepotrebujeme Docker nainštalovaný na počítači.

A nepotrebujeme lokálny git.
A Maven nie je potrebný.
A nemusíte vytvárať obrázok kontajnera vlastnými rukami.
A nemusíte hľadať žiadne úložisko obrázkov kontajnerov.
A nie je potrebné inštalovať kontrolér vstupu.
A nemusíte konfigurovať ani vstup.

Rozumieš, však? Na nasadenie a spustenie našej aplikácie na OpenShift nepotrebujete nič z vyššie uvedeného. A samotný proces vyzerá takto.

Krok 1 – Spustite klaster OpenShift

Používame Code Ready Containers od Red Hat, čo je v podstate rovnaký Minikube, ale len s plnohodnotným jednouzlovým klastrom Openshift.

crc start

Krok 2 – Vytvorte a nasaďte aplikáciu do klastra OpenShift

Práve v tomto kroku sa odhalí jednoduchosť a pohodlie OpenShift v celej svojej kráse. Rovnako ako pri všetkých distribúciách Kubernetes máme mnoho spôsobov, ako spustiť aplikáciu v klastri. A ako v prípade KUK, aj tu si vyberáme konkrétne ten najjednoduchší.

OpenShift bol vždy vytvorený ako platforma na vytváranie a spúšťanie kontajnerových aplikácií. Budovanie kontajnerov bolo vždy neoddeliteľnou súčasťou tejto platformy, takže existuje množstvo ďalších zdrojov Kubernetes pre súvisiace úlohy.

Použijeme proces Source 2 Image (S2I) OpenShift, ktorý má niekoľko rôznych spôsobov, ako vziať náš zdrojový kód (kód alebo binárne súbory) a premeniť ho na kontajnerový obrázok, ktorý beží na klastri OpenShift.

Na to potrebujeme dve veci:

  • Náš zdrojový kód je v úložisku git
  • Obrázok staviteľa, na základe ktorého sa bude stavať.

Existuje veľa takýchto obrázkov, ktoré spravuje Red Hat aj na komunitnej úrovni a my budeme používať obrázok OpenJDK, keďže vytváram aplikáciu Java.

Zostavu S2I môžete spustiť z grafickej konzoly OpenShift Developer aj z príkazového riadku. Použijeme príkaz new-app, ktorý mu povie, kde získať obrázok tvorcu a náš zdrojový kód.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git

To je všetko, naša aplikácia je vytvorená. Pritom proces S2I vykonal nasledujúce veci:

  • Vytvoril servisný build-pod pre všetky druhy vecí súvisiacich s vytváraním aplikácie.
  • Vytvorila sa konfigurácia zostavy OpenShift.
  • Stiahol som si obrázok tvorcu do interného registra dokovacieho zariadenia OpenShift.
  • Klonovaný „Hello World“ do miestneho úložiska.
  • Videl som, že tam bol maven pom, tak som aplikáciu skompiloval pomocou maven.
  • Vytvoril nový obrázok kontajnera obsahujúci skompilovanú aplikáciu Java a vložil tento obrázok do interného registra kontajnerov.
  • Vytvorené Kubernetes Deployment so špecifikáciami pre pod, službu atď.
  • Začal som nasadzovať obrázok kontajnera.
  • Odstránil sa modul na zostavenie služby.

V tomto zozname je toho veľa, ale hlavná vec je, že celá zostava sa odohráva výlučne vo vnútri OpenShift, interný register Docker je vo vnútri OpenShift a proces zostavovania vytvára všetky komponenty Kubernetes a spúšťa ich v klastri.

Ak vizuálne sledujete spustenie S2I v konzole, môžete vidieť, ako sa zostava spúšťa po dokončení zostavovania.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Teraz sa pozrime na protokoly builder pod: po prvé, ukazuje, ako maven robí svoju prácu a sťahuje závislosti na zostavenie našej Java aplikácie.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Po dokončení zostavenia maven sa spustí zostavovanie obrazu kontajnera a potom sa tento zostavený obraz odošle do interného úložiska.

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

To je všetko, proces zostavovania je dokončený. Teraz sa uistite, že moduly a služby našej aplikácie bežia v klastri.

oc get service

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

To je všetko. A len jeden tím. Jediné, čo musíme urobiť, je sprístupniť túto službu pre prístup zvonku.

Krok 3 – sprístupnenie služby pre prístup zvonku

Rovnako ako v prípade KUC, aj na platforme OpenShift náš „Hello World“ potrebuje smerovač na nasmerovanie externej prevádzky na službu v rámci klastra. OpenShift to veľmi uľahčuje. Po prvé, komponent smerovania HAProxy je štandardne nainštalovaný v klastri (dá sa zmeniť na rovnaký NGINX). Po druhé, existujú špeciálne a vysoko konfigurovateľné zdroje nazývané Routes a pripomínajúce objekty Ingress v starých dobrých Kubernetes (v skutočnosti Routes OpenShift výrazne ovplyvnili dizajn objektov Ingress, ktoré je teraz možné použiť v OpenShift), ale pre náš „Ahoj svet“ a takmer vo všetkých ostatných prípadoch nám stačí štandardná Route bez dodatočnej konfigurácie.

Na vytvorenie smerovateľného FQDN pre „Hello World“ (áno, OpenShiift má svoj vlastný DNS na smerovanie podľa názvov služieb), jednoducho odkryjeme našu službu:

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

oc expose service quarkus-hello-world

Ak sa pozriete na novovytvorenú trasu, nájdete tam FQDN a ďalšie informácie o smerovaní:

oc get route

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

A nakoniec pristupujeme k našej službe z prehliadača:

Prepáčte OpenShift, dostatočne sme si vás nevážili a považovali sme vás za samozrejmosť

Ale teraz to bolo naozaj jednoduché!

Milujeme Kubernetes a všetko, čo vám táto technológia umožňuje, a tiež milujeme jednoduchosť a ľahkosť. Kubernetes bol navrhnutý tak, aby sa distribuované, škálovateľné kontajnery neuveriteľne ľahko ovládali, ale jeho jednoduchosť už dnes nestačí na uvedenie aplikácií do produkcie. Tu vstupuje do hry OpenShift, ktorý drží krok s dobou a ponúka Kubernetes zameraný na vývojárov. Veľa úsilia sa investovalo do prispôsobenia platformy OpenShift špeciálne pre vývojárov, vrátane vytvorenia nástrojov ako S2I, ODI, Developer Portal, OpenShift Operator Framework, integrácia IDE, katalógy vývojárov, integrácia Helm, monitorovanie a mnoho ďalších.

Dúfame, že tento článok bol pre vás zaujímavý a užitočný. Ďalšie zdroje, materiály a ďalšie veci užitočné pre vývoj na platforme OpenShift nájdete na portáli Vývojári Red Hat.

Zdroj: hab.com

Pridať komentár