{"id":35941,"date":"2019-10-31T22:07:41","date_gmt":"2019-10-31T19:07:41","guid":{"rendered":"https:\/\/prohoster.info\/blog\/chto-zhe-takoe-gitops\/"},"modified":"2019-10-31T22:07:41","modified_gmt":"2019-10-31T19:07:41","slug":"chto-zhe-takoe-gitops","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"Che cos'\u00e8 GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Nota del traduttore.<\/b>: Dopo una recente pubblicazione <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">di materiale<\/a><\/noindex> sui metodi pull e push in GitOps, abbiamo notato un crescente interesse per questo modello in generale. Tuttavia, ci sono pochissime pubblicazioni in lingua russa su questo argomento (non ci sono affatto su Habr). Perci\u00f2, siamo felici di presentare la traduzione di un altro articolo \u2014 anche se quasi un anno fa! \u2014 dell'azienda Weaveworks, il cui fondatore ha coniato il termine \u00abGitOps\u00bb. Nel testo viene spiegata l'essenza dell'approccio e le sue principali differenze rispetto a quelli gi\u00e0 esistenti.<\/i><\/p>\n<p>\nUn anno fa abbiamo pubblicato <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">un'introduzione a GitOps<\/a><\/noindex>. Allora abbiamo raccontato come il team di Weaveworks ha lanciato un SaaS interamente basato su Kubernetes e ha sviluppato un insieme di best practices normative per l'implementazione, gestione e monitoraggio in un ambiente cloud native.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>L'articolo \u00e8 stato popolare. Altri hanno iniziato a parlare di GitOps e a pubblicare nuovi strumenti per <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hasura\/gitkube\">git push<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/dzone.com\/articles\/weaveworks-gitops-developer-toolkit-part-one-skaff\">sviluppo<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">segreti<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">funzioni<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">integrazione continua<\/a><\/noindex> ecc. Sul nostro sito \u00e8 apparso <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">un gran numero<\/a><\/noindex> di pubblicazioni e casi d'uso di GitOps. Ma alcune persone hanno ancora domande. Qual \u00e8 la differenza tra questo modello e il tradizionale <noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">infrastructure as code<\/a><\/noindex> e la consegna continua (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">continuous delivery<\/a><\/noindex>)? \u00c8 obbligatorio utilizzare Kubernetes?<\/p>\n<p>Presto ci siamo resi conto della necessit\u00e0 di una nuova descrizione che offrisse:<\/p>\n<ol>\n<li> Un gran numero di esempi e storie;<\/li>\n<li> Una definizione chiara di GitOps;<\/li>\n<li> Un confronto con la continuous delivery tradizionale.<\/li>\n<\/ol>\n<p>\nIn questo articolo abbiamo cercato di coprire tutti questi temi. Troverete un'introduzione aggiornata su GitOps e una prospettiva da parte degli sviluppatori e del CI\/CD. Ci concentriamo principalmente su Kubernetes, anche se il modello pu\u00f2 essere generalizzato.<\/p>\n<h2>Presentiamo: GitOps<\/h2>\n<p>\nImmagina Alice. Gestisce l'azienda Family Insurance, che offre polizze per assicurazioni sanitarie, auto, immobili e viaggi a persone troppo occupate per districarsi tra le complessit\u00e0 dei contratti da sole. La sua attivit\u00e0 \u00e8 iniziata come un progetto secondario, mentre Alice lavorava in banca come data scientist. Un giorno si \u00e8 resa conto di poter utilizzare algoritmi computazionali avanzati per un'analisi dei dati pi\u00f9 efficace e per la creazione di pacchetti assicurativi. Gli investitori hanno finanziato il progetto e ora la sua azienda genera oltre 20 milioni di dollari all'anno ed \u00e8 in rapida crescita. Attualmente, impiega 180 persone in vari ruoli. Tra di loro c'\u00e8 il team tecnologico che si occupa dello sviluppo, della manutenzione del sito, del database e dell'analisi dei clienti. Il team di 60 persone \u00e8 guidato da Bob, il direttore tecnico dell'azienda.<\/p>\n<p>Il team di Bob distribuisce sistemi di produzione nel cloud. Le loro applicazioni principali funzionano su GKE, sfruttando i vantaggi di Kubernetes in Google Cloud. Inoltre, utilizzano vari strumenti per l'elaborazione dei dati e l'analisi.<\/p>\n<p>Family Insurance non aveva programmato di utilizzare i contenitori, ma si \u00e8 presto lasciata contagiare dall'entusiasmo per Docker. Ben presto, gli specialisti dell'azienda hanno scoperto che GKE consente di distribuire cluster per testare nuove funzionalit\u00e0 in modo facile e senza sforzo. Sono stati aggiunti Jenkins per CI e Quay per organizzare il registro dei contenitori, e sono stati scritti script per Jenkins che inviavano nuovi contenitori e configurazioni a GKE.<\/p>\n<p>\u00c8 passato del tempo. Alice e Bob si sono pentiti delle prestazioni dell'approccio scelto e del suo impatto sul business. L'implementazione dei container non ha migliorato le prestazioni quanto si aspettava il team. A volte i deployment si bloccavano, e non era chiaro se ci\u00f2 fosse dovuto a modifiche nel codice. \u00c8 stato anche difficile monitorare i cambiamenti nelle configurazioni. Spesso era necessario creare un nuovo cluster e spostare le applicazioni poich\u00e9 era il modo pi\u00f9 semplice per risolvere il disastro che si era creato nel sistema. Alice temeva che la situazione sarebbe peggiorata con l'evoluzione dell'applicazione (inoltre, stava nascendo un nuovo progetto basato sull'apprendimento automatico). Bob ha automatizzato gran parte del lavoro e non capiva perch\u00e9 il pipeline fosse ancora instabile, scalasse male e richiedesse periodicamente un intervento manuale.<\/p>\n<p><b>Poi hanno scoperto GitOps. Questa soluzione si \u00e8 rivelata esattamente ci\u00f2 di cui avevano bisogno per procedere con fiducia.<\/b><\/p>\n<p>Alice e Bob sentono parlare dei flussi di lavoro basati su Git, DevOps e infrastructure as code da diversi anni. L'unicit\u00e0 di GitOps risiede nel fatto che introduce un insieme di best practice - categoriche e normative - per l'implementazione di queste idee nel contesto di Kubernetes. Questo argomento <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">\u00e8 stato sollevato pi\u00f9 volte<\/a><\/noindex>, incluso nel <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">blog di Weaveworks<\/a><\/noindex>.<\/p>\n<p>Family Insurance ha deciso di adottare GitOps. Ora l'azienda dispone di un modello operativo automatizzato, compatibile con Kubernetes, che combina <i>velocit\u00e0<\/i> e <i>stabilit\u00e0<\/i>, poich\u00e9 hanno:<\/p>\n<ul>\n<li> scoperto che la produttivit\u00e0 del team \u00e8 raddoppiata senza che nessuno impazzisca;<\/li>\n<li> smettere di gestire script. Invece, ora possono concentrarsi su nuove funzionalit\u00e0 e perfezionare le pratiche ingegneristiche - ad esempio, implementare rilasci canary e migliorare i test;<\/li>\n<li> migliorato il processo di distribuzione - ora si rompe raramente;<\/li>\n<li> hanno ottenuto la possibilit\u00e0 di ripristinare i deployment dopo parziali malfunzionamenti senza intervento manuale;<\/li>\n<li> acquisito maggiore fiducia nei sistemi di fornitura. Alice e Bob hanno scoperto che \u00e8 possibile suddividere il team in gruppi che si occupano di microservizi e lavorano in parallelo;<i>un<\/i>maggiore fiducia nei sistemi di fornitura. Alice e Bob hanno scoperto che \u00e8 possibile suddividere il team in gruppi dedicati ai microservizi che lavorano in parallelo;<\/li>\n<li> possono apportare 30-50 modifiche al progetto ogni giorno grazie ai contributi di ciascun gruppo e sperimentare nuove tecniche;<\/li>\n<li> attraggono facilmente nuovi sviluppatori nel progetto, i quali possono installare aggiornamenti in produzione tramite pull request in poche ore;<\/li>\n<li> superano facilmente l'audit SOC2 <i>(per la conformit\u00e0 dei fornitori di servizi ai requisiti per la gestione sicura dei dati; leggi di pi\u00f9, ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">qui<\/a><\/noindex> \u2014 nota di traduzione)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Cosa \u00e8 successo?<\/h3>\n<p>\nGitOps \u00e8 due cose:<\/p>\n<ol>\n<li> Un modello operativo per Kubernetes e cloud native. Fornisce un insieme di best practice per il deployment, la gestione e il monitoraggio di cluster e applicazioni containerizzati. Una definizione elegante in forma di <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">una slide<\/a><\/noindex> da <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> Il percorso per creare un ambiente orientato agli sviluppatori per la gestione delle applicazioni. Applichiamo il flusso di lavoro Git sia per le operazioni che per lo sviluppo. Si noti che non si tratta semplicemente di Git push, ma di organizzare l'intero set di strumenti CI\/CD e UI\/UX.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Qualche parola su Git<\/h3>\n<p>\nSe non siete familiari con i sistemi di controllo delle versioni e il flusso di lavoro basato su Git, vi consigliamo vivamente di approfondirli. All'inizio, lavorare con i rami e le pull request pu\u00f2 sembrare magia nera, ma i vantaggi valgono lo sforzo. Ecco <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">un buon articolo<\/a><\/noindex> per iniziare.<\/p>\n<h2>Come funziona Kubernetes<\/h2>\n<p>\nNella nostra storia, Alice e Bob si sono avvicinati a GitOps dopo aver lavorato a lungo con Kubernetes. Infatti, GitOps \u00e8 strettamente legato a Kubernetes: \u00e8 un modello operativo per infrastrutture e applicazioni basate su Kubernetes.<\/p>\n<h3>Cosa offre Kubernetes agli utenti?<\/h3>\n<p>\nEcco alcune delle principali funzionalit\u00e0:<\/p>\n<ol>\n<li> Nel modello Kubernetes, tutto pu\u00f2 essere descritto in modo dichiarativo.<\/li>\n<li> Il server API di Kubernetes accetta tale dichiarazione come input e poi cerca costantemente di riportare il cluster nello stato descritto nella dichiarazione.<\/li>\n<li> Le dichiarazioni sono sufficienti per descrivere e gestire una vasta gamma di carichi di lavoro - \"applicazioni\".<\/li>\n<li> Di conseguenza, le modifiche all'applicazione e al cluster avvengono a causa di:\n<ul>\n<li> cambiamenti nelle immagini dei container;<\/li>\n<li> cambiamenti nella specifica dichiarativa;<\/li>\n<li> errori nell'ambiente - ad esempio, il crash dei container.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Eccellenti capacit\u00e0 di convergenza di Kubernetes<\/h3>\n<p>\nQuando un amministratore apporta modifiche alla configurazione, l'orchestratore Kubernetes le applicher\u00e0 al cluster finch\u00e9 il suo stato <i>non si avviciner\u00e0 alla nuova configurazione<\/i>. Questo modello funziona per qualsiasi risorsa Kubernetes ed \u00e8 estendibile tramite le Custom Resource Definitions (CRD). Pertanto, i deployment Kubernetes hanno le seguenti meravigliose propriet\u00e0:<\/p>\n<ul>\n<li> <b>Automazione<\/b>: gli aggiornamenti di Kubernetes forniscono un meccanismo per automatizzare il processo di applicazione delle modifiche in modo corretto e tempestivo.<\/li>\n<li> <b>Convergenza<\/b>: Kubernetes continuer\u00e0 a tentare aggiornamenti fino a quando non avr\u00e0 successo.<\/li>\n<li> <b>Idempotenza<\/b>: le applicazioni ripetute della convergenza portano allo stesso risultato.<\/li>\n<li> <b>Determinismo<\/b>: se le risorse sono sufficienti, lo stato del cluster aggiornato dipende solo dallo stato desiderato.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Come funziona GitOps<\/h2>\n<p>\nAbbiamo appreso abbastanza su Kubernetes per spiegare i principi di funzionamento di GitOps.<\/p>\n<p>Torniamo ai team di Family Insurance legati ai microservizi. Di cosa si occupano di solito? Dai un'occhiata l'elenco qui sotto (se alcuni punti ti sembrano strani o poco familiari, ti chiediamo di non criticare subito e di rimanere con noi). Questi sono solo esempi di flussi di lavoro basati su Jenkins. Ci sono anche molti altri processi con altri strumenti.<\/p>\n<p>La cosa principale \u00e8 che vediamo che ogni aggiornamento termina con modifiche ai file di configurazione e ai repository Git. Queste modifiche in Git fanno s\u00ec che l'\u00aboperatore GitOps\u00bb aggiorni il cluster:<\/p>\n<p>1. Flusso di lavoro: \u00ab<i>Build Jenkins \u2014 branch master<\/i>\u00bb.<br \/>\nElenco delle attivit\u00e0:<\/p>\n<ul>\n<li> Jenkins push'a le immagini taggate in Quay;<\/li>\n<li> Jenkins push'a la configurazione e i chart di Helm nel bucket del master storage;<\/li>\n<li> Una funzione cloud copia la configurazione e i chart dal bucket del master repository nel repository Git master;<\/li>\n<li> L'operatore GitOps aggiorna il cluster.<\/li>\n<\/ul>\n<p>\n2. <i>Build Jenkins \u2014 branch release o hotfix<\/i>:<\/p>\n<ul>\n<li> Jenkins push'a le immagini non taggate in Quay;<\/li>\n<li> Jenkins push'a la configurazione e i chart di Helm nel bucket dello staging storage;<\/li>\n<li> Una funzione cloud copia la configurazione e i chart dal bucket dello staging repository nel repository Git staging;<\/li>\n<li> L'operatore GitOps aggiorna il cluster.<\/li>\n<\/ul>\n<p>\n3. <i>Build Jenkins \u2014 branch develop o feature<\/i>:<\/p>\n<ul>\n<li> Jenkins push'a le immagini non taggate in Quay;<\/li>\n<li> Jenkins push'a la configurazione e i chart di Helm nel bucket del develop storage;<\/li>\n<li> La funzione cloud copia il config e i chart dal bucket di archiviazione develop al repository Git develop;<\/li>\n<li>L'operatore GitOps aggiorna il cluster.<\/li>\n<\/ul>\n<p>\n4. <i>Aggiunta di un nuovo cliente<\/i>:<\/p>\n<ul>\n<li> Il manager o l'amministratore (LCM\/ops) invoca Gradle per il primo deploy e la configurazione dei bilanciatori di carico (NLB);<\/li>\n<li> LCM\/ops committa una nuova configurazione per preparare il deployment agli aggiornamenti;<\/li>\n<li> L'operatore GitOps aggiorna il cluster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Descrizione breve di GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Descrivi lo stato desiderato dell'intero sistema utilizzando specifiche dichiarative per ogni ambiente (nella nostra storia, il team di Bob definisce tutta la configurazione del sistema in Git).\n<ul>\n<li> Il repository Git \u00e8 l'unica fonte di verit\u00e0 riguardo allo stato desiderato dell'intero sistema.<\/li>\n<li> Tutte le modifiche allo stato desiderato vengono effettuate tramite commit in Git.<\/li>\n<li> Tutti i parametri desiderati del cluster sono inoltre osservabili all'interno del cluster stesso. In questo modo possiamo determinare se lo stato desiderato e quello osservato coincidono (convergono, <i>converge<\/i>) o differiscono (divergono, <i>diverge<\/i>) dallo stato desiderato e osservato.<\/li>\n<\/ul>\n<\/li>\n<li> Se gli stati desiderato e osservato differiscono, allora:\n<ul>\n<li> Esiste un meccanismo di convergenza che prima o poi sincronizza automaticamente lo stato desiderato e quello osservato. All'interno del cluster, questo \u00e8 gestito da Kubernetes.<\/li>\n<li> Il processo viene avviato immediatamente con la notifica \"cambiamento confermato\".<\/li>\n<li> Dopo un intervallo di tempo configurabile, pu\u00f2 essere inviata una notifica \"differenza\" se gli stati sono differenti.<\/li>\n<\/ul>\n<\/li>\n<li> Pertanto, tutti i commit in Git generano aggiornamenti verificabili e idempotenti nel cluster.\n<ul>\n<li>Un rollback \u00e8 una convergenza verso uno stato desiderato precedente.<\/li>\n<\/ul>\n<\/li>\n<li> La convergenza \u00e8 definitiva. La sua attuazione \u00e8 testimoniata da:\n<ul>\n<li> Assenza di notifiche \"differenza\" per un certo intervallo di tempo.<\/li>\n<li> Notifica \"convergente\" (ad esempio, webhook, evento di scrittura Git).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Che cos'\u00e8 la divergenza?<\/h3>\n<p>\nRipetiamo ancora una volta: <i>tutte le propriet\u00e0 desiderate del cluster devono essere osservabili nel cluster stesso<\/i>.<\/p>\n<p>Alcuni esempi di divergenza:<\/p>\n<ul>\n<li> Modifica nel file di configurazione a causa della fusione di branch in Git.<\/li>\n<li> Modifica nel file di configurazione a causa di un commit in Git effettuato da un client GUI.<\/li>\n<li> Modifiche multiple nello stato desiderato a causa di una PR in Git con successiva creazione dell'immagine del container e modifiche nella configurazione.<\/li>\n<li> Cambiamento dello stato del cluster a causa di errori, conflitti di risorse che portano a \"comportamenti anomali\" o semplicemente per deviazione casuale dallo stato originale.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Cosa rappresenta il meccanismo di convergenza?<\/h3>\n<p>\nEsempi di applicazione:<\/p>\n<ul>\n<li> Per i container e i cluster, il meccanismo di convergenza \u00e8 fornito da Kubernetes.<\/li>\n<li> Lo stesso meccanismo pu\u00f2 essere utilizzato per gestire applicazioni e architetture basate su Kubernetes (ad esempio, Istio e Kubeflow).<\/li>\n<li> Il meccanismo per gestire l'interazione operativa tra Kubernetes, i repository delle immagini e Git fornisce <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Weave Flux GitOps operator<\/a><\/noindex>, che fa parte di <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> Per le macchine di base, il meccanismo di convergenza deve essere dichiarativo e autonomo. Dalla nostra esperienza, possiamo dire che <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c\">Terraform<\/a><\/noindex> \u00e8 il pi\u00f9 vicino a questa definizione, ma richiede comunque supervisione umana. In questo senso, GitOps estende le tradizioni dell'Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps unisce Git a un ottimo meccanismo di convergenza di Kubernetes, offrendo un modello per l'operativit\u00e0.<\/p>\n<p>GitOps ci permette di affermare che: <i>solo i sistemi che possono essere descritti e monitorati sono soggetti ad automazione e controllo.<\/i>.<\/p>\n<h3>GitOps \u00e8 destinato all'intero stack cloud native (ad esempio, Terraform e simili).<\/h3>\n<p>\nGitOps non si limita a Kubernetes. Vogliamo che l'intero sistema sia gestito in modo dichiarativo e utilizzi la convergenza. Con l'intero sistema intendiamo l'insieme degli ambienti che lavorano con Kubernetes, come ad esempio \"dev cluster 1\", \"production\" e cos\u00ec via. Ogni ambiente comprende macchine, cluster, applicazioni, cos\u00ec come interfacce per servizi esterni che forniscono dati, monitoraggio, ecc.<\/p>\n<p>Notate quanto sia importante Terraform in questo caso per il problema del bootstrapping. Kubernetes deve essere distribuito da qualche parte e l'uso di Terraform significa che possiamo applicare gli stessi flussi di lavoro GitOps per creare uno strato di gestione alla base di Kubernetes e delle applicazioni. Si tratta di una best practice utile.<\/p>\n<p>Si presta particolare attenzione all'applicazione dei concetti di GitOps agli strati sopra Kubernetes. Al momento esistono soluzioni di tipo GitOps per Istio, Helm, Ksonnet, OpenFaaS e Kubeflow, cos\u00ec come per Pulumi, che creano uno strato per lo sviluppo di applicazioni cloud native.<\/p>\n<h2>Kubernetes CI\/CD: confronto tra GitOps e altri approcci.<\/h2>\n<p>\nCome detto, GitOps \u00e8 due cose:<\/p>\n<ol>\n<li> Un modello operativo per Kubernetes e cloud native, descritto sopra.<\/li>\n<li> Un percorso per organizzare un ambiente orientato agli sviluppatori per la gestione delle applicazioni.<\/li>\n<\/ol>\n<p>\nPer molti, GitOps \u00e8 prima di tutto un processo basato su Git push. Anche a noi piace. Ma non \u00e8 tutto: vediamo ora i pipeline CI\/CD.<\/p>\n<h3>GitOps consente il Continuous Deployment (CD) su Kubernetes.<\/h3>\n<p>\nGitOps offre un meccanismo di distribuzione continua che elimina la necessit\u00e0 di sistemi separati di gestione delle distribuzioni. Tutto il lavoro viene eseguito da Kubernetes.<\/p>\n<ul>\n<li> L'aggiornamento dell'applicazione richiede un aggiornamento su Git. Si tratta di un aggiornamento transazionale allo stato desiderato. Il 'deployment' viene quindi effettuato all'interno del cluster da Kubernetes stesso basandosi sulla descrizione aggiornata.<\/li>\n<li> A causa delle specificit\u00e0 di Kubernetes, questi aggiornamenti sono convergenti. Questo fornisce un meccanismo per il Continuous Deployment in cui tutti gli aggiornamenti sono atomici.<\/li>\n<li> Nota: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> offre un operatore GitOps che integra Git e Kubernetes e consente di eseguire CD allineando lo stato desiderato con quello attuale del cluster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Senza kubectl e script<\/h3>\n<p>\n\u00c8 consigliabile evitare l'uso di Kubectl per aggiornare il cluster, in particolare per gli script di raggruppamento dei comandi kubectl. Invece, tramite una pipeline GitOps, l'utente pu\u00f2 aggiornare il proprio cluster Kubernetes tramite Git.<\/p>\n<p>I vantaggi includono:<\/p>\n<ol>\n<li> <b>Correttezza<\/b>. Un gruppo di aggiornamenti pu\u00f2 essere applicato, convergente e infine validato, avvicinandoci all'obiettivo del deployment atomico. Al contrario, l'uso di script non offre alcuna garanzia di convergenza (ne parler\u00f2 pi\u00f9 avanti).<\/li>\n<li> <b>Sicurezza<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Citando<\/a><\/noindex> Kelsey Hightower: \u00abLimitate l'accesso al cluster Kubernetes agli strumenti di automazione e agli amministratori responsabili per il debug o la manutenzione\u00bb. Vedi anche <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">il mio post<\/a><\/noindex> sulla sicurezza e la conformit\u00e0 alle specifiche tecniche, cos\u00ec come <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">l'articolo sul hacking di Homebrew<\/a><\/noindex> attraverso il furto di credenziali da uno script Jenkins mal scritto.<\/li>\n<li> <b>L'esperienza utente<\/b>. Kubectl espone la meccanica del modello degli oggetti di Kubernetes, che \u00e8 piuttosto complessa. Idealmente, gli utenti dovrebbero interagire con il sistema a un livello di astrazione pi\u00f9 elevato. Qui citer\u00f2 di nuovo Kelsey e consiglio di dare un'occhiata <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">un curriculum del genere<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>La differenza tra CI e CD<\/h3>\n<p>\nGitOps migliora i modelli CI\/CD esistenti.<\/p>\n<p>Un moderno server CI \u00e8 uno strumento per l'orchestrazione. In particolare, \u00e8 uno strumento per l'orchestrazione dei pipeline CI. Questi includono build, test, merge nel trunk, ecc. I server CI automatizzano la gestione di complessi pipeline a pi\u00f9 passaggi. Una tentazione comune \u00e8 quella di creare uno script per un insieme di aggiornamenti Kubernetes e eseguirlo come parte del pipeline per applicare modifiche al cluster. In effetti, molti esperti lo fanno. Tuttavia, questa non \u00e8 la soluzione ottimale, ecco perch\u00e9.<\/p>\n<p>CI dovrebbe essere utilizzato per apportare aggiornamenti al trunk, e il cluster Kubernetes dovrebbe modificarsi in base a questi aggiornamenti per gestire il CD \"internamente\". La chiamiamo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">modello pull per il CD<\/a><\/noindex>, a differenza del modello push CI. Il CD \u00e8 parte della <i>orchestrazione runtime<\/i>.<\/p>\n<h3>Perch\u00e9 i server CI non dovrebbero gestire il CD tramite aggiornamenti diretti in Kubernetes<\/h3>\n<p>\n<i>Non utilizzare il server CI per orchestrare aggiornamenti diretti in Kubernetes come un insieme di attivit\u00e0 CI. Questo \u00e8 un anti-pattern di cui abbiamo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">gi\u00e0 parlato<\/a><\/noindex> nel nostro blog.<\/i><\/p>\n<p>Torniamo ad Alice e Bob.<\/p>\n<p>Quali problemi hanno affrontato? Il server CI di Bob applica modifiche al cluster, ma se, durante il processo, dovesse bloccarsi, Bob non sapr\u00e0 in quale stato si trova (o dovrebbe trovarsi) il cluster e come risolverlo. Lo stesso vale in caso di successo.<\/p>\n<p>Supponiamo che il team di Bob abbia costruito una nuova immagine e poi aggiornato i propri deployment per distribuire l'immagine (tutto questo dal pipeline CI).<\/p>\n<p>Se l'immagine viene creata correttamente, ma il pipeline si interrompe, il team dovr\u00e0 scoprire:<\/p>\n<ul>\n<li> L'aggiornamento \u00e8 stato distribuito?<\/li>\n<li> Stiamo eseguendo una nuova compilazione? Questo porter\u00e0 a effetti collaterali indesiderati, con la possibilit\u00e0 di ottenere due compilazioni della stessa immagine immutabile? <\/li>\n<li> Dobbiamo aspettare un altro aggiornamento prima di avviare la compilazione?<\/li>\n<li> Cosa \u00e8 andato storto esattamente? Quali passaggi devono essere ripetuti (e quali possono essere ripetuti in sicurezza)?<\/li>\n<\/ul>\n<p>\n<i>Organizzare un flusso di lavoro basato su Git non garantisce che il team di Bob non incontri questi problemi. Possono comunque sbagliarsi nel push di un commit, nel tag o in qualche altro parametro; tuttavia, questo approccio \u00e8 comunque molto pi\u00f9 vicino a un chiaro tutto o niente.<\/i><\/p>\n<p>In sintesi, ecco perch\u00e9 i server CI non dovrebbero occuparsi del CD:<\/p>\n<ul>\n<li> Gli script di aggiornamento non sono sempre deterministici; \u00e8 facile commettere errori.<\/li>\n<li> I server CI non convergono verso un modello dichiarativo del cluster.<\/li>\n<li> \u00c8 difficile garantire l'idempotenza. Gli utenti devono comprendere la semantica profonda del sistema.<\/li>\n<li> \u00c8 pi\u00f9 complicato eseguire un ripristino dopo un guasto parziale.<\/li>\n<\/ul>\n<p>\n<i>Nota su Helm: se desideri utilizzare Helm, ti consigliamo di combinarlo con un operatore GitOps, come <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>. Questo aiuter\u00e0 a garantire la convergenza. Da solo, Helm non \u00e8 n\u00e9 deterministico n\u00e9 atomico.<\/i><\/p>\n<h2>GitOps \u00e8 il modo migliore per realizzare il Continuous Delivery per Kubernetes<\/h2>\n<p>\nIl team di Alice e Bob implementa GitOps e scopre che \u00e8 molto pi\u00f9 facile lavorare con i prodotti software, mantenere alte prestazioni e stabilit\u00e0. Concludiamo questo articolo con illustrazioni che mostrano come appare il loro nuovo approccio. Tieni presente che stiamo parlando principalmente di applicazioni e servizi, ma GitOps pu\u00f2 essere utilizzato per gestire l'intera piattaforma.<\/p>\n<h3>Il modello operativo per Kubernetes<\/h3>\n<p>\nGuarda il diagramma seguente. Rappresenta Git e il repository delle immagini dei container come risorse comuni per i due cicli di vita orchestrati:<\/p>\n<ul>\n<li> Il pipeline di integrazione continua, che legge e scrive file in Git e pu\u00f2 aggiornare il repository delle immagini dei container.<\/li>\n<li> Il pipeline Runtime GitOps, che combina il deployment con la gestione e la visibilit\u00e0. Questo legge e scrive file in Git e pu\u00f2 caricare le immagini dei container.<\/li>\n<\/ul>\n<h3>Quali sono le principali conclusioni?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Separazione delle preoccupazioni<\/b>: Si noti che entrambe le pipeline possono scambiarsi dati solamente aggiornando Git o il repository delle immagini. In altre parole, c'\u00e8 un firewall tra l'ambiente CI e quello runtime. Lo chiamiamo \"firewall dell'immutabilit\u00e0\" <i>(immutability firewall)<\/i>, poich\u00e9 tutti gli aggiornamenti ai repository creano nuove versioni. Per ulteriori informazioni su questo tema, fare riferimento alle diapositive 72-87 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">di questa presentazione.<\/a><\/noindex>.<\/li>\n<li> <b>\u00c8 possibile utilizzare qualsiasi server CI e Git.<\/b>: GitOps funziona con qualsiasi componente. Puoi continuare a utilizzare i tuoi server CI e Git preferiti, i repository delle immagini e i set di test. Quasi tutti gli altri strumenti per il Continuous Delivery sul mercato richiedono il proprio server CI\/Git o un repository delle immagini. Questo pu\u00f2 diventare un fattore limitante nello sviluppo del cloud native. Con GitOps puoi utilizzare strumenti familiari.<\/li>\n<li> <b>Gli eventi come strumento di integrazione<\/b>: Non appena i dati in Git vengono aggiornati, Weave Flux (o l'operatore Weave Cloud) ne informa il runtime. Ogni volta che Kubernetes accetta un insieme di modifiche, Git viene aggiornato. Ci\u00f2 fornisce un modello semplice per l'integrazione dei flussi di lavoro per GitOps, come mostrato di seguito.<\/li>\n<\/ol>\n<h2>Conclusione<\/h2>\n<p>\nGitOps offre solide garanzie di aggiornamento necessarie a qualsiasi strumento CI\/CD moderno:<\/p>\n<ul>\n<li> automazione;<\/li>\n<li> convergenza;<\/li>\n<li> idempotenza;<\/li>\n<li> determinismo.<\/li>\n<\/ul>\n<p>\nQuesto \u00e8 importante perch\u00e9 offre un modello operativo per gli sviluppatori nel cloud native.<\/p>\n<ul>\n<li> Strumenti tradizionali per la gestione e il monitoraggio dei sistemi sono legati ai team operativi che operano nell'ambito di un runbook <i>(un insieme di procedure e operazioni di routine \u2014 nota del traduttore)<\/i>, collegato a un deployment specifico.<\/li>\n<li> Nella gestione di sistemi cloud native, gli strumenti di monitoraggio sono il miglior modo per valutare i risultati dei deployment, consentendo al team di sviluppo di reagire prontamente.<\/li>\n<\/ul>\n<p>\nImmaginate molteplici cluster distribuiti su vari cloud e numerosi servizi con i propri team e piani di deployment. GitOps offre un modello di gestione scalabile e invariabile per gestire questa abbondanza.<\/p>\n<h2>P.S. dal traduttore<\/h2>\n<p>\nLeggete anche nel nostro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: confronto tra i metodi Pull e Push<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Presentiamo la libreria kubedog per monitorare le risorse di Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Ampliare e completare Kubernetes (panoramica e video della presentazione)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Sapevate di GitOps prima di questi due articoli su Habr?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    S\u00ec, sapevo tutto.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Solo superficialmente.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    No<\/p>\n<\/li>\n<\/ul>\n<p>    Hanno votato 35 utenti. 10 utenti si sono astenuti.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35941","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:07:41+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Che cos'\u00e8 GitOps? | ProHoster","description":"Nota del traduttore: Dopo la recente pubblicazione di un pezzo sui metodi pull e push in GitOps, abbiamo notato interesse per questo modello in generale, ma ci sono state poche pubblicazioni in lingua russa su questo argomento (su Habr non ce ne sono). Pertanto, siamo lieti di presentarvi la traduzione di un altro articolo \u2014 anche se ormai quasi un anno fa! \u2014 dalla compagnia Weaveworks, capitolo","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster","og:description":"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/chto-zhe-takoe-gitops","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:07:41+00:00","article:modified_time":"2019-10-31T19:07:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35941","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 01:21:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:53:31","updated":"2026-01-22 01:21:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}