FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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 hÀr (EN). 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Ä Minikube (för KUK) och Code Ready Containers (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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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. 1. Installerad Docker.
  2. 2. Installerad Git.
  3. 3. Installerad Maven (faktiskt anvÀnds mvnw-binÀrfilen i detta projekt, sÄ det gÄr bra utan det).
  4. 4. SjÀlva kÀllan, det vill sÀga klonen av förrÄdet github.com/gcolman/quarkus-hello-world.git

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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ö.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

./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

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

NÀr containerinstansen har startat, behöver vi bara kontrollera med kommandot curl att vÄr tjÀnst fungerar:

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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:

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

kubectl apply -f ingress.yml

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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.

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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:

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

Och till sist, vi gÄr till vÄr tjÀnst via webblÀsaren:

FörlÄt, OpenShift, vi vÀrderade dig inte tillrÀckligt och tog dig för given.

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 Red Hat Developers.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster