Detta inlÀgg Àr skrivet eftersom vÄra medarbetare har haft mÄnga samtal med kunder om applikationsutveckling pÄ Kubernetes och om specifika aspekter av sÄdan utveckling pÄ OpenShift.

Vi börjar vanligtvis med tesen att Kubernetes Àr bara Kubernetes, medan OpenShift Àr en Kubernetes-plattform, likt Microsoft AKS eller Amazon EKS. Varje plattform har sina egna fördelar som Àr riktade mot olika mÄlgrupper. Efter det övergÄr samtalet ofta till att jÀmföra styrkor och svagheter hos specifika plattformar.
Vi tĂ€nkte faktiskt skriva detta inlĂ€gg med slutsatsen "Lyssna, det spelar ingen roll var du kör din kod, pĂ„ OpenShift eller AKS, EKS, pĂ„ nĂ„gon anpassad Kubernetes, ja vilket som helst-Kubernetes (för kort kallar vi det KUK) â det Ă€r verkligen bara enkelt, bĂ„de hĂ€r och dĂ€r."
Sedan planerade vi att ta ett enkelt "Hello World" och visa, med hjÀlp av det exemplet, vad som Àr gemensamt och vad som skiljer KUK frÄn Red Hat OpenShift Container Platform (nedan kallad OCP eller bara OpenShift).
Men medan vi skrev detta inlÀgg insÄg vi att vi har blivit sÄ vana vid att anvÀnda OpenShift att vi inte ens inser hur mycket det har vuxit och förvandlats till en fantastisk plattform som Àr mycket mer Àn bara en Kubernetes-distribution. Vi har kommit att ta OpenShifts mognad och enkelhet för givet, och missat dess storhet.
I allmÀnhet Àr det dags för aktiv Änger, och nu kommer vi steg för steg att jÀmföra implementeringen av vÄrt "Hello World" pÄ KUK och OpenShift, och göra det sÄ objektivt som möjligt (Àven om vi ibland uttrycker vÄr personliga Äsikt om Àmnet). Om du Àr intresserad av en rent subjektiv Äsikt om detta Àmne, kan du lÀsa den . I detta inlÀgg kommer vi att hÄlla oss till fakta och endast fakta.
Kluster
SÄ, för vÄrt "Hello World" behöver vi kluster. LÄt oss genast sÀga "nej" till alla offentliga moln för att slippa betala för servrar, register, nÀtverk, dataöverföring osv. DÀrför vÀljer vi ett enkelt enkelnods-kluster pÄ (för KUK) och (för OpenShift-klustret). BÄda dessa alternativ Àr verkligen enkla att installera, men de kommer att krÀva ganska mycket resurser pÄ din laptop.

Byggning pÄ KUK
SÄ, lÄt oss köra igÄng.
Steg 1 â vi bygger vĂ„r containerbild
Jag börjar med att deploya vÄrt "Hello World" pÄ minikube. För detta behöver vi:
- 1. Installerad Docker.
- 2. Installerad Git.
- 3. Installerad Maven (faktiskt anvÀnds mvnw-binÀrfilen i detta projekt, sÄ det gÄr bra utan det).
- 4. SjÀlva kÀllan, det vill sÀga klonen av förrÄdet
Först mĂ„ste vi skapa ett Quarkus-projekt. Oroa dig inte om du aldrig har arbetat med sidan Quarkus.io â det Ă€r enkelt. VĂ€lj bara de komponenter du vill anvĂ€nda i projektet (RestEasy, Hibernate, Amazon SQS, Camel etc.), och Quarkus konfigurerar automatiskt Maven-archetypen och lĂ€gger allt pĂ„ GitHub. Det vill sĂ€ga, bokstavligen ett musklick â och klart. Det Ă€r dĂ€rför vi Ă€lskar Quarkus.

Det enklaste sÀttet att bygga vÄr "Hello World" i en containerbild Àr att anvÀnda quarkus-maven-tillÀgget för Docker, som utför allt nödvÀndigt arbete. Med Quarkus har det blivit riktigt enkelt: lÀgg till tillÀgget container-image-docker och du kan skapa bilder med Maven-kommandon.
./mvnw quarkus:add-extension -Dextensions="container-image-docker"
Och slutligen, kör vi bygget av vÄr bild med hjÀlp av Maven. Resultatet blir att vÄr kÀllkod omvandlas till en fÀrdig containerbild, som vi redan kan köra i en container exekveringsmiljö.

./mvnw -X clean package -Dquarkus.container-image.build=true
Och sÄ Àr det klart, nu kan vi köra containern med kommandot docker run, och mappa vÄr tjÀnst till port 8080 sÄ att vi kan nÄ den.
docker run -i --rm -p 8080:8080 gcolman/quarkus-hello-world

NÀr containerinstansen har startat, behöver vi bara kontrollera med kommandot curl att vÄr tjÀnst fungerar:
![]()
SĂ„, allt fungerar, och det var faktiskt riktigt enkelt.
Steg 2 â skicka vĂ„r container till en containerbildrepo
Hit tills lagras den bild vi skapade lokalt i vÄrt lokala containerlager. Om vi vill anvÀnda denna bild i vÄr K8s-miljö, behöver vi lÀgga den i ett annat förrÄd. Kubernetes har inte sÄdana funktioner, sÄ vi kommer att anvÀnda dockerhub. För det första Àr det gratis, och för det andra gör (nÀstan) alla sÄ.
Det Àr ocksÄ mycket enkelt, och det krÀvs bara ett konto pÄ dockerhub.
SÄ, vi skapar ett konto pÄ dockerhub och skickar dit vÄr bild.

Steg 3 â starta Kubernetes
Det finns mÄnga sÀtt att sÀtta ihop en Kubernetes-konfiguration för att köra vÄr "Hello World", men vi kommer att anvÀnda det enklaste sÀttet, sÄ vi Àr.
Först kör vi minikube-klustret:
minikube start
Steg 4 â vi distribuerar vĂ„r containeravbildning
Nu mÄste vi omvandla vÄr kod och containeravbildning till Kubernetes-konfigurationer. Med andra ord, vi behöver en pod- och deploymentsdefinition som pekar pÄ vÄr containeravbildning pÄ Docker Hub. Ett av de enklaste sÀtten att göra detta Àr att köra kommandot create deployment och ange vÄr avbildning:

kubectl create deployment hello-quarkus --image=gcolman/quarkus-hello-world:1.0.0-SNAPSHOT
Genom detta kommando bad vi vÄr KUB att skapa en deploymentskonfiguration, som ska innehÄlla specifikationen för en pod för vÄr containeravbildning. Detta kommando kommer ocksÄ att tillÀmpa denna konfiguration pÄ vÄr minikube-kluster och skapa en deployment som laddar ner vÄr containeravbildning och startar en pod i klustret.
Steg 5 â vi öppnar tillgĂ„ng till vĂ„r tjĂ€nst
Nu nÀr vi har distribuerat vÄr containeravbildning Àr det dags att tÀnka pÄ hur vi konfigurerar extern Ätkomst till denna Restful-tjÀnst, som faktiskt programmerades i vÄr kod.
Det finns mÄnga sÀtt att göra detta. Till exempel kan vi anvÀnda kommandot expose för att automatiskt skapa motsvarande Kubernetes-komponenter, sÄsom services och endpoints. Det Àr precis vad vi kommer att göra genom att köra expose-kommandot för vÄr deploymentsobjekt:
kubectl expose deployment hello-quarkus --type=NodePort --port=8080
LÄt oss stanna upp en minut vid alternativet "--type" i expose-kommandot.
NÀr vi gör expose och skapar komponenterna som behövs för att köra vÄr tjÀnst, behöver vi bland annat att kunna ansluta till tjÀnsten hello-quarkus, som sitter inuti vÄrt programvarudefinierade nÀtverk. Och parametern typ lÄter oss skapa och koppla sÄdana saker som belastningsbalanserare för att dirigera trafik till detta nÀtverk.
Till exempel, genom att skriva --type=LoadBalancer, initierar vi automatiskt en belastningsbalanserare i den offentliga molnmiljön för att kunna ansluta till vÄrt Kubernetes-kluster. Detta Àr naturligtvis fantastiskt, men man mÄste förstÄ att en sÄdan konfiguration kommer att vara strikt kopplad till ett specifikt offentligt moln och det blir svÄrare att flytta mellan Kubernetes-instanser i olika miljöer.
I vÄrt exempel --type=NodePort, det vill sÀga att Ätkomsten till vÄr tjÀnst sker via nodens IP-adress och portnummer. Denna lösning krÀver inga offentliga moln, men innebÀr ett antal ytterligare steg. För det första behövs en egen lastbalanserare, sÄ vi kommer att sÀtta upp en lastbalanserare NGINX i vÄrt kluster.
Steg 6 â installera lastbalanseraren
Minikube har ett antal plattformsfunktioner som underlÀttar skapandet av nödvÀndiga komponenter för extern Ätkomst, sÄsom ingress-kontroller. Minikube levereras med ingress-kontrollern Nginx, och vi behöver bara aktivera och konfigurera den.
minikube addons enable ingress
Nu skapar vi med ett enda kommando ingress-kontrollern Nginx, som kommer att arbeta inuti vÄrt minikube-kluster:
ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m
Steg 7 â Konfigurera ingress
Nu mÄste vi konfigurera ingress-kontrollern Nginx för att den ska kunna ta emot förfrÄgningar frÄn hello-quarkus.


Och till sist, vi behöver tillÀmpa denna konfiguration.

kubectl apply -f ingress.yml
![]()
Eftersom vi gör allt detta pÄ vÄr dator, lÀgger vi bara till IP-adressen till vÄr nod i filen /etc/hosts för att dirigera http-förfrÄgningar till vÄr minikube via lastbalanseraren NGINX.
192.168.99.100 hello-quarkus.info
Det Àr klart, nu Àr vÄr minikube-tjÀnst tillgÀnglig utanför via ingress-kontrollern Nginx.

Tja, var det inte enkelt? Eller kanske inte sÄ mycket?

Körning pÄ OpenShift (Code Ready Containers)
Och nu ska vi se hur allt görs pÄ Red Hat OpenShift Container Platform (OCP).
Som i minikube-fallet vÀljer vi en en-nods OpenShift-klusterlösning i form av Code Ready Containers (CRC). Tidigare kallades detta minishift och baserades pÄ OpenShift Origin-projektet, men nu Àr det CRC och bygger pÄ Red Hats OpenShift Container Platform.
HÀr kan vi inte lÄta bli att sÀga: "OpenShift Àr fantastiskt!"
Vi tÀnkte frÄn början skriva att utvecklingen pÄ OpenShift inte skiljer sig frÄn utvecklingen pÄ Kubernetes. Och i grunden Àr det sant. Men under skrivandet av detta inlÀgg kom vi ihÄg hur mÄnga extra steg man mÄste ta utan OpenShift, och dÀrför Àr det, som sagt, fantastiskt. Vi Àlskar nÀr allt görs enkelt, och hur mycket enklare vÄrt exempel distribueras och körs pÄ OpenShift jÀmfört med minikube var helt enkelt vad som motiverade oss att skriva detta inlÀgg.
LÄt oss gÄ igenom processen och se vad vi behöver göra.
SÄ i exemplet med minikube började vi med Docker... VÀnta, vi behöver inte lÀngre ha Docker installerat pÄ maskinen.
Och lokal git behövs inte.
Och Maven behövs inte.
Och det behövs inte att manuellt skapa en containerbild.
Och det behövs inte att leta efter nÄgot containerbildsrepo.
Och det behövs inte att installera en ingress-controller.
Och det behövs inte att konfigurera ingress heller.
FörstÄr du? För att driftsÀtta och köra vÄr applikation pÄ OpenShift behöver vi inte nÄgot av det ovanstÄende. Och sjÀlva processen ser ut pÄ följande sÀtt.
Steg 1 â Starta din OpenShift-kluster.
Vi anvÀnder Code Ready Containers frÄn Red Hat, som i princip Àr samma som Minikube, men med en fullt fungerande en-nod-klyngstruktur för Openshift.
crc start
Steg 2 â Bygg och driftsĂ€tt applikationen i OpenShift-klustret.
Just hÀr visa OpenShifts enkelhet och anvÀndarvÀnlighet sig i sin fulla prakt. Som i alla Kubernetes-distributioner har vi mÄnga sÀtt att starta en applikation i klustret. Och precis som i fallet med K8s vÀljer vi medvetet det allra enklaste alternativet.
OpenShift har alltid byggts som en plattform för att skapa och köra containerapplikationer. Byggandet av containrar har alltid varit en integrerad del av denna plattform, sÄ hÀr finns det massor av ytterligare Kubernetes-resurser för relevanta uppgifter.
Vi kommer att anvÀnda OpenShifts Source 2 Image (S2I)-process, som har flera olika sÀtt att ta vÄr kÀlla (kod eller binÀrfiler) och omvandla den till en containerbild som körs i OpenShift-klustret.
För detta behöver vi tvÄ saker:
- VÄr kÀllkod i en git-repo
- Builder-bild som byggprocessen kommer att baseras pÄ.
Det finns mÄnga sÄdana bilder, bÄde stödjade av Red Hat och pÄ samhÀllsnivÄ, och vi kommer att anvÀnda bilden OpenJDK, eftersom jag bygger en Java-applikation.
S2I-byggandet kan startas bÄde frÄn OpenShift Developer-grafikkonsolen och frÄn kommandoraden. Vi kommer att anvÀnda kommandot new-app, dÀr vi anger var vi ska hÀmta builder-bilden och vÄr kÀllkod.

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git
Det Àr klart, vÄr applikation Àr skapad. Dessutom genomförde S2I-processen följande saker:
- Skapade en service-build-pod för olika bygg-relaterade saker.
- Skapade en OpenShift Build-konfiguration.
- Laddade ner builder-bilden till OpenShifts interna docker-register.
- Klonade 'Hello World' till det lokala registret.
- Jag sÄg att det fanns en maven pom, sÄ jag kompilerade applikationen med hjÀlp av maven.
- Jag skapade en ny containerbild som innehÄller den kompilera Java-applikationen och lade denna bild i det interna containerregistret.
- Jag skapade en Kubernetes-deployment med specifikationer för pod, tjÀnst, etc.
- Jag startade deployment av containerbilden.
- Jag tog bort den temporÀra build-poden.
Det finns mycket hÀr, men det viktigaste Àr att hela byggprocessen sker helt inom OpenShift, det interna Docker-registret ligger inom OpenShift, och byggprocessen skapar alla Kubernetes-komponenter och startar dem i klustret.
Om man visuellt övervakar starten av S2I i konsolen kan man se hur build-poden startar nÀr byggprocessen körs.

Och nu lÄt oss titta pÄ loggarna för builder-poden: först och frÀmst kan man se hur maven gör sitt arbete och laddar ner beroenden för att bygga vÄr java-applikation.

Efter att maven-bygget har avslutats startas byggandet av containerbilden och den fÀrdiga bilden skickas till det interna arkivet.

Processen för byggandet Àr klar. Nu ska vi se till att poddar och tjÀnster för vÄr applikation har startat i klustret.
oc get service
![]()
Och det Àr allt. Och bara en kommandorad. Nu har vi bara att exponera denna tjÀnst för Ätkomst utifrÄn.
Steg 3 â exponerar tjĂ€nsten för Ă„tkomst utifrĂ„n
Precis som med KUK, behöver vÄr "Hello World"-applikation ocksÄ en router pÄ OpenShift för att styra extern trafik till tjÀnsten inom klustret. OpenShift gör detta mycket enkelt. För det första, i klustret finns en HAProxy-routingkomponent installerad som standard (den kan bytas ut mot NGINX). För det andra finns det speciella resurser som tillÄter omfattande konfiguration, som kallas Routes och liknar Ingress-objekt i den gamla goda Kubernetes (faktiskt har OpenShifts Routes starkt pÄverkat designen av Ingress-objekt som nu ocksÄ kan anvÀndas i OpenShift), men för vÄr "Hello World" och de flesta andra fallen rÀcker det med standard Route utan ytterligare konfiguration.
För att skapa en routad FQDN för "Hello World" (ja, OpenShift har sin egen DNS för routing via servicenamn) kör vi helt enkelt expose för vÄr tjÀnst:

oc expose service quarkus-hello-world
Om vi kollar den just skapade Route kan vi hitta FQDN och annan information om routing:
oc get route
![]()
Och till sist, vi gÄr till vÄr tjÀnst via webblÀsaren:

Och nu var det verkligen enkelt!
Vi Àlskar Kubernetes och allt som denna teknik möjliggör, liksom vi Àlskar enkelhet och smidighet. Kubernetes skapades för att drastiskt förenkla driften av distribuerade skalbara behÄllare, men för att införa applikationer Àr denna enkelhet idag inte tillrÀcklig. HÀr kommer OpenShift in i bilden, som hÄller jÀmna steg med tiden och erbjuder Kubernetes som frÀmst riktar sig till utvecklare. Mycket arbete har lagts ner för att skrÀddarsy OpenShift-plattformen specifikt för utvecklare, inklusive skapandet av verktyg som S2I, ODI, Developer Portal, OpenShift Operator Framework, integration med IDE, Developer Catalogues, integration med Helm, övervakning och mÄnga andra.
Vi hoppas att denna artikel har varit intressant och anvÀndbar för dig. Du kan hitta ytterligare resurser, material och andra anvÀndbara saker för utveckling pÄ OpenShift-plattformen pÄ portalen .
KĂ€lla: habr.com
