Oghje parlemu di i principii è di i mudelli di GitOps, è ancu di cumu questi mudelli sò implementati nantu à a piattaforma OpenShift. Una guida interattiva nantu à questu tema hè dispunibule
In poche parole, GitOps hè un inseme di pratiche per aduprà e richieste di pull Git per gestisce l'infrastruttura è e cunfigurazioni di l'applicazione. U repository Git in GitOps hè trattatu cum'è una sola fonte d'infurmazioni nantu à u statu di u sistema, è qualsiasi cambiamenti à questu statu sò cumpletamente tracciabili è auditabili.
L'idea di u seguimentu di u cambiamentu in GitOps ùn hè micca novu; stu approcciu hè statu longu usatu quasi universale quandu travaglia cù u codice fonte di l'applicazione. GitOps simpricimenti implementa funzioni simili (revisioni, pull requests, tags, etc.) in a gestione di l'infrastruttura è a cunfigurazione di l'applicazioni è furnisce benefici simili cum'è in u casu di gestione di codice fonte.
Ùn ci hè micca una definizione accademica o un set di reguli appruvati per GitOps, solu un inseme di principii nantu à quale sta pratica hè custruita:
- A descrizzione dichjarazione di u sistema hè guardata in u repository Git (configs, monitoring, etc.).
- I cambiamenti di u statu sò fatti attraversu e richieste di pull.
- U statu di i sistemi in esecuzione hè purtatu in cunfurmità cù e dati in u repositoriu utilizendu e richieste push Git.
Principi di GitOps
- Definizioni di u sistema sò descritti cum'è codice fonte
A cunfigurazione di i sistemi hè trattata cum'è codice per pudè esse guardatu è versione automaticamente in un repository Git, chì serve com'è una sola fonte di verità. Stu approcciu facilita u rollout è rollback cambiamenti in i sistemi.
- U statu desideratu è a cunfigurazione di i sistemi sò stallati è versionati in Git
Almacenendu è versionendu u statu desideratu di i sistemi in Git, simu capaci di rializà facilmente è ritruvà i cambiamenti à i sistemi è l'applicazioni. Pudemu ancu aduprà i meccanismi di sicurezza di Git per cuntrullà a pruprietà di u codice è verificà a so autenticità.
- I cambiamenti di cunfigurazione ponu esse applicati automaticamente via richieste di pull
Utilizendu e richieste di pull Git, pudemu cuntrullà facilmente cumu i cambiamenti sò applicati à e cunfigurazioni in u repository. Per esempiu, ponu esse datu à l'altri membri di a squadra per rivisione o eseguite per e teste CI, etc.
È à u listessu tempu, ùn ci hè bisognu di distribuisce i puteri amministrativi à manca è à diritta. Per fà cambiamenti di cunfigurazione, l'utilizatori solu bisognu di permessi adatti in u repositoriu Git induve queste cunfigurazioni sò almacenate.
- Risolve u prublema di a deriva incontrollata di cunfigurazioni
Quandu u statu desideratu di u sistema hè guardatu in un repository Git, tuttu ciò chì avemu da fà hè di truvà un software chì assicurarà chì u statu attuale di u sistema currisponde à u so statu desideratu. Se questu ùn hè micca u casu, allora stu software duveria - sicondu i paràmetri - o eliminà a discrepanza per sè stessu, o avvisàci nantu à a deriva di cunfigurazione.
Modelli GitOps per OpenShift
Reconciliatore di risorse nantu à u cluster
Sicondu stu mudellu, u cluster hà un controller chì hè rispunsevuli di paragunà e risorse Kubernetes (fichi YAML) in u repository Git cù e risorse reali di u cluster. Se i discrepanzi sò rilevati, u controller manda notifiche è possibbilmente piglia l'azzione per correggere e discrepanze. Stu mudellu GitOps hè utilizatu in Anthos Config Management è Weaveworks Flux.
Reconciliatore di risorse esterne (Push)
Stu mudellu pò esse cunsideratu cum'è una variazione di u precedente, quandu avemu unu o più cuntrolli rispunsevuli di sincronizà e risorse in i coppie "Git repository - Kubernetes cluster". A diferenza quì hè chì ogni cluster gestionatu ùn hà micca necessariamente u so propiu controller separatu. Git - i coppie di cluster k8s sò spessu definiti cum'è CRD (definizioni di risorse persunalizate), chì ponu descriverà cumu u controller deve fà a sincronizazione. In questu mudellu, i cuntrolli paragunanu u repository Git specificatu in u CRD cù i risorse di u cluster Kubernetes, chì sò ancu specificati in u CRD, è eseguinu l'azzioni appropritate basatu nantu à i risultati di a comparazione. In particulare, stu mudellu GitOps hè utilizatu in ArgoCD.
GitOps nantu à a piattaforma OpenShift
Amministrazione di infrastruttura Kubernetes multi-cluster
Cù a diffusione di Kubernetes è a pupularità crescente di strategie multi-nuvola è edge computing, u numeru mediu di clusters OpenShift per cliente hè ancu crescente.
Per esempiu, quandu si usa l'edge computing, i clusters di un cliente ponu esse implementati in centinaie o ancu migliaia. In u risultatu, hè obligatu à gestisce parechji clusters OpenShift indipendenti o coordinati in u nuvulu publicu è in premisa.
In questu casu, assai prublemi anu da esse risolti, in particulare:
- Cuntrolla chì i clusters sò in un statu identicu (configs, monitoring, storage, etc.)
- Ricreate (o restaurà) clusters basatu annantu à un statu cunnisciutu.
- Crea novi clusters basatu annantu à un statu cunnisciutu.
- Impulsate i cambiamenti à parechji clusters OpenShift.
- Ripristina i cambiamenti in più clusters OpenShift.
- Ligà cunfigurazioni mudellu à diversi ambienti.
Cunfigurazioni di l'applicazione
Duranti u so ciclu di vita, l'applicazioni spessu passanu per una catena di clusters (dev, stage, etc.) prima di finisce in un cluster di produzzione. Inoltre, per via di a dispunibilità è di i requisiti di scalabilità, i clienti spessu implementanu applicazioni in più clusters on-premise o in parechje regioni di una piattaforma di nuvola publica.
In questu casu, i seguenti compiti anu da esse risolti:
- Assicurà u muvimentu di l'applicazioni (binarii, configs, etc.) trà clusters (dev, stage, etc.).
- Eseguite i cambiamenti à l'applicazioni (binarii, cunfigurazioni, etc.) in parechji clusters OpenShift.
- Ritorna i cambiamenti à l'applicazioni à un statu cunnisciutu precedente.
OpenShift GitOps Casi d'usu
1. Applicà cambiamenti da u repositoriu Git
Un amministratore di cluster pò almacenà e cunfigurazioni di cluster OpenShift in un repository Git è l'applicà automaticamente per creà senza sforzu novi clusters è i mette in un statu identicu à u statu cunnisciutu almacenatu in u repository Git.
2. Synchronization cù Secret Manager
L'amministratore hà ancu benefiziu da a capacità di sincronizà l'oggetti sicreti OpenShift cù u software appropritatu cum'è Vault in modu di gestisce li utilizendu strumenti apposta per questu.
3. Control di cunfigurazioni drift
L'amministratore serà solu in favore se OpenShift GitOps stessu identifica è avvistà di discrepanze trà e cunfigurazioni reali è quelli specificati in u repositoriu, per pudè risponde rapidamente à a deriva.
4. Notificazioni nantu à a deriva di cunfigurazione
Sò utili in u casu quandu l'amministratore vole amparà rapidamente nantu à i casi di deriva di cunfigurazione per piglià rapidamente e misure appropritate per sè stessu.
5. Sincronizazione manuale di e cunfigurazioni quandu drifting
Permette à l'amministratore di sincronizà u cluster OpenShift cù u repository Git in casu di deriva di cunfigurazione, per rinvià rapidamente u cluster à un statu cunnisciutu precedente.
6.Auto-sincronizazione di cunfigurazioni quandu drifting
L'amministratore pò ancu cunfigurà u cluster OpenShift per sincronizà automaticamente cù u repository quandu una deriva hè rilevata, in modu chì a cunfigurazione di cluster currisponde sempre à e cunfigurazioni in Git.
7. Diversi clusters - un repository
L'amministratore pò almacenà e cunfigurazioni di parechji clusters OpenShift diffirenti in un repository Git è applicà selettivamente cum'è necessariu.
8. Gerarchia di cunfigurazioni di cluster (eredità)
L'amministratore pò stabilisce una ghjerarchia di cunfigurazioni di cluster in u repository (stage, prod, app portfolio, etc. cù eredità). In altre parolle, pò determinà se e cunfigurazioni deve esse applicate à unu o più clusters.
Per esempiu, se un amministratore stabilisce a gerarchia "Clusters di produzzione (prod) → Clusters System X → Clusters di produzzione di u sistema X" in u repository Git, allora una cumminazione di e seguenti cunfigurazioni hè applicata à i clusters di produzzione di u sistema X:
- Configs cumuni à tutti i clusters di produzzione.
- Configs per u cluster System X.
- Configs per u cluster di produzzione di u sistema X.
9. Templates è cunfigurazione overrides
L'amministratore pò annullà un inseme di cunfigurazione ereditata è i so valori, per esempiu, per aghjurnà a cunfigurazione per clusters specifichi à quale seranu applicati.
10. Selettivu include è esclude per cunfigurazioni, cunfigurazioni di l'applicazione
L'amministratore pò stabilisce e cundizioni per l'applicazione o non applicazione di certe cunfigurazioni à clusters cù certe caratteristiche.
11. Supportu di mudelli
I sviluppatori prufittàranu di a capacità di sceglie cumu si definiscenu e risorse di l'applicazione (Helm Chart, pura Kubernetes yaml, etc.) per utilizà u formatu più apprupriatu per ogni applicazione specifica.
Strumenti GitOps nantu à a piattaforma OpenShift
ArgoCD
ArgoCD implementa u mudellu di Reconcile di Risorse Esterne è offre una UI centralizzata per orchestrazione di relazioni unu à parechje trà clusters è repositori Git. I svantaghji di stu prugramma includenu l'incapacità di gestisce l'applicazioni quandu ArgoCD ùn hè micca travagliatu.
purtata
Flux implementa un mudellu di Reconcile di Risorse On-Cluster è, in u risultatu, ùn ci hè una gestione centralizata di u repositoriu di definizione, chì hè un puntu debule. Per d 'altra banda, precisamente per via di a mancanza di centralizazione, a capacità di gestisce l'applicazioni ferma ancu se un cluster falla.
Installazione di ArgoCD nantu à OpenShift
ArgoCD offre un'eccellente interfaccia di linea di cumanda è cunsola web, cusì ùn copreremu micca Flux è altre alternative quì.
Per implementà ArgoCD nantu à a piattaforma OpenShift 4, seguite questi passi cum'è amministratore di cluster:
Implementazione di cumpunenti ArgoCD nantu à a piattaforma OpenShift
# 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}')
Migliuramentu di ArgoCD Server in modu chì pò esse vistu da 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=Redirect
Implementazione di 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
Cambia a password di l'amministratore di u 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
Dopu avè cumpletu sti passi, pudete travaglià cù ArgoCD Server attraversu a cunsola web ArgoCD WebUI o l'uttellu di linea di cumanda ArgoCD Cli.
GitOps - Ùn hè mai troppu tardi
"U trenu hè partutu" - questu hè ciò chì dicenu di una situazione quandu l'uppurtunità di fà qualcosa hè mancata. In u casu di OpenShift, u desideriu di principià immediatamente à utilizà sta nova piattaforma fresca spessu crea esattamente questa situazione cù a gestione è u mantenimentu di rotte, implementazioni è altri oggetti OpenShift. Ma a chance hè sempre completamente persa?
Cuntinuà a seria di articuli circa
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-app
Allora avemu una applicazione artighjanali. Avà deve esse trasferitu sottu a gestione GitOps senza perdita di dispunibilità. In breve, face questu:
- Crea un repository Git per u codice.
- Esportemu i nostri ogetti attuali è li carichemu in u repository Git.
- Selezzione è implementazione di strumenti GitOps.
- Aghjunghjemu u nostru repository à questu toolkit.
- Definimu l'applicazione in u nostru toolkit GitOps.
- Facemu un test run di l'applicazione utilizendu u toolkit GitOps.
- Sincronizemu l'ogetti cù u toolkit GitOps.
- Habilita a poda è l'auto-sincronizazione di l'uggetti.
Cum'è citatu in u precedente
In u nostru esempiu, creeremu un novu repositoriu publicu in GitHub. Pudete chjamà ciò chì vulete, usemu u nome blogpost.
Se i schedarii di l'ughjettu YAML ùn sò micca stati guardati in u locu o in Git, allora avete da aduprà i binari oc o kubectl. In a screenshot sottu dumandemu YAML per u nostru spaziu di nomi, implementazione, serviziu è percorsu. Prima di questu, avemu clonatu u repositoriu novu creatu è cd in questu.
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.yaml
Avà edità u schedariu deployment.yaml per sguassà u campu chì Argo CD ùn pò micca sincronizà.
sed -i '/sgeneration: .*/d' deployment.yaml
Inoltre, a strada deve esse cambiata. Prima setteremu una variabile multilinea è poi rimpiazzà l'ingress: null cù u cuntenutu di quella variabile.
export ROUTE=" ingress:
- conditions:
- status: 'True'
type: Admitted"
sed -i "s/ ingress: null/$ROUTE/g" route.yaml
Allora, avemu risoltu i schedari, tuttu ciò chì resta hè di salvà in u repository Git. Dopu chì questu repository diventa l'unica fonte d'infurmazioni, è qualsiasi mudificazione manuale di l'uggetti deve esse strettamente pruibita.
git commit -am ‘initial commit of objects’
git push origin master
In più partendu da u fattu chì avete digià implementatu ArgoCD (cumu fà questu - vede precedente
argocd repo add https://github.com/cooktheryan/blogpost
Avà criemu l'applicazione. L'applicazione stabilisce valori per chì u toolkit GitOps capisce quale repository è percorsi da aduprà, quale OpenShift hè necessariu per gestisce l'uggetti, quale ramu specificu di u repositoriu hè necessariu, è se e risorse anu da sincronizà automaticamente.
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
Una volta chì una applicazione hè specificata in u CD Argo, u toolkit cumencia à cuntrollà l'uggetti digià implementati contru à e definizioni in u repository. In u nostru esempiu, l'auto-sync è a pulizia sò disattivati, perchè l'elementi ùn cambianu ancu. Per piacè nutate chì in l'interfaccia Argo CD a nostra applicazione averà u statutu "Fuori di sincronia" perchè ùn ci hè micca una etichetta chì ArgoCD furnisce.
Hè per quessa chì quandu avemu principiatu a sincronizazione un pocu più tardi, l'uggetti ùn saranu micca redistribuiti.
Avà femu una prova corsa per assicurà chì ùn ci sò micca errori in i nostri schedari.
argocd app sync simple-app --dry-run
Se ùn ci sò micca errori, pudete andà à a sincronizazione.
argocd app sync simple-app
Dopu avè eseguitu l'argocd get command in a nostra applicazione, duvemu vede chì u statutu di l'applicazione hè cambiatu in Sano o Synced. Questu significarà chì tutte e risorse in u repositoriu Git currispondenu avà à quelli risorse chì sò digià stati implementati.
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: <none>
Sync Status: Synced to master (60e1678)
Health Status: Healthy
...
Avà pudete attivà a sincronia automatica è a pulizia per assicurà chì nunda ùn hè creatu manualmente è chì ogni volta chì un ughjettu hè creatu o aghjurnatu à u repository, una implementazione serà.
argocd app set simple-app --sync-policy automated --auto-prune
Dunque, avemu purtatu cun successu una applicazione sottu u cuntrollu di GitOps chì inizialmente ùn hà micca utilizatu GitOps in ogni modu.
Source: www.habr.com