ProHoster > Blog > Administrácia > 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ť
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.
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.
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. Docker nainštalovaný.
2. Git nainštalovaný.
3. Nainštalovaný Maven (v skutočnosti tento projekt používa binárny súbor mvnw, takže sa bez neho zaobídete).
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.
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.
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.
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
Po spustení inštancie kontajnera zostáva už len pomocou príkazu curl skontrolovať, či je naša služba spustená:
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.
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:
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:
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:
Teraz musíme nakonfigurovať kontrolér vstupu Nginx tak, aby prijímal požiadavky hello-quarkus.
A nakoniec musíme použiť túto konfiguráciu.
kubectl apply -f ingress.yml
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.
No, to bolo ľahké, však? Alebo nie až tak veľa?
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.
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.
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.
Po dokončení zostavenia maven sa spustí zostavovanie obrazu kontajnera a potom sa tento zostavený obraz odošle do interného úložiska.
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
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:
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
A nakoniec pristupujeme k našej službe z prehliadača:
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.