Idag kommer vi att prata om grunderna och modellerna för GitOps, samt hur dessa modeller implementeras pÄ plattformen OpenShift. En interaktiv guide om detta Àmne Àr tillgÀnglig. .

Kort sagt, GitOps Àr en uppsÀttning praktiska metoder för att anvÀnda Git pull-requests för att hantera konfigurationer av infrastruktur och applikationer. Git-förvaret inom GitOps betraktas som den enda kÀllan till information om systemets tillstÄnd, och alla förÀndringar av detta tillstÄnd spÄras fullstÀndigt och kan auditeras.
Idén om att spÄra Àndringar i GitOps Àr inte ny, denna metod har lÀnge och nÀstan överallt tillÀmpats vid arbete med kÀllkod för applikationer. GitOps implementerar helt enkelt liknande funktioner (granskningar, pull-requests, taggar etc.) vid hantering av konfigurationer för infrastruktur och applikationer och ger liknande fördelar som vid hantering av kÀllkod.
Det finns ingen akademisk definition eller en uppsÀttning godkÀnda regler för GitOps, endast en uppsÀttning principer som denna praxis bygger pÄ:
- Systemets deklarativa beskrivning lagras i Git-förvaret (konfigurationer, övervakning etc.).
- Ăndringar i tillstĂ„ndet genomförs via pull-requests.
- TillstÄndet av de fungerande systemen anpassas efter uppgifterna i förvaret med hjÀlp av Git push-requests.
Principer för GitOps
- Definitioner av system beskrivs som kÀllkod.
Systemkonfiguration betraktas som kod, vilket gör att den kan lagras och automatiskt versioneras i Git-förvaret, som fungerar som den enda sanna kÀllan. Denna metod möjliggör enkel utrullning (rollout) och ÄterstÀllning (rollback) av förÀndringar i systemen.
- Det önskade tillstÄndet och konfigurationerna för systemen definieras och versioneras i Git.
Genom att lagra och versionera det önskade tillstÄndet för systemen i Git, fÄr vi möjlighet att enkelt rulla ut och ÄterstÀlla förÀndringar i systemen och applikationerna. Vi kan ocksÄ anvÀnda Gits sÀkerhetsmekanismer för att kontrollera Àgarskap av koden och bekrÀfta dess Àkthet.
- Ăndringar i konfigurationerna kan automatiskt tillĂ€mpas via pull-requests.
Genom att anvÀnda Git-pullförfrÄgningar kan vi enkelt hantera hur Àndringar tillÀmpas pÄ konfigurationer i repon. Till exempel kan de överlÀmnas för granskning till andra teammedlemmar eller köras genom CI-tester.
Och det behövs inte ge administrativa rÀttigheter hit och dit. För att genomföra commit förÀndringar i konfigurationen rÀcker det med att anvÀndarna har de nödvÀndiga rÀttigheterna i Git-repon dÀr dessa konfigurationer lagras.
- Att ÄtgÀrda problemet med okontrollerad konfigurationsdrift
NÀr det önskade tillstÄndet av systemet lagras i ett Git-repo, ÄterstÄr det bara att hitta mjukvara som kontrollerar att det aktuella tillstÄndet av systemet överensstÀmmer med dess önskade tillstÄnd. Om det inte gör det, ska denna mjukvara - beroende pÄ instÀllningarna - antingen sjÀlv ÄtgÀrda avvikelsen eller meddela oss om konfigurationsdriften.
GitOps-modeller för OpenShift
On-Cluster Resource Reconciller
Enligt denna modell finns det en kontrollör i klustret som ansvarar för att jÀmföra Kubernetes-resurser (YAML-filer) i Git-repo med de verkliga resurserna i klustret. Vid upptÀckta avvikelser skickar kontrollören meddelanden och kan eventuellt vidta ÄtgÀrder för att ÄtgÀrda avvikelserna. Denna GitOps-modell anvÀnds i Anthos Config Management och Weaveworks Flux.

External Resource Reconciler (Push)
Denna modell kan ses som en variant av den föregÄende, dÀr vi har en eller flera kontrollörer ansvariga för att synkronisera resurser i paren "Git-repo - Kubernetes-kluster". Skillnaden hÀr Àr att det i varje hanterat kluster inte nödvÀndigtvis mÄste finnas en egen kontrollör. Paren "Git - k8s-kluster" definieras ofta som CRD-beskrivningar (custom resources definition), dÀr man kan beskriva hur kontrollören ska utföra synkronisering. Inom ramen för denna modell jÀmför kontrollörerna Git-repo, angivet i CRD, med de resurser i Kubernetes-klustret som ocksÄ anges i CRD, och utför lÀmpliga ÄtgÀrder baserat pÄ jÀmförelsens resultat. SÀrskilt anvÀnds en sÄdan GitOps-modell i ArgoCD.

GitOps pÄ OpenShift-plattformen
Administration av multiklustern Kubernetes-infrastruktur
Med spridningen av Kubernetes och den vÀxande populariteten för multi-molnstrategier och edge computing ökar ocksÄ det genomsnittliga antalet OpenShift-kluster per kund.
Till exempel, vid anvÀndning av edge computing kan en kunds kluster distribueras i hundratal eller till och med tusental. Som ett resultat tvingas kunden att hantera flera oberoende eller samordnade OpenShift-kluster i bÄde offentliga moln och lokalt.
I detta sammanhang mÄste mÄnga problem lösas, bland annat:
- Ăvervaka att klustren Ă€r i identiskt tillstĂ„nd (konfigurationer, övervakning, lagring etc.).
- à terskapa (eller ÄterstÀlla) kluster till ett kÀnt tillstÄnd.
- Skapa nya kluster utifrÄn ett kÀnt tillstÄnd.
- Applicera förÀndringar pÄ flera OpenShift-kluster.
- à terstÀlla förÀndringar pÄ flera OpenShift-kluster.
- Koppla samman malldefinierade konfigurationer med olika miljöer.
Applikationskonfigurationer
Under sin livscykel gÄr applikationer ofta igenom en kedja av kluster (dev, staging osv.) innan de nÄr produktionsklustret. Dessutom, pÄ grund av tillgÀnglighets- och skalbarhetskrav, distribuerar kunder ofta applikationer direkt till flera kluster on-premise eller i flera regioner av en offentlig molnplattform.
DÀrför mÄste följande uppgifter lösas:
- SÀkerstÀlla att applikationer (binarier, konfigurationer etc.) rör sig mellan kluster (dev, staging osv.).
- Applicera förÀndringar i applikationer (binarier, konfigurationer osv.) i flera OpenShift-kluster.
- à terstÀlla förÀndringar i applikationer till det tidigare kÀnda tillstÄndet.
AnvÀndningsscenarier för OpenShift GitOps
1. TillÀmpning av förÀndringar frÄn Git-repository
Klusteradministratören kan lagra OpenShift-klusterkonfigurationer i ett Git-repository och automatiskt tillÀmpa dem för att utan problem skapa nya kluster och Äterskapa dem till ett tillstÄnd som Àr identiskt med det kÀnda tillstÄndet som lagras i Git-repository.
2. Synkronisering med Secret Manager
Administratören kan ocksÄ ha nytta av möjligheten att synkronisera secret-objekt i OpenShift med motsvarande programvara som Vault, för att hantera dem med speciellt utformade verktyg.
3. Kontroll av konfigurationsdrift
Administratören skulle bara vara positiv till att OpenShift GitOps sjÀlv identifierar och varnar om avvikelser mellan de aktuella konfigurationerna och de som anges i repositoryt, sÄ att det snabbt kan reageras pÄ drift.
4. Meddelanden om konfigurationsdrift
De Àr anvÀndbara nÀr administratören vill fÄ snabb information om driftfall av konfigurationer för att kunna vidta lÀmpliga ÄtgÀrder omedelbart.
5. Manuell synkronisering av konfigurationer vid drift
Möjliggör för administratören att synkronisera OpenShift-klustret med Git-repositoriet vid drift av konfigurationer för att snabbt ÄterstÀlla klustret till ett tidigare kÀnt tillstÄnd.
6. Autosynkronisering av konfigurationer vid drift
Administratören kan ocksÄ stÀlla in OpenShift-klustret för automatisk synkronisering med repositoriet vid upptÀckte driftfall, sÄ att klusterkonfigurationen alltid motsvarar konfigurationerna i Git.
7. Flera kluster â ett repository
Administratören kan lagra konfigurationer för flera olika OpenShift-kluster i ett och samma Git-repository och selektivt tillÀmpa dem vid behov.
8. Hierarki av klusterkonfigurationer (Ă€rvande)
Administratören kan definiera en hierarki av klusterkonfigurationer i repositoriet (staging, produktion, appportfölj osv. med Ă€rvande). Med andra ord kan han eller hon bestĂ€mma hur konfigurationer ska tillĂ€mpas â pĂ„ ett eller flera kluster.
Till exempel, om administratören definierar en hierarki i Git-repositoriet som 'Produktionskluster (prod) â System X-kluster â Produktionskluster för system X', kommer följande konfigurationer att tillĂ€mpas pĂ„ produktionskluster för system X:
- Konfigurationer gemensamma för alla produktionskluster.
- Konfigurationer för system X-klustret.
- Konfigurationer för produktionsklustret för system X.
9. Mallar och överskrivning av konfigurationer
Administratören kan överskrida uppsÀttningen av Àrvda konfigurationer och deras vÀrden för att mer noggrant anpassa konfigurationen för specifika kluster som de ska tillÀmpas pÄ.
10. Selektiva inkluderingar och exkluderingar av konfigurationer, applikationskonfigurationer
Administratören kan stÀlla in villkor för tillÀmpning eller uteblivande av vissa konfigurationer pÄ kluster med specifika egenskaper.
11. Stöd för mallar
Utvecklare kommer att ha nytta av möjligheten att vÀlja hur applikationsresurser ska definieras (Helm Chart, ren Kubernetes YAML osv.) för att anvÀnda det mest lÀmpliga formatet för varje specifik applikation.
GitOps-verktyg pÄ OpenShift-plattformen
ArgoCD
ArgoCD implementerar modellen External Resource Reconcile och erbjuder ett centraliserat grÀnssnitt för orkestrering av relationer mellan kluster och Git-repositorier enligt en "en till mÄnga"-modell. En nackdel med detta program Àr oförmÄgan att hantera applikationer nÀr ArgoCD inte fungerar.
Flux
Flux implementerar modellen On-Cluster Resource Reconcile, och som en följd av detta finns det ingen centraliserad hantering av definitionsrepositoriet, vilket Àr en svag punkt. à andra sidan, just pÄ grund av avsaknaden av centralisering, kan möjligheten att hantera applikationer bibehÄllas Àven nÀr ett kluster gÄr ner.
Installation av ArgoCD pÄ OpenShift
ArgoCD erbjuder ett utmÀrkt kommandoradsgrÀnssnitt och webbkonsol, dÀrför kommer vi inte att diskutera Flux och andra alternativ hÀr.
För att distribuera ArgoCD pÄ OpenShift 4, följ dessa steg som klusteradministratör:
Distribution av ArgoCD-komponenter pÄ OpenShift-plattformen
# Create a new namespace for ArgoCD components
oc create namespace argocd
# Apply the ArgoCD Install Manifest
oc -n argocd apply -f https://raw.githubusercontent.com/argoproj/argo-cd/v1.2.2/manifests/install.yaml
# Get the ArgoCD Server password
ARGOCD_SERVER_PASSWORD=$(oc -n argocd get pod -l "app.kubernetes.io/name=argocd-server" -o jsonpath='{.items[*].metadata.name}')Justera ArgoCD Server sÄ att den syns av OpenShift Route
# Patch ArgoCD Server so no TLS is configured on the server (--insecure)
PATCH='{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"argocd-server"}],"containers":[{"command":["argocd-server","--insecure","--staticassets","/shared/app"],"name":"argocd-server"}]}}}}'
oc -n argocd patch deployment argocd-server -p $PATCH
# Expose the ArgoCD Server using an Edge OpenShift Route so TLS is used for incoming connections
oc -n argocd create route edge argocd-server --service=argocd-server --port=http --insecure-policy=RedirectDistribution av ArgoCD Cli Tool
# Download the argocd binary, place it under /usr/local/bin and give it execution permissions
curl -L https://github.com/argoproj/argo-cd/releases/download/v1.2.2/argocd-linux-amd64 -o /usr/local/bin/argocd
chmod +x /usr/local/bin/argocdĂndra administratörslösenordet för ArgoCD Server
# Get ArgoCD Server Route Hostname
ARGOCD_ROUTE=$(oc -n argocd get route argocd-server -o jsonpath='{.spec.host}')
# Login with the current admin password
argocd --insecure --grpc-web login ${ARGOCD_ROUTE}:443 --username admin --password ${ARGOCD_SERVER_PASSWORD}
# Update admin's password
argocd --insecure --grpc-web --server ${ARGOCD_ROUTE}:443 account update-password --current-password ${ARGOCD_SERVER_PASSWORD} --new-password Efter att ha genomfört dessa steg kan ArgoCD Server anvÀndas via ArgoCD WebUI eller kommandoradsverktyget ArgoCD Cli.
GitOps â det Ă€r aldrig för sent
"TĂ„get har gĂ„tt" â sĂ„ sĂ€ger man om en situation nĂ€r möjligheten att göra nĂ„got har gĂ„tt förlorad. NĂ€r det gĂ€ller OpenShift skapar ofta viljan att omedelbart börja anvĂ€nda denna nya, coola plattform just en sĂ„dan situation med hantering och underhĂ„ll av rutter, deployment och andra OpenShift-objekt. Men Ă€r chansen alltid helt förlorad?
Vi fortsÀtter med vÄr serie artiklar om , idag visar vi hur man omvandlar en manuellt skapad applikation och dess resurser till en process dÀr allt hanteras av GitOps-verktyget. För detta kommer vi först att manuellt distribuera applikationen httpd. PÄ bilden nedan visas hur vi skapar ett namnrum, en deployment och en tjÀnst, och sedan exponerar vi denna tjÀnst för att skapa en rutt.
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/namespace.yaml
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/deployment.yaml
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/service.yaml
oc expose svc/httpd -n simple-appSÄ, vi har en manuellt skapad applikation. Nu mÄste den övergÄ till att hanteras av GitOps utan att tappa tillgÀngligheten. Kort sagt, sÄ hÀr gör man:
- Skapa ett Git-repositorium för koden.
- Exportera vÄra nuvarande objekt och ladda upp dem till Git-repositoriet.
- VĂ€lj och distribuera GitOps-verktygen.
- LÀgg till vÄrt repo i dessa verktyg.
- Definiera applikationen i vÄra GitOps-verktyg.
- Genomför en testkörning av applikationen med hjÀlp av GitOps-verktygen.
- Synkronisera objekten med hjÀlp av GitOps-verktygen.
- Aktivera rensning (pruning) och automatisk synkronisering av objekt.
Som nĂ€mnts tidigare , i GitOps finns det en och endast en kĂ€lla till information om alla objekt i Kubernetes-kluster(n) â Git-repositoriet. Vidare utgĂ„r vi frĂ„n att din organisation redan anvĂ€nder ett Git-repo. Det kan vara offentligt eller privat, men det mĂ„ste nödvĂ€ndigtvis vara tillgĂ€ngligt för Kubernetes-kluster. Detta kan vara samma repository som för kodbaserna, eller ett separat repository skapat speciellt för distributioner. Det rekommenderas att ha strikta behörigheter i repositoriet eftersom det kommer att lagra sekretessobjekt, rutter och andra sĂ€kerhetskĂ€nsliga saker.
I vÄrt exempel kommer vi att skapa ett nytt offentligt repository pÄ GitHub. Du kan namnge det hur som helst; vi anvÀnder namnet blogpost.
Om YAML-filerna för objekten inte lagrades lokalt eller i Git, mÄste vi anvÀnda binÀrerna oc eller kubectl. PÄ skÀrmdumpen nedan begÀr vi YAML för vÄrt namnrymden, distributionen, tjÀnsten och rutten. Innan dess klonade vi det nyss skapade repositoriet och gick in i det med kommandot cd.
oc get namespace simple-app -o yaml --export > namespace.yaml
oc get deployment httpd -o yaml -n simple-app --export > deployment.yaml
oc get service httpd -o yaml -n simple-app --export > service.yaml
oc get route httpd -o yaml -n simple-app --export > route.yamlNu ska vi redigera filen deployment.yaml för att ta bort fÀltet som Argo CD inte kan synkronisera.
sed -i '/sgeneration: .*'/d' deployment.yamlDessutom mÄste vi Àndra rutten. Först sÀtter vi en fler-radig variabel och sedan ersÀtter vi ingress: null med innehÄllet i denna variabel.
export ROUTE=" ingress:
- conditions:
- status: 'True'
type: Admitted"
sed -i "s/ ingress: null/$ROUTE/g" route.yamlSÄ, nu har vi hanterat filerna, det ÄterstÄr att spara dem i Git-repositoriet. Efter det blir detta repository den enda kÀllan till information, och alla manuella Àndringar av objekten ska strikt förbjudas.
git commit -am 'initial commit of objects'
git push origin masterVi utgÄr frÄn att ArgoCD redan Àr installerat (för hur man gör det, se föregÄende) ). DÀrför lÀgger vi till det repository vi skapade i Argo CD, som innehÄller koden för vÄr applikation i vÄrt exempel. Se bara till att du anger just det repository som du skapade tidigare.
argocd repo add https://github.com/cooktheryan/blogpostNu skapar vi applikationen. Applikationen definierar vÀrden sÄ att GitOps-verktyget förstÄr vilket repository och sökvÀgar som ska anvÀndas, vilken OpenShift som behövs för att hantera objekten, samt vilken specifik gren av repositoryt som krÀvs, och om resursautokopiering ska utföras.
argocd app create --project default
--name simple-app --repo https://github.com/cooktheryan/blogpost.git
--path . --dest-server https://kubernetes.default.svc
--dest-namespace simple-app --revision master --sync-policy none NÀr applikationen har definierats i Argo CD börjar detta verktyg att kontrollera redan distribuerade objekt för att se om de överensstÀmmer med definitionerna i repositoryt. I vÄrt exempel Àr autokopiering och rensning inaktiverade, sÄ elementen förÀndras Ànnu inte. Observera att i Argo CD:s grÀnssnitt kommer vÄr applikation att ha statusen 'Out of Sync', eftersom det inte finns nÄgon label som sÀtts av ArgoCD.
Det Àr just dÀrför, nÀr vi senare kör synkronisering, sÄ kommer inga Äterdistribueringar av objekten att utföras.
Nu kör vi ett test för att sÀkerstÀlla att det inte finns nÄgra fel i vÄra filer.
argocd app sync simple-app --dry-runOm det inte finns nÄgra fel kan vi gÄ vidare till synkroniseringen.
argocd app sync simple-appEfter att ha kört kommandot argocd get för vÄr applikation, bör vi se att applikationens status Àndrats till Healthy eller Synced. Detta kommer att betyda att alla resurser i Git-repositoryt nu matchar de resurser som redan har distribuerats.
argocd app get simple-app
Name: simple-app
Project: default
Server: https://kubernetes.default.svc
Namespace: simple-app
URL: https://argocd-server-route-argocd.apps.example.com/applications/simple-app
Repo: https://github.com/cooktheryan/blogpost.git
Target: master
Path: .
Sync Policy:
Sync Status: Synced to master (60e1678)
Health Status: Healthy
... Nu kan vi aktivera autokopiering och rensning för att sÀkerstÀlla att inget skapas manuellt och att varje gÄng ett objekt skapas eller uppdateras i repositoryt kommer en distribution att utföras.
argocd app set simple-app --sync-policy automated --auto-prune SÄ, vi har framgÄngsrikt överfört en applikation under GitOps, som frÄn början inte anvÀnde GitOps pÄ nÄgot sÀtt.
KĂ€lla: habr.com
