{"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\/sv\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"Vad \u00e4r GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Obs. \u00f6vers.<\/b>: Efter den senaste publiceringen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">av material<\/a><\/noindex> om pull- och push-metoder i GitOps har vi sett ett intresse f\u00f6r denna modell generellt, men det fanns mycket f\u00e5 publikationer om detta p\u00e5 ryska (det finns helt enkelt inga p\u00e5 Habr). D\u00e4rf\u00f6r \u00e4r vi glada att erbjuda er \u00f6vers\u00e4ttningen av en annan artikel - \u00e4ven om den har n\u00e4stan ett \u00e5r p\u00e5 nacken! - fr\u00e5n f\u00f6retaget Weaveworks, vars chef myntade termen \"GitOps\". Texten f\u00f6rklarar k\u00e4rnan i tillv\u00e4gag\u00e5ngss\u00e4ttet och de viktiga skillnaderna fr\u00e5n befintliga modeller.<\/i><\/p>\n<p>\nF\u00f6r ett \u00e5r sedan publicerade vi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">en introduktion till GitOps<\/a><\/noindex>. D\u00e5 ber\u00e4ttade vi hur teamet p\u00e5 Weaveworks lanserade en SaaS helt baserad p\u00e5 Kubernetes och utvecklade en upps\u00e4ttning f\u00f6reskrivande b\u00e4sta praxis f\u00f6r distribution, hantering och \u00f6vervakning i en cloud native-milj\u00f6.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Artikeln blev popul\u00e4r. Andra b\u00f6rjade prata om GitOps, publicera nya verktyg f\u00f6r <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\">utveckling<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">hemligheter<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">funktioner<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">kontinuerlig integration<\/a><\/noindex> och s\u00e5 vidare. P\u00e5 v\u00e5r webbplats d\u00f6k det upp <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">stort antal<\/a><\/noindex> publikationer och anv\u00e4ndningsfall f\u00f6r GitOps. Men vissa m\u00e4nniskor hade fortfarande fr\u00e5gor. Hur skiljer sig modellen fr\u00e5n traditionell <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> och kontinuerlig leverans (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">continuous delivery<\/a><\/noindex>)? M\u00e5ste man anv\u00e4nda Kubernetes?<\/p>\n<p>Snart ins\u00e5g vi att det beh\u00f6vdes en ny beskrivning som erbjuder:<\/p>\n<ol>\n<li> Ett stort antal exempel och historier;<\/li>\n<li> En konkret definition av GitOps;<\/li>\n<li> En j\u00e4mf\u00f6relse med traditionell continuous delivery.<\/li>\n<\/ol>\n<p>\nI denna artikel har vi f\u00f6rs\u00f6kt att t\u00e4cka alla dessa \u00e4mnen. I den kommer du att hitta en uppdaterad introduktion till GitOps och en synvinkel fr\u00e5n utvecklare och CI\/CD. Vi fokuserar fr\u00e4mst p\u00e5 Kubernetes, \u00e4ven om modellen kan generaliseras.<\/p>\n<h2>L\u00e5t oss presentera: GitOps<\/h2>\n<p>\nF\u00f6rest\u00e4ll dig Alice. Hon driver f\u00f6retaget Family Insurance, som erbjuder f\u00f6rs\u00e4kringspolicer f\u00f6r h\u00e4lsa, bilar, fastigheter och resef\u00f6rs\u00e4kring till personer som \u00e4r f\u00f6r upptagna f\u00f6r att navigera i kontraktens detaljer sj\u00e4lva. Hennes verksamhet b\u00f6rjade som ett sidoprojekt n\u00e4r Alice arbetade p\u00e5 en bank som data scientist. En dag ins\u00e5g hon att hon kunde anv\u00e4nda avancerade datoralgoritmer f\u00f6r att effektivare analysera data och skapa f\u00f6rs\u00e4kringspaket. Investerare finansierade projektet, och nu genererar hennes f\u00f6retag \u00f6ver 20 miljoner dollar om \u00e5ret och v\u00e4xer snabbt. F\u00f6r n\u00e4rvarande arbetar 180 personer i hennes f\u00f6retag p\u00e5 olika positioner. Bland dem finns ett teknisk team som ansvarar f\u00f6r utveckling, underh\u00e5ll av webbplatsen, databasen och analys av kundbasen. Teamet p\u00e5 60 personer leds av Bob - f\u00f6retagets tekniska direkt\u00f6r.<\/p>\n<p>Bobs team implementerar produktionssystem i molnet. Deras huvudsakliga applikationer k\u00f6rs p\u00e5 GKE, vilket utnyttjar Kubernetes f\u00f6r Google Cloud. Dessutom anv\u00e4nder de olika verktyg f\u00f6r datahantering och analys i sitt arbete.<\/p>\n<p>Family Insurance hade inte t\u00e4nkt anv\u00e4nda containrar, men blev entusiastiska kring Docker. Snart ins\u00e5g f\u00f6retagets specialister att GKE g\u00f6r det m\u00f6jligt att enkelt och smidigt lansera kluster f\u00f6r att testa nya funktioner. Jenkins lades till f\u00f6r CI och Quay f\u00f6r att organisera containerregistret, och skript skrevs f\u00f6r Jenkins som pushed nya containrar och konfigurationer till GKE.<\/p>\n<p>Det tog en tid. Alice och Bob blev besvikna \u00f6ver prestandan hos den valda metoden och dess p\u00e5verkan p\u00e5 verksamheten. Implementeringen av containrar f\u00f6rb\u00e4ttrade inte prestandan s\u00e5 mycket som teamet hoppades. Ibland krossades deploymentar, och det var oklart om det berodde p\u00e5 kod\u00e4ndringar. Det blev ocks\u00e5 sv\u00e5rt att sp\u00e5ra \u00e4ndringar i konfigurationerna. Ofta var de tvungna att skapa ett nytt kluster och flytta \u00f6ver applikationerna, eftersom det var det enklaste s\u00e4ttet att rensa upp oredan som systemet hade blivit. Alice fruktade att situationen skulle bli v\u00e4rre i takt med att applikationen utvecklades (dessutom var ett nytt projekt baserat p\u00e5 maskininl\u00e4rning p\u00e5 v\u00e4g). Bob hade automatiserat det mesta av arbetet och f\u00f6rstod inte varf\u00f6r pipelinen fortfarande var instabil, hade d\u00e5lig skalbarhet och periodvis kr\u00e4vde manuellt ingripande.<\/p>\n<p><b>Sedan fick de h\u00f6ra talas om GitOps. Denna l\u00f6sning visade sig vara precis vad de beh\u00f6vde f\u00f6r att r\u00f6ra sig fram\u00e5t med sj\u00e4lvf\u00f6rtroende.<\/b><\/p>\n<p>Alice och Bob hade i flera \u00e5r h\u00f6rt talas om arbetsfl\u00f6den baserade p\u00e5 Git, DevOps och infrastructure as code. Det unika med GitOps \u00e4r att det inf\u00f6r en rad b\u00e4sta metoder - kategoriska och normativa - f\u00f6r att implementera dessa id\u00e9er i kontexten av Kubernetes. \u00c4mnet <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">har tagits upp flera g\u00e5nger<\/a><\/noindex>, inklusive i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">Weaveworks blog<\/a><\/noindex>.<\/p>\n<p>Family Insurance beslutar att implementera GitOps. Nu har f\u00f6retaget en automatiserad driftsmodell som \u00e4r kompatibel med Kubernetes och f\u00f6renar <i>hastighet<\/i> med <i>stabilitet<\/i>, eftersom de:<\/p>\n<ul>\n<li> uppt\u00e4ckte att teamets produktivitet f\u00f6rdubblades utan att n\u00e5gon blev galen;<\/li>\n<li> slutade hantera skript. Ist\u00e4llet kan de nu fokusera p\u00e5 nya funktioner och f\u00f6rb\u00e4ttra ingenj\u00f6rsmetoder - till exempel implementera canary deployments och f\u00f6rb\u00e4ttra testningen;<\/li>\n<li> f\u00f6rb\u00e4ttrade deploymentsprocessen - den kraschar nu s\u00e4llan;<\/li>\n<li> fick m\u00f6jlighet att \u00e5terst\u00e4lla deploymentar efter partiella fel utan manuellt ingripande;<\/li>\n<li> fick st\u00f6rre trygghet i leveranssystemen. Alice och Bob uppt\u00e4ckte att de kunde dela teamet i grupper som arbetade med mikrotj\u00e4nster parallellt;<i>b\u00e4sta resultatet (subjektiv \u00e5sikt).<\/i>kan g\u00f6ra 30-50 \u00e4ndringar i projektet varje dag genom varje grupp och prova nya tekniker.<\/li>\n<li> kan g\u00f6ra 30-50 \u00e4ndringar i projektet varje dag med hj\u00e4lp av varje grupp och prova nya tekniker;<\/li>\n<li> attraherar enkelt nya utvecklare till projektet, som kan implementera uppdateringar p\u00e5 produktion med hj\u00e4lp av pull requestar inom n\u00e5gra timmar;<\/li>\n<li> genomg\u00e5r l\u00e4tt en granskning inom ramverket f\u00f6r SOC2 <i>(f\u00f6r att s\u00e4kerst\u00e4lla att tj\u00e4nsteleverant\u00f6rer uppfyller kraven f\u00f6r s\u00e4ker datastyrning; l\u00e4s mer, till exempel, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">h\u00e4r<\/a><\/noindex> \u2014 anm. red.)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Vad h\u00e4nde?<\/h3>\n<p>\nGitOps \u00e4r tv\u00e5 saker:<\/p>\n<ol>\n<li> En drifts\u00e4ttningsmodell f\u00f6r Kubernetes och cloud native. Den erbjuder en upps\u00e4ttning b\u00e4sta praxis f\u00f6r drifts\u00e4ttning, hantering och \u00f6vervakning av kluster och applikationer som \u00e4r paketerade i containrar. En elegant definition i form av <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">en enda slide<\/a><\/noindex> fr\u00e5n <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> V\u00e4gen till att skapa en utvecklarorienterad milj\u00f6 f\u00f6r applikationshantering. Vi till\u00e4mpar Git-arbetsfl\u00f6det b\u00e5de f\u00f6r drift och utveckling. Observera att det inte bara handlar om Git push, utan om att organisera hela upps\u00e4ttningen av CI\/CD och UI\/UX-verktyg.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Ett par ord om Git<\/h3>\n<p>\nOm du inte \u00e4r bekant med versionskontrollsystem och Git-baserade arbetsfl\u00f6den, rekommenderar vi starkt att du studerar dem. I b\u00f6rjan kan arbete med branches och pull requestar verka som svart magi, men f\u00f6rdelarna \u00e4r v\u00e4rda anstr\u00e4ngningen. H\u00e4r \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">bra artikel<\/a><\/noindex> f\u00f6r att b\u00f6rja.<\/p>\n<h2>Hur Kubernetes fungerar<\/h2>\n<p>\nI v\u00e5r ber\u00e4ttelse v\u00e4nder sig Alice och Bob till GitOps efter att ha arbetat ett tag med Kubernetes. Faktum \u00e4r att GitOps \u00e4r n\u00e4ra kopplat till Kubernetes \u2014 det \u00e4r en drifts\u00e4ttningsmodell f\u00f6r infrastruktur och applikationer som \u00e4r baserade p\u00e5 Kubernetes.<\/p>\n<h3>Vad ger Kubernetes anv\u00e4ndare?<\/h3>\n<p>\nH\u00e4r \u00e4r n\u00e5gra av de grundl\u00e4ggande funktionerna:<\/p>\n<ol>\n<li> I Kubernetes-modellen kan allt beskrivas i deklarativ form.<\/li>\n<li> Kubernetes API-server tar emot s\u00e5dana deklarationer som indata och f\u00f6rs\u00f6ker kontinuerligt att f\u00e5 klustret att matcha det tillst\u00e5nd som beskrivs i deklarationen.<\/li>\n<li> Deklarationer \u00e4r tillr\u00e4ckliga f\u00f6r att beskriva och hantera ett brett spektrum av arbetsbelastningar \u2014 \"applikationer\".<\/li>\n<li> Som ett resultat sker f\u00f6r\u00e4ndringar i applikationen och klustret p\u00e5 grund av:\n<ul>\n<li> \u00e4ndringar i containerbilder;<\/li>\n<li> \u00e4ndringar i den deklarativa specifikationen;<\/li>\n<li> fel i milj\u00f6n \u2014 till exempel, kraschade containrar.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Kubernetes utm\u00e4rkta konvergensegenskaper<\/h3>\n<p>\nN\u00e4r en administrat\u00f6r g\u00f6r \u00e4ndringar i konfigurationen kommer Kubernetes-orkestratorn att till\u00e4mpa dem p\u00e5 klustret tills dess tillst\u00e5nd <i>n\u00e4ra nya konfigurationen<\/i>. Denna modell fungerar f\u00f6r varje Kubernetes-resurs och kan ut\u00f6kas med Custom Resource Definitions (CRDs). D\u00e4rf\u00f6r har Kubernetes-deploymentar f\u00f6ljande fantastiska egenskaper:<\/p>\n<ul>\n<li> <b>Automatisering<\/b>: Kubernetes-uppdateringar tillhandah\u00e5ller en mekanism f\u00f6r att automatisera processen f\u00f6r att till\u00e4mpa \u00e4ndringar p\u00e5 ett korrekt och tidsenligt s\u00e4tt.<\/li>\n<li> <b>Konvergens<\/b>: Kubernetes kommer att forts\u00e4tta f\u00f6rs\u00f6ka uppdateringar tills det lyckas.<\/li>\n<li> <b>Idempotens<\/b>: upprepade till\u00e4mpningar av konvergens ger samma resultat.<\/li>\n<li> <b>Determinism<\/b>: med tillr\u00e4ckliga resurser beror tillst\u00e5ndet f\u00f6r den uppdaterade klustret endast p\u00e5 det \u00f6nskade tillst\u00e5ndet.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hur GitOps fungerar<\/h2>\n<p>\nVi har l\u00e4rt oss tillr\u00e4ckligt om Kubernetes f\u00f6r att f\u00f6rklara principerna bakom GitOps.<\/p>\n<p>L\u00e5t oss \u00e5terv\u00e4nda till Family Insurance-team som arbetar med mikrotj\u00e4nster. Vad brukar de vanligtvis syssla med? Titta p\u00e5 listan nedan (om n\u00e5gra punkter verkar m\u00e4rkliga eller ok\u00e4nda \u2014 var v\u00e4nlig v\u00e4nta med kritiken och stanna kvar hos oss). Detta \u00e4r bara exempel p\u00e5 arbetsfl\u00f6den baserade p\u00e5 Jenkins. Det finns ocks\u00e5 m\u00e5nga andra processer n\u00e4r man arbetar med andra verktyg.<\/p>\n<p>Det viktigaste \u00e4r att vi ser att varje uppdatering slutar med f\u00f6r\u00e4ndringar i konfigurationsfiler och Git-repositorier. Dessa f\u00f6r\u00e4ndringar i Git leder till att 'GitOps-operat\u00f6ren' uppdaterar klustret:<\/p>\n<p>1. Arbetsfl\u00f6de: '<i>Jenkins-bygge \u2014 master-gren<\/i>\u00bb.<br \/>\nAtt g\u00f6ra-lista:<\/p>\n<ul>\n<li> Jenkins pushar taggade bilder till Quay;<\/li>\n<li> Jenkins pushar konfigurationen och Helm-diagram till master-lagringsbucketen;<\/li>\n<li> Molnfunktionen kopierar konfig och diagram fr\u00e5n master-lagringsbunken till Git-repositoriet master;<\/li>\n<li> GitOps-operat\u00f6ren uppdaterar klustret.<\/li>\n<\/ul>\n<p>\n2. <i>Jenkins-bygge \u2014 release- eller hotfix-gren<\/i>:<\/p>\n<ul>\n<li> Jenkins pushar otaggade bilder till Quay;<\/li>\n<li> Jenkins pushar konfigurationen och Helm-diagram till staging-lagringsbucketen;<\/li>\n<li> Molnfunktionen kopierar konfig och diagram fr\u00e5n staging-lagringsbunken till Git-repositoriet staging;<\/li>\n<li> GitOps-operat\u00f6ren uppdaterar klustret.<\/li>\n<\/ul>\n<p>\n3. <i>Jenkins-bygge \u2014 develop- eller feature-gren<\/i>:<\/p>\n<ul>\n<li> Jenkins pushar otaggade bilder till Quay;<\/li>\n<li> Jenkins pushar konfigurationen och Helm-diagram till develop-lagringsbucketen;<\/li>\n<li> Molnfunktionen kopierar konfig och diagram fr\u00e5n develop-lagringsbunken till Git-repositoriet develop;<\/li>\n<li>GitOps-operat\u00f6ren uppdaterar klustret.<\/li>\n<\/ul>\n<p>\n4. <i>L\u00e4gg till en ny klient<\/i>:<\/p>\n<ul>\n<li> Managern eller administrat\u00f6ren (LCM\/ops) anropar Gradle f\u00f6r den initiala distributionen och konfigurationen av n\u00e4tverkslastbalanserare (NLB);<\/li>\n<li> LCM\/operations kommittar en ny konfiguration f\u00f6r att f\u00f6rbereda deploymenten f\u00f6r uppdateringar;<\/li>\n<li> GitOps-operat\u00f6ren uppdaterar klustret.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kort beskrivning av GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Beskriv det \u00f6nskade tillst\u00e5ndet f\u00f6r hela systemet med hj\u00e4lp av deklarativa specifikationer f\u00f6r varje milj\u00f6 (i v\u00e5r historia definierar Bob-teamet hela systemkonfigurationen i Git).\n<ul>\n<li> Git-repositoriet \u00e4r den enda sanningsk\u00e4llan n\u00e4r det g\u00e4ller det \u00f6nskade tillst\u00e5ndet f\u00f6r hela systemet.<\/li>\n<li> Alla \u00e4ndringar till det \u00f6nskade tillst\u00e5ndet g\u00f6rs genom commits i Git.<\/li>\n<li> Alla \u00f6nskade parametrar f\u00f6r klustret \u00e4r ocks\u00e5 observerbara i klustret sj\u00e4lvt. P\u00e5 s\u00e5 s\u00e4tt kan vi avg\u00f6ra om (konvergerar, <i>\u2014 k\u00f6rning av den testade playbooken,<\/i>) eller om de skiljer sig (divergerar, <i>diverge<\/i>) det \u00f6nskade och observerade tillst\u00e5ndet.<\/li>\n<\/ul>\n<\/li>\n<li> Om det \u00f6nskade och observerade tillst\u00e5ndet skiljer sig \u00e5t d\u00e5:\n<ul>\n<li> Det finns en konvergensmekanism som f\u00f6rr eller senare automatiskt synkroniserar det m\u00e5lade och observerade tillst\u00e5ndet. Inom klustret hanteras detta av Kubernetes.<\/li>\n<li> Processen startar omedelbart med meddelandet \"change committed\".<\/li>\n<li> Efter en viss konfigurerbar tidsperiod kan ett meddelande \"diff\" skickas om tillst\u00e5nden skiljer sig \u00e5t.<\/li>\n<\/ul>\n<\/li>\n<li> S\u00e5ledes orsakar alla commits i Git verifierbara och idempotenta uppdateringar i klustret.\n<ul>\n<li>Rollback \u00e4r en konvergens till ett tidigare \u00f6nskat tillst\u00e5nd.<\/li>\n<\/ul>\n<\/li>\n<li> Konvergens \u00e4r slutgiltig. Tecken p\u00e5 att den har intr\u00e4ffat inkluderar:\n<ul>\n<li> Ingen \"diff\"-meddelanden under en viss tidsperiod.<\/li>\n<li> Ett \"converged\"-meddelande (t.ex. webhook, Git writeback-h\u00e4ndelse).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Vad \u00e4r divergens?<\/h3>\n<p>\nVi upprepar: <i>alla \u00f6nskade egenskaper f\u00f6r klustret m\u00e5ste vara observerbara i klustret sj\u00e4lvt.<\/i>.<\/p>\n<p>N\u00e5gra exempel p\u00e5 divergens:<\/p>\n<ul>\n<li> \u00c4ndringar i konfigurationsfilen p\u00e5 grund av sammanslagning av grenar i Git.<\/li>\n<li> \u00c4ndring i konfigurationsfilen p\u00e5 grund av en commit i Git som gjorts av en GUI-klient.<\/li>\n<li> Flera \u00e4ndringar i \u00f6nskat tillst\u00e5nd p\u00e5 grund av PR i Git f\u00f6ljt av byggande av containerbild och \u00e4ndringar i konfigurationen.<\/li>\n<li> \u00c4ndring av klustrets tillst\u00e5nd p\u00e5 grund av ett fel, resurskonflikt som leder till \"d\u00e5ligt beteende\", eller helt enkelt en slumpm\u00e4ssig avvikelse fr\u00e5n det ursprungliga tillst\u00e5ndet.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Vad \u00e4r en konvergensmekanism?<\/h3>\n<p>\nN\u00e5gra exempel:<\/p>\n<ul>\n<li> F\u00f6r containrar och kluster tillhandah\u00e5ller konvergensmekanismen Kubernetes.<\/li>\n<li> Samma mekanism kan anv\u00e4ndas f\u00f6r att hantera applikationer och konstruktioner baserade p\u00e5 Kubernetes (t.ex. Istio och Kubeflow).<\/li>\n<li> En mekanism f\u00f6r att hantera arbetsinteraktioner mellan Kubernetes, bild-arkiv och Git ger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">GitOps-operat\u00f6ren Weave Flux<\/a><\/noindex>, som \u00e4r en del av <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> F\u00f6r grundmaskiner m\u00e5ste konvergensmekanismen vara deklarativ och autonom. Utifr\u00e5n v\u00e5r erfarenhet kan vi s\u00e4ga att <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> den ligger n\u00e4rmast denna definition, men kr\u00e4ver \u00e4nd\u00e5 m\u00e4nsklig kontroll. I detta avseende utvidgar GitOps traditionerna kring Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps kombinerar Git med den utm\u00e4rkta konvergensmekanismen i Kubernetes och erbjuder en modell f\u00f6r drift.<\/p>\n<p>GitOps till\u00e5ter oss att p\u00e5st\u00e5: <i>bara de system som kan beskrivas och observeras \u00e4r f\u00f6rem\u00e5l f\u00f6r automatisering och kontroll<\/i>.<\/p>\n<h3>GitOps \u00e4r avsett f\u00f6r hela cloud native-stacken (t.ex. Terraform osv.)<\/h3>\n<p>\nGitOps handlar inte bara om Kubernetes. Vi vill att hela systemet ska styras deklarativt och anv\u00e4nda konvergens. Med hela systemet menar vi en upps\u00e4ttning milj\u00f6er som arbetar med Kubernetes \u2013 till exempel 'dev cluster 1', 'produktion' osv. I varje milj\u00f6 ing\u00e5r maskiner, kluster, applikationer samt gr\u00e4nssnitt f\u00f6r externa tj\u00e4nster som tillhandah\u00e5ller data, \u00f6vervakning etc.<\/p>\n<p>Observera hur viktig Terraform \u00e4r f\u00f6r bootstrapping-problemet i detta fall. Kubernetes m\u00e5ste dras upp n\u00e5gonstans, och anv\u00e4ndningen av Terraform inneb\u00e4r att vi kan till\u00e4mpa samma GitOps-arbetsfl\u00f6den f\u00f6r att skapa ett kontrollskikt som ligger till grund f\u00f6r Kubernetes och applikationerna. Det \u00e4r en bra praxis.<\/p>\n<p>Stort fokus l\u00e4ggs p\u00e5 till\u00e4mpningen av GitOps-koncepten p\u00e5 lagren \u00f6ver Kubernetes. F\u00f6r n\u00e4rvarande finns det GitOps-l\u00f6sningar f\u00f6r Istio, Helm, Ksonnet, OpenFaaS och Kubeflow, samt t.ex. f\u00f6r Pulumi, som skapar ett lager f\u00f6r utveckling av applikationer under cloud native.<\/p>\n<h2>Kubernetes CI\/CD: J\u00e4mf\u00f6relse mellan GitOps och andra metoder<\/h2>\n<p>\nSom n\u00e4mnts \u00e4r GitOps tv\u00e5 saker:<\/p>\n<ol>\n<li> En driftsmodell f\u00f6r Kubernetes och cloud native, som beskrivits ovan.<\/li>\n<li> V\u00e4gen till att organisera en utvecklarorienterad milj\u00f6 f\u00f6r att hantera applikationer.<\/li>\n<\/ol>\n<p>\nF\u00f6r m\u00e5nga \u00e4r GitOps fr\u00e4mst ett arbetsfl\u00f6de baserat p\u00e5 Git-push. Det gillar vi ocks\u00e5. Men det \u00e4r inte allt: l\u00e5t oss nu titta p\u00e5 CI\/CD-pipelines.<\/p>\n<h3>GitOps s\u00e4kerst\u00e4ller kontinuerlig distribution (CD) f\u00f6r Kubernetes.<\/h3>\n<p>\nGitOps erbjuder en mekanism f\u00f6r kontinuerlig distribution, vilket eliminerar behovet av separata 'distributionshanteringssystem'. Allt arbete g\u00f6rs av Kubernetes.<\/p>\n<ul>\n<li> Uppdatering av en applikation kr\u00e4ver en uppdatering i Git. Det \u00e4r en transaktionell uppdatering till \u00f6nskat tillst\u00e5nd. 'Distributionen' sker sedan inom klustret av Kubernetes sj\u00e4lv baserat p\u00e5 den uppdaterade beskrivningen.<\/li>\n<li> P\u00e5 grund av Kubernetes specifika arbetsmetod \u00e4r dessa uppdateringar konvergerande. Detta s\u00e4kerst\u00e4ller en mekanism f\u00f6r kontinuerlig distribution d\u00e4r alla uppdateringar \u00e4r atom\u00e4ra.<\/li>\n<li> Anm\u00e4rkning: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> erbjuder en GitOps-operator som integrerar Git och Kubernetes och m\u00f6jligg\u00f6r CD genom att samordna det \u00f6nskade och aktuella tillst\u00e5ndet f\u00f6r klustret.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Utan kubectl och skript<\/h3>\n<p>\nDet \u00e4r b\u00e4st att undvika att anv\u00e4nda kubectl f\u00f6r att uppdatera klustret, s\u00e4rskilt skript f\u00f6r att gruppera kubectl-kommandon. Ist\u00e4llet kan anv\u00e4ndaren uppdatera sitt Kubernetes-kluster via Git med hj\u00e4lp av en GitOps-pipeline.<\/p>\n<p>F\u00f6rdelarna inkluderar:<\/p>\n<ol>\n<li> <b>Korrekthet<\/b>. En grupp uppdateringar kan till\u00e4mpas, konvergera och slutligen valideras, vilket f\u00f6r oss n\u00e4rmare m\u00e5let med atom\u00e4r distribution. \u00c5 andra sidan ger anv\u00e4ndning av skript inga garantier f\u00f6r konvergens (mer om detta nedan).<\/li>\n<li> <b>S\u00e4kerhet<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Citerar<\/a><\/noindex> Kelsey Hightower: \"Begr\u00e4nsa \u00e5tkomsten till Kubernetes-klustret till automatiseringsverktyg och administrat\u00f6rer vars uppgift \u00e4r att underh\u00e5lla eller fels\u00f6ka det.\" Se ocks\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">min publikations<\/a><\/noindex> om s\u00e4kerhet och efterlevnad av tekniska krav samt <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">artikeln om Homebrew-hack<\/a><\/noindex> genom att stj\u00e4la inloggningsuppgifter fr\u00e5n ett slarvigt skrivet Jenkins-skript.<\/li>\n<li> <b>Anv\u00e4ndarupplevelse<\/b>. Kubectl blottar mekaniken i Kubernetes objektmodell, vilken \u00e4r ganska komplex. Idealiskt sett b\u00f6r anv\u00e4ndare interagera med systemet p\u00e5 en h\u00f6gre abstraktionsniv\u00e5. H\u00e4r \u00e5terknyter jag till Kelsey och rekommenderar att titta p\u00e5 <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">denna sammanfattning<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Skillnaden mellan CI och CD<\/h3>\n<p>\nGitOps f\u00f6rb\u00e4ttrar befintliga CI\/CD-modeller.<\/p>\n<p>En modern CI-server \u00e4r ett verktyg f\u00f6r orkestrering. Specifikt \u00e4r det ett verktyg f\u00f6r orkestrering av CI-pipelines. Dessa inkluderar byggen, tester, sammanslagning till trunk, etc. CI-servrar automatiserar hanteringen av komplexa flerstegs-pipelines. En vanlig frestelse \u00e4r att skapa ett skript f\u00f6r att applicera uppdateringar p\u00e5 Kubernetes och k\u00f6ra det som en del av pipelinen f\u00f6r att pusha \u00e4ndringar till klustret. M\u00e5nga specialister g\u00f6r verkligen s\u00e5. Men det \u00e4r inte optimalt, och h\u00e4r \u00e4r varf\u00f6r.<\/p>\n<p>CI b\u00f6r anv\u00e4ndas f\u00f6r att g\u00f6ra uppdateringar i trunk, och Kubernetes-klustret b\u00f6r \u00e4ndra sig baserat p\u00e5 dessa uppdateringar f\u00f6r att hantera CD \"internt\". Vi kallar detta <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">en pull-modell f\u00f6r CD<\/a><\/noindex>, till skillnad fr\u00e5n CI push-modellen. CD \u00e4r en del av <i>runtime-orchestration<\/i>.<\/p>\n<h3>Varf\u00f6r CI-servrar inte b\u00f6r utf\u00f6ra CD genom direkta uppdateringar i Kubernetes<\/h3>\n<p>\n<i>Anv\u00e4nd inte CI-servern f\u00f6r att orkestrera direkta uppdateringar i Kubernetes som ett set av CI-jobb. Det \u00e4r ett anti-m\u00f6nster som vi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">redan har diskuterat<\/a><\/noindex> i v\u00e5r blogg.<\/i><\/p>\n<p>L\u00e5t oss \u00e5terv\u00e4nda till Alice och Bob.<\/p>\n<p>Vilka problem st\u00f6tte de p\u00e5? Bobs CI-server till\u00e4mpar \u00e4ndringar p\u00e5 klustret, men om den kraschar under processen kommer Bob inte att veta vilket tillst\u00e5nd klustret \u00e4r i (eller ska vara i) och hur det ska fixas. Detsamma g\u00e4ller om det g\u00e5r bra.<\/p>\n<p>L\u00e5t oss anta att Bobs team har byggt en ny bild och sedan patchat sina deployment f\u00f6r att distribuera bilden (allt detta fr\u00e5n CI-pipelinen).<\/p>\n<p>Om bilden byggs korrekt men pipelinen kraschar m\u00e5ste teamet ta reda p\u00e5:<\/p>\n<ul>\n<li> Distribuerades uppdateringen?<\/li>\n<li> K\u00f6r vi en ny byggnad? Kommer detta att leda till o\u00f6nskade bieffekter - med risken att f\u00e5 tv\u00e5 byggnader av samma of\u00f6r\u00e4ndrade bild? <\/li>\n<li> Ska vi v\u00e4nta p\u00e5 n\u00e4sta uppdatering innan vi k\u00f6r byggnaden?<\/li>\n<li> Vad gick egentligen fel? Vilka steg beh\u00f6ver upprepas (och vilka kan upprepas s\u00e4kert)?<\/li>\n<\/ul>\n<p>\n<i>Att organisera ett Git-baserat arbetsfl\u00f6de garanterar inte att Bobs team inte kommer att st\u00f6ta p\u00e5 dessa problem. De kan fortfarande g\u00f6ra fel med commit-push, tagg eller n\u00e5got annat parameter; men denna metod \u00e4r \u00e4nd\u00e5 mycket n\u00e4rmare ett tydligt allt-eller-inget.<\/i><\/p>\n<p>Sammanfattningsvis, h\u00e4r \u00e4r varf\u00f6r CI-servrar inte b\u00f6r syssla med CD:<\/p>\n<ul>\n<li> Uppdateringsskripten \u00e4r inte alltid deterministiska; det \u00e4r l\u00e4tt att g\u00f6ra misstag.<\/li>\n<li> CI-servrar konvergerar inte till en deklarativ modell av klustret.<\/li>\n<li> Det \u00e4r sv\u00e5rt att garantera idempotens. Anv\u00e4ndare m\u00e5ste f\u00f6rst\u00e5 den djupa semantiken i systemet.<\/li>\n<li> Det \u00e4r sv\u00e5rare att \u00e5terh\u00e4mta sig efter en partiell fel.<\/li>\n<\/ul>\n<p>\n<i>En anm\u00e4rkning om Helm: om du vill anv\u00e4nda Helm, rekommenderar vi att du kombinerar det med en GitOps-operator s\u00e5som <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>. Detta hj\u00e4lper till att s\u00e4kerst\u00e4lla konvergens. Helm i sig \u00e4r varken deterministiskt eller atom\u00e4rt.<\/i><\/p>\n<h2>GitOps som det b\u00e4sta s\u00e4ttet att genomf\u00f6ra Continuous Delivery f\u00f6r Kubernetes<\/h2>\n<p>\nAlices och Bobs team implementerar GitOps och uppt\u00e4cker att det blivit mycket enklare att arbeta med programvaruprodukter, uppr\u00e4tth\u00e5lla h\u00f6g prestanda och stabilitet. L\u00e5t oss avsluta denna artikel med illustrationer som visar hur deras nya tillv\u00e4gag\u00e5ngss\u00e4tt ser ut. Observera att vi fr\u00e4mst pratar om applikationer och tj\u00e4nster, men GitOps kan anv\u00e4ndas f\u00f6r att hantera hela plattformen.<\/p>\n<h3>Driftsmodell f\u00f6r Kubernetes<\/h3>\n<p>\nTitta p\u00e5 diagrammet nedan. Det representerar Git och en containerbilds lagring som gemensamma resurser f\u00f6r tv\u00e5 orkestrerade livscykler:<\/p>\n<ul>\n<li> En pipeline f\u00f6r kontinuerlig integration som l\u00e4ser och skriver filer till Git och kan uppdatera containerbildens repository.<\/li>\n<li> En Runtime GitOps-pipeline som kombinerar distribution med hantering och \u00f6vervakning. Den l\u00e4ser och skriver filer till Git och kan ladda upp containerbilder.<\/li>\n<\/ul>\n<h3>Vad \u00e4r de viktigaste slutsatserna?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>\u00c5tskillnad av problem<\/b>: Observera att b\u00e5da pipelinerna kan utbyta data genom att bara uppdatera Git eller bildrepositoryt. Med andra ord, det finns en brandv\u00e4gg mellan CI och runtime-milj\u00f6n. Vi kallar det \"immutathetsbrandv\u00e4ggen\" <i>(immutability firewall)<\/i>, eftersom alla uppdateringar av repositoryn skapar nya versioner. F\u00f6r mer information om detta \u00e4mne, v\u00e4nligen se sidorna 72-87. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">denna presentation.<\/a><\/noindex>.<\/li>\n<li> <b>Valfri CI- och Git-server kan anv\u00e4ndas<\/b>: GitOps fungerar med alla komponenter. Du kan forts\u00e4tta anv\u00e4nda dina favorit CI- och Git-servrar, bildrepositories och testupps\u00e4ttningar. N\u00e4stan alla andra verktyg f\u00f6r Continuous Delivery p\u00e5 marknaden kr\u00e4ver en egen CI-\/Git-server eller bildrepository. Detta kan bli en begr\u00e4nsning i utvecklingen av cloud native. I fallet GitOps kan du anv\u00e4nda v\u00e4lbekanta verktyg.<\/li>\n<li> <b>H\u00e4ndelser som integrationsverktyg<\/b>: N\u00e4r data i Git uppdateras, meddelar Weave Flux (eller Weave Cloud-operat\u00f6ren) runtime om detta. Varje g\u00e5ng Kubernetes tar emot en upps\u00e4ttning \u00e4ndringar, uppdateras Git. Detta ger en enkel integrationsmodell f\u00f6r att organisera arbetsfl\u00f6den f\u00f6r GitOps, som visas nedan.<\/li>\n<\/ol>\n<h2>Slutsats<\/h2>\n<p>\nGitOps ger viktiga garantier f\u00f6r uppdateringar som varje modern CI\/CD-verktyg beh\u00f6ver:<\/p>\n<ul>\n<li> automatisering;<\/li>\n<li> konvergens;<\/li>\n<li> idempotens;<\/li>\n<li> determinism.<\/li>\n<\/ul>\n<p>\nDet \u00e4r viktigt eftersom det erbjuder en driftsmodell f\u00f6r utvecklare inom cloud native.<\/p>\n<ul>\n<li> Traditionella verktyg f\u00f6r hantering och \u00f6vervakning av system \u00e4r kopplade till driftteam som agerar inom ramen f\u00f6r en runbook <i>(ett set av rutinprocedurer och operationer \u2014 anm. \u00f6vers.)<\/i>, kopplad till en specifik deployment.<\/li>\n<li> Inom hantering av cloud native-system \u00e4r \u00f6vervakningsverktygen det b\u00e4sta s\u00e4ttet att utv\u00e4rdera resultatet av deployment, s\u00e5 att utvecklarteamet kan reagera snabbt.<\/li>\n<\/ul>\n<p>\nF\u00f6rest\u00e4ll dig m\u00e5nga kluster spridda \u00f6ver olika moln och m\u00e5nga tj\u00e4nster med sina egna team och deploymentplaner. GitOps erbjuder en skalenlig och of\u00f6r\u00e4ndrad modell f\u00f6r att hantera denna \u00f6verfl\u00f6d.<\/p>\n<h2>P.S. fr\u00e5n \u00f6vers\u00e4ttaren<\/h2>\n<p>\nL\u00e4s \u00e4ven i v\u00e5r blogg:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: J\u00e4mf\u00f6relse mellan Pull och Push-metoder<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Vi presenterar biblioteket kubedog f\u00f6r att \u00f6vervaka Kubernetes-resurser<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Ut\u00f6kar och kompletterar Kubernetes (\u00f6versikt och videof\u00f6rel\u00e4sning)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Endast registrerade anv\u00e4ndare kan delta i omr\u00f6stningen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logga in<\/a><\/noindex>, tack.<\/p>\n<h2 class=\"default-block__polling-title\">Visste du om GitOps innan dessa tv\u00e5 \u00f6vers\u00e4ttningar p\u00e5 Habr\u00e9?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja, jag visste det.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Bara ytligt.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ingen<\/p>\n<\/li>\n<\/ul>\n<p>    35 anv\u00e4ndare r\u00f6stade. 10 anv\u00e4ndare avstod.<br \/>\n<br \/>K\u00e4lla: <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 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\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\/sv\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/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\udd47Vad \u00e4r GitOps? | ProHoster","description":"Ex.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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.","og:url":"https:\/\/prohoster.info\/sv\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}