Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Ovaj post je napisan jer je naše osoblje imalo dosta razgovora s klijentima o razvoju aplikacija na Kubernetesu i specifičnostima takvog razvoja na OpenShiftu.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Obično krećemo s tezom da je Kubernetes samo Kubernetes, a OpenShift je već Kubernetes platforma, poput Microsoft AKS ili Amazon EKS. Svaka od ovih platformi ima svoje prednosti, usmjerene na određenu ciljanu publiku. A nakon toga razgovor već teče u usporedbu snaga i slabosti pojedinih platformi.

Općenito, mislili smo napisati ovaj post s izlazom poput "Slušajte, nije važno gdje pokrećete kod, na OpenShiftu ili na AKS-u, na EKS-u, na nekom prilagođenom Kubernetesu, da na bilo kojem Kubernetesu (nazovimo ga skraćeno KUK) "Stvarno je jednostavno, i tamo i tamo."

Zatim smo planirali uzeti najjednostavniji "Hello World" i njime pokazati što je zajedničko, a koje su razlike između CMC-a i Red Hat OpenShift Container Platform-a (u daljnjem tekstu OCP ili jednostavno OpenShift).

Međutim, tijekom pisanja ovog posta, shvatili smo da smo se toliko navikli na korištenje OpenShifta da jednostavno ne shvaćamo kako je narastao i pretvorio se u nevjerojatnu platformu koja je postala mnogo više od samo Kubernetes distribucije. Skloni smo uzeti zrelost i jednostavnost OpenShifta zdravo za gotovo, dok previđamo njegovu veličanstvenost.

Općenito, došlo je vrijeme za aktivno pokajanje, a sada ćemo korak po korak usporediti puštanje u rad našeg "Hello World" na KUK-u i na OpenShiftu, i učinit ćemo to što je moguće objektivnije (dobro, osim ponekad pokazivanja osobnog odnos prema predmetu). Ako vas zanima čisto subjektivno mišljenje o ovom pitanju, onda ga možete pročitati ovdje (HR). I u ovom postu držat ćemo se činjenica i samo činjenica.

Grozdovi

Dakle, naš "Hello World" treba klastere. Recimo samo "ne" bilo kakvim javnim oblacima, da ne plaćamo servere, registre, mreže, prijenos podataka itd. U skladu s tim odabiremo jednostavan klaster s jednim čvorom Minikube (za KUK) i Spremnici spremni za kod (za OpenShift klaster). Obje su ove mogućnosti vrlo jednostavne za instalaciju, ali zahtijevaju dosta resursa na vašem prijenosnom računalu.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Montaža na KUK-e

Pa, idemo.

Korak 1 - Izgradnja našeg imidža spremnika

Počnimo s postavljanjem našeg "Hello World" na minikube. Ovo će zahtijevati:

  1. 1. Instalirani Docker.
  2. 2. Instalirao Git.
  3. 3. Instaliran Maven (zapravo, ovaj projekt koristi mvnw binary, tako da možete i bez njega).
  4. 4. Zapravo, sam izvor, t.j. klon spremišta github.com/gcolman/quarkus-hello-world.git

Prvi korak je kreiranje Quarkus projekta. Nemojte se bojati ako nikada niste koristili Quarkus.io - jednostavno je. Vi samo odaberete komponente koje želite koristiti u projektu (RestEasy, Hibernate, Amazon SQS, Camel itd.), a zatim Quarkus sam, bez ikakvog vašeg sudjelovanja, postavlja maven arhetip i stavlja sve na github. Odnosno, doslovno jedan klik mišem – i gotovi ste. Zbog toga volimo Quarkus.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Najlakši način za izgradnju našeg "Hello World" u kontejnersku sliku je korištenje quarkus-maven ekstenzija za Docker, koje će obaviti sav potreban posao. S pojavom Quarkusa, ovo je postalo stvarno lako i jednostavno: dodajte ekstenziju container-image-docker i možete stvarati slike s maven naredbama.

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

I konačno, gradimo svoju sliku koristeći Maven. Kao rezultat toga, naš se izvorni kod pretvara u gotovu sliku spremnika, koja se već može pokrenuti u runtimeu spremnika.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

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

To je zapravo sve, sada možete pokrenuti spremnik s docker run naredbom, mapirajući našu uslugu na port 8080 tako da joj se može pristupiti.

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

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Nakon pokretanja instance spremnika, preostaje samo provjeriti naredbom curl radi li naša usluga:

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Dakle, sve radi, i bilo je stvarno lako i jednostavno.

Korak 2 - Pošaljite naš spremnik u spremište slika spremnika

Za sada je slika koju smo izradili pohranjena lokalno u našoj lokalnoj pohrani spremnika. Ako želimo koristiti ovu sliku u našem KUK okruženju, onda je moramo staviti u neki drugi repozitorij. Kubernetes nema ove značajke, pa ćemo koristiti dockerhub. Jer, prvo, besplatno je, a drugo, (gotovo) svi to rade.

Ovo je također vrlo jednostavno i ovdje je potreban samo dockerhub račun.

Dakle, instaliramo dockerhub i tamo šaljemo našu sliku.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Korak 3 - Pokrenite Kubernetes

Postoji mnogo načina za sastavljanje kubernetes konfiguracije za pokretanje našeg "Hello World", ali mi ćemo koristiti najjednostavniji od njih, jer mi smo takvi ljudi ...

Prvo pokrećemo minikube klaster:

minikube start

Korak 4 - Implementacija naše slike spremnika

Sada moramo pretvoriti naš kod i sliku spremnika u kubernetes konfiguraciju. Drugim riječima, trebamo pod i definiciju implementacije koja ukazuje na našu sliku spremnika na dockerhub-u. Jedan od najlakših načina da to učinite je pokretanje naredbe create deployment koja pokazuje na našu sliku:

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

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

Ovom smo naredbom rekli našem COOK-u da izradi konfiguraciju implementacije, koja bi trebala sadržavati specifikaciju pod-a za našu sliku spremnika. Ova naredba također će primijeniti ovu konfiguraciju na naš minikube klaster i stvoriti implementaciju koja će preuzeti našu sliku spremnika i pokrenuti pod na klasteru.

Korak 5 - otvorite pristup našoj usluzi

Sada kada imamo postavljenu sliku spremnika, vrijeme je da razmislimo o tome kako konfigurirati vanjski pristup ovoj Restful usluzi, koja je zapravo programirana u našem kodu.

Postoji mnogo načina ovdje. Na primjer, možete koristiti naredbu expose za automatsko stvaranje odgovarajućih Kubernetes komponenti kao što su usluge i krajnje točke. Zapravo, ovo je ono što ćemo učiniti izvršavanjem naredbe expose za naš objekt implementacije:

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

Zadržimo se na trenutak na opciji "-type" naredbe expose.

Kada izložimo i stvorimo komponente potrebne za pokretanje naše usluge, moramo se, između ostalog, moći povezati izvana s uslugom hello-quarkus koja se nalazi unutar naše softverski definirane mreže. I parametar vrsta omogućuje nam stvaranje i povezivanje stvari poput balansera opterećenja za usmjeravanje prometa na tu mrežu.

Na primjer, pisanje tip=LoadBalancer, automatski inicijaliziramo javni balanser opterećenja u oblaku za povezivanje s našim Kubernetes klasterom. To je, naravno, sjajno, ali morate razumjeti da će takva konfiguracija biti usko vezana uz određeni javni oblak i bit će je teže prenositi između Kubernetes instanci u različitim okruženjima.

U našem primjeru tip=NodePort, odnosno poziv našem servisu ide preko IP adrese čvora i broja porta. Ova vam opcija omogućuje da ne koristite javne oblake, ali zahtijeva niz dodatnih koraka. Prvo, trebate svoj vlastiti balanser opterećenja, pa ćemo implementirati NGINX balanser opterećenja u našem klasteru.

Korak 6 - Postavite balanser opterećenja

minikube ima niz značajki platforme koje olakšavaju stvaranje komponenti koje su vam potrebne za vanjski pristup, kao što su ulazni kontroleri. Minikube dolazi u paketu s Nginx ulaznim kontrolerom, a sve što trebamo učiniti je omogućiti ga i konfigurirati.

minikube addons enable ingress

Sada, sa samo jednom naredbom, kreirat ćemo Nginx ulazni kontroler koji će raditi unutar našeg minikube klastera:

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

Korak 7 - Postavite ulaz

Sada moramo konfigurirati Nginx ulazni kontroler da prihvati hello-quarkus zahtjeve.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

I konačno, moramo primijeniti ovu konfiguraciju.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

kubectl apply -f ingress.yml

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Budući da sve ovo radimo na vlastitom računalu, jednostavno dodajemo IP adresu našeg čvora u datoteku /etc/hosts kako bismo http zahtjeve usmjerili prema našem minikubeu prema NGINX balanseru opterećenja.

192.168.99.100 hello-quarkus.info

To je to, sada je naša minikube usluga dostupna izvana putem Nginx ulaznog kontrolera.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

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

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Pokreni na OpenShift (spremnici spremni za kod)

A sada da vidimo kako se sve to radi na Red Hat OpenShift Container Platform (OCP).

Kao i u slučaju minikubea, odabiremo shemu s OpenShift klasterom s jednim čvorom u obliku spremnika spremnih za kodiranje (CRC). Prije se zvao minishift i temeljio se na projektu OpenShift Origin, ali sada je CRC i izgrađen na Red Hatovoj platformi OpenShift Container.

Ovdje, oprostite, ne možemo a da ne kažemo: "OpenShift je sjajan!"

U početku smo mislili napisati da se razvoj na OpenShiftu ne razlikuje od razvoja na Kubernetesu. I zapravo je tako. Ali u procesu pisanja ovog posta, sjetili smo se koliko nepotrebnih pokreta morate napraviti kada nemate OpenShift, i zato je, opet, prekrasan. Volimo da su stvari jednostavne, a koliko je lako implementirati i pokrenuti naš primjer na OpenShiftu u usporedbi s minikubeom ono je što nas je inspiriralo da napišemo ovaj post.

Prođimo kroz proces i vidimo što trebamo učiniti.

Dakle, u primjeru minikubea, počeli smo s Dockerom... Čekaj, više nam ne treba Docker instaliran na stroju.

I ne treba nam lokalni git.
A Maven nije potreban.
I ne morate ručno stvarati sliku spremnika.
I ne morate tražiti nikakvo spremište slika spremnika.
I ne morate instalirati ulazni kontroler.
A ne morate ni konfigurirati ulaz.

Da li razumiješ? Za implementaciju i pokretanje naše aplikacije na OpenShiftu nije potrebno ništa od navedenog. A sam proces je sljedeći.

Korak 1 – Pokretanje vašeg OpenShift klastera

Koristimo Code Ready Containers tvrtke Red Hat, što je u biti isti Minikube, ali samo s punim Openshift klasterom s jednim čvorom.

crc start

Korak 2 - Izgradite i implementirajte aplikaciju na OpenShift klaster

Upravo na ovom koraku jednostavnost i praktičnost OpenShifta dolazi do izražaja u punom sjaju. Kao i kod svih Kubernetes distribucija, imamo mnogo načina za pokretanje aplikacije na klasteru. I, kao iu slučaju KUK-a, posebno biramo najjednostavniji.

OpenShift je oduvijek građen kao platforma za izradu i pokretanje kontejnerskih aplikacija. Izgradnja kontejnera oduvijek je bila sastavni dio ove platforme, tako da postoji hrpa dodatnih Kubernetes resursa za odgovarajuće zadatke.

Koristit ćemo OpenShiftov proces Source 2 Image (S2I), koji ima nekoliko različitih načina za uzimanje našeg izvora (kod ili binarne datoteke) i pretvaranje u kontejnersku sliku koja se izvodi na OpenShift klasteru.

Za ovo su nam potrebne dvije stvari:

  • Naš izvorni kod u git repozitoriju
  • Builder-slika, na temelju koje će se izvršiti montaža.

Postoji mnogo takvih slika, koje održava i Red Hat i zajednica, a mi ćemo koristiti OpenJDK sliku, pa, budući da gradim Java aplikaciju.

Možete pokrenuti S2I izgradnju iz grafičke konzole OpenShift Developer i iz naredbenog retka. Koristit ćemo naredbu new-app, govoreći joj gdje da dobije sliku graditelja i naš izvorni kod.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

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

To je to, naša aplikacija je stvorena. Pritom je S2I proces učinio sljedeće stvari:

  • Stvorena je platforma za izradu usluge za sve vrste stvari povezanih s izgradnjom aplikacije.
  • Stvorena je konfiguracija OpenShift Build.
  • Preuzeo sam sliku graditelja u interni docker registar OpenShift.
  • Kloniran "Hello World" u lokalno spremište.
  • Vidio sam da se tamo nalazi maven pom i kompajlirao aplikaciju s mavenom.
  • Stvorena je nova slika spremnika koja sadrži kompajliranu Java aplikaciju i stavljena je ova slika u interni registar spremnika.
  • Stvorena je Kubernetes implementacija sa specifikacijama za pod, uslugu itd.
  • Pokrenuta slika spremnika za implementaciju.
  • Uklonjen servis build-pod.

Puno je toga na ovom popisu, ali glavna stvar je da se cijela izgradnja odvija isključivo unutar OpenShift-a, interni Docker registar je unutar OpenShift-a, a proces izgradnje kreira sve Kubernetes komponente i pokreće ih na klasteru.

Ako vizualno pratite pokretanje S2I na konzoli, možete vidjeti kako se pod za izgradnju pokreće tijekom izgradnje.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

A sada pogledajmo zapisnike modula za izgradnju: prvo, tamo možete vidjeti kako maven radi svoj posao i preuzima ovisnosti za izgradnju naše java aplikacije.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Nakon dovršetka izgradnje mavena, započinje izgradnja slike spremnika, a zatim se ova izgrađena slika šalje u interno spremište.

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Sve, proces montaže je završen. Sada provjerimo jesu li podovi i usluge naše aplikacije pokrenuti u klasteru.

oc get service

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

To je sve. A postoji samo jedan tim. Sve što trebamo učiniti je izložiti ovu uslugu vanjskom pristupu.

Korak 3 - izložite uslugu pristupu izvana

Kao i u slučaju KUK-a, na platformi OpenShift, naš “Hello World” također treba usmjerivač za usmjeravanje vanjskog prometa na uslugu unutar klastera. U OpenShiftu je to vrlo jednostavno. Prvo, komponenta usmjeravanja HAProxy instalirana je u klaster prema zadanim postavkama (može se promijeniti u isti NGINX). Drugo, postoje posebni i visoko konfigurabilni resursi koji se nazivaju Routes, koji podsjećaju na Ingress objekte u dobrom starom Kubernetesu (zapravo, OpenShiftov Routes uvelike je utjecao na dizajn Ingress objekata, koji se sada mogu koristiti u OpenShiftu) , ali za naš "Hello Svijet", au gotovo svim ostalim slučajevima dovoljan nam je standardni Route bez dodatne konfiguracije.

Za stvaranje FQDN-a koji se može usmjeravati za “Hello World” (da, OpenShiift ima vlastiti DNS za usmjeravanje prema imenima usluga), jednostavno izlažemo našu uslugu:

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

oc expose service quarkus-hello-world

Ako pogledate novostvorenu rutu, tamo možete pronaći FQDN i druge informacije o usmjeravanju:

oc get route

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

I na kraju, našoj usluzi pristupamo iz preglednika:

Žao mi je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo

Ali sada je bilo stvarno jednostavno!

Volimo Kubernetes i sve što vam ova tehnologija omogućuje, a volimo i jednostavnost i lakoću. Kubernetes je osmišljen kako bi distribuirane, skalabilne spremnike učinio nevjerojatno jednostavnima za rukovanje, ali njegova jednostavnost danas više nije dovoljna za pokretanje aplikacija. Ovo je mjesto gdje OpenShift stupa na scenu, držeći korak s vremenom i nudeći Kubernetes usmjeren na programere. Puno je truda uloženo da se OpenShift platforma prilagodi specifično za razvojnog programera, uključujući stvaranje alata kao što su S2I, ODI, Developer Portal, OpenShift Operator Framework, IDE integracija, Developer Catalozi, Helm integracija, nadzor i mnogi drugi.

Nadamo se da vam je ovaj članak bio zanimljiv i koristan. A na portalu možete pronaći dodatne resurse, materijale i ostalo korisno za razvoj na OpenShift platformi Red Hat programeri.

Izvor: www.habr.com

Dodajte komentar