{"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\/no\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"Hva er GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Obs. overs.<\/b>: Etter den nylige publikasjonen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">av materialet<\/a><\/noindex> om pull- og push-metodene i GitOps, har vi sett interesse for denne modellen som helhet, men det er sv\u00e6rt f\u00e5 publikasjoner om dette p\u00e5 russisk (de finnes rett og slett ikke p\u00e5 Habr). Derfor er vi glade for \u00e5 tilby dere oversettelsen av en annen artikkel \u2013 selv om den er nesten ett \u00e5r gammel! \u2013 fra selskapet Weaveworks, som er kjent for \u00e5 ha funnet opp termen \u00abGitOps\u00bb. I teksten forklares kjernen i tiln\u00e6rmingen og de viktigste forskjellene fra allerede eksisterende.<\/i><\/p>\n<p>\nFor ett \u00e5r siden publiserte vi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">en introduksjon til GitOps<\/a><\/noindex>. Den gang fortalte vi hvordan Weaveworks-teamet lanserte en SaaS fullstendig basert p\u00e5 Kubernetes, og utviklet et sett med foreskrivende beste praksiser for distribusjon, styring og overv\u00e5king i et cloud native-milj\u00f8.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Artikkelen viste seg \u00e5 v\u00e6re popul\u00e6r. Andre begynte \u00e5 snakke om GitOps og publiserte nye verkt\u00f8y for <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\">utvikling<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">av hemmeligheter<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">funksjoner<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">kontinuerlig integrasjon<\/a><\/noindex> osv. P\u00e5 nettstedet v\u00e5rt dukket det opp <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">et stort antall<\/a><\/noindex> publikasjoner og bruksomr\u00e5der for GitOps. Men noen mennesker hadde fortsatt sp\u00f8rsm\u00e5l. Hva skiller modellen fra tradisjonell <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> og kontinuerlig levering (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">continuous delivery<\/a><\/noindex>)? Er det n\u00f8dvendig \u00e5 bruke Kubernetes?<\/p>\n<p>Snart inns\u00e5 vi at et nytt beskrivende dokument var n\u00f8dvendig, som tilb\u00f8d:<\/p>\n<ol>\n<li> Et stort antall eksempler og historier;<\/li>\n<li> En konkret definisjon av GitOps;<\/li>\n<li> Sammenligning med tradisjonell kontinuerlig levering.<\/li>\n<\/ol>\n<p>\nI denne artikkelen har vi pr\u00f8vd \u00e5 dekke alle disse temaene. Du vil finne en oppdatert introduksjon til GitOps og et perspektiv p\u00e5 det fra utviklerne og CI\/CD. Vi fokuserer hovedsakelig p\u00e5 Kubernetes, selv om modellen kan generaliseres.<\/p>\n<h2>M\u00f8t: GitOps<\/h2>\n<p>\nTenk deg Alice. Hun driver selskapet Family Insurance, som tilbyr helse-, bil-, eiendom- og reiseforsikring til folk som er for opptatt til \u00e5 h\u00e5ndtere detaljene i kontraktene selv. Forretningen hennes begynte som et sideprosjekt da Alice jobbet i banken som data scientist. En dag inns\u00e5 hun at hun kunne bruke avanserte datamaskinalgoritmer for mer effektiv datanalyse og tilpasning av forsikringspakker. Investorer finansierte prosjektet, og n\u00e5 genererer selskapet hennes over 20 millioner dollar \u00e5rlig og vokser raskt. Per n\u00e5 arbeider 180 personer i ulike stillinger i selskapet. Blant dem er det et teknologiteam som driver utviklingen, vedlikeholdet av nettstedet, databasen, og analyserer kundegrunnlaget. Teamet p\u00e5 60 personer ledes av Bob \u2013 selskapets tekniske direkt\u00f8r.<\/p>\n<p>Bobs team distribuerer produksjonssystemer i skyen. Deres hovedapplikasjoner kj\u00f8rer p\u00e5 GKE, og drar nytte av Kubernetes i Google Cloud. I tillegg benytter de seg av ulike verkt\u00f8y for databehandling og analyse.<\/p>\n<p>Familieforsikring hadde ikke tenkt \u00e5 bruke containere, men ble smittet av entusiasmen rundt Docker. Snart oppdaget selskapets spesialister at GKE gj\u00f8r det enkelt og uanstrengt \u00e5 rulle ut klynger for testing av nye funksjoner. Jenkins ble lagt til for CI, og Quay for organisering av containerregisteret, og skripter ble skrevet for Jenkins som pusher nye containere og konfigurasjoner til GKE.<\/p>\n<p>Det gikk en tid. Alice og Bob ble skuffet over ytelsen til den valgte tiln\u00e6rmingen og dens innvirkning p\u00e5 forretningen. Innf\u00f8ringen av containere hadde ikke forbedret ytelsen s\u00e5 mye som teamet hadde h\u00e5pet. Noen ganger feilet deploymentene, og det var uklart om endringer i koden var \u00e5rsaken. Det viste seg ogs\u00e5 \u00e5 v\u00e6re vanskelig \u00e5 spore endringer i konfigurasjoner. De m\u00e5tte ofte opprette en ny klynge og flytte applikasjoner dit, fordi det var enklest \u00e5 rydde opp i rotet systemet hadde blitt. Alice fryktet at situasjonen ville forverres etter hvert som applikasjonen utviklet seg (i tillegg var det et nytt prosjekt basert p\u00e5 maskinl\u00e6ring i emning). Bob automatiserte mesteparten av arbeidet og kunne ikke forst\u00e5 hvorfor pamplinen fortsatt var ustabil, vanskelig \u00e5 skalere og tidvis krevde manuell inngripen.<\/p>\n<p><b>S\u00e5 l\u00e6rte de om GitOps. Denne l\u00f8sningen viste seg \u00e5 v\u00e6re akkurat det de trengte for \u00e5 bevege seg trygt fremover.<\/b><\/p>\n<p>Alice og Bob hadde h\u00f8rt om Git-baserte arbeidsprosesser, DevOps og infrastruktur som kode i flere \u00e5r. Det unike med GitOps er at det bringer inn en rekke beste praksiser - kategoriske og normative - for implementering av disse ideene i konteksten av Kubernetes. Dette temaet <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">har blitt tatt opp flere ganger<\/a><\/noindex>, inkludert i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">Weaveworks bloggen<\/a><\/noindex>.<\/p>\n<p>Family Insurance bestemmer seg for \u00e5 implementere GitOps. N\u00e5 har selskapet en automatisert driftsmodell som er kompatibel med Kubernetes og kombinerer <i>hastighet<\/i> med <i>stabilitet<\/i>, ettersom de:<\/p>\n<ul>\n<li> har oppdaget at teamets produktivitet har doblet seg, og ingen g\u00e5r fra vettet;<\/li>\n<li> har sluttet \u00e5 vedlikeholde skriptene. I stedet kan de n\u00e5 fokusere p\u00e5 nye funksjoner og forbedre ingeni\u00f8rmetodene - for eksempel implementere kanarifugler og forbedre testing;<\/li>\n<li> har forbedret distribusjonsprosessen - n\u00e5 krasjer den sjelden;<\/li>\n<li> fikk muligheten til \u00e5 gjenopprette deploymentene etter delvise feil uten manuell inngripen;<\/li>\n<li> har f\u00e5tt<i>om<\/i>st\u00f8rre tillit til leveringssystemene. Alice og Bob oppdaget at de kunne dele teamet opp i grupper som jobbet med mikrotjenester parallelt;<\/li>\n<li> kan n\u00e5 gj\u00f8re 30-50 endringer i prosjektet hver dag takket v\u00e6re innsatsen fra hver gruppe og pr\u00f8ve ut nye teknikker;<\/li>\n<li> enkelt tiltrekker nye utviklere til prosjektet, som har muligheten til \u00e5 rulle ut oppdateringer til produksjon ved hjelp av pull requests allerede innen noen timer;<\/li>\n<li> lett \u00e5 best\u00e5 revisjon i henhold til SOC2 <i>(for \u00e5 oppfylle kravene til tjenesteleverand\u00f8rer for sikker datastyring; les mer for eksempel <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">her<\/a><\/noindex> \u2013 obs. overs.)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Hva skjedde?<\/h3>\n<p>\nGitOps - dette er to ting:<\/p>\n<ol>\n<li> En driftsmodell for Kubernetes og cloud native. Den gir et sett med beste praksiser for distribusjon, styring og overv\u00e5king av containere og applikasjoner. En elegant definisjon i form av <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">ett lysbilde<\/a><\/noindex> fra <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> Veien til \u00e5 skape et utviklerorientert milj\u00f8 for applikasjonsstyring. Vi bruker arbeidsflyten Git b\u00e5de til drift og utvikling. Merk at dette ikke bare handler om Git push, men om organisering av hele settet med CI\/CD og UI\/UX-verkt\u00f8y.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Noen ord om Git<\/h3>\n<p>\nHvis du ikke er kjent med versjonskontrollsystemer og Git-basert arbeidsflyt, anbefaler vi p\u00e5 det sterkeste \u00e5 bli kjent med dem. I starten kan arbeid med grener og pull requests virke som svart magi, men fordelene er verdt innsatsen. Her er <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">god artikkel<\/a><\/noindex> er for \u00e5 begynne.<\/p>\n<h2>Hvordan fungerer Kubernetes<\/h2>\n<p>\nI v\u00e5r historie henvendte Alice og Bob seg til GitOps, etter \u00e5 ha jobbet en stund med Kubernetes. Faktisk er GitOps n\u00e6rt knyttet til Kubernetes - det er en driftsmodell for infrastruktur og applikasjoner basert p\u00e5 Kubernetes.<\/p>\n<h3>Hva gir Kubernetes brukerne?<\/h3>\n<p>\nHer er noen av de viktigste funksjonene:<\/p>\n<ol>\n<li> I Kubernetes-modellen kan alt beskrives i deklarativ form.<\/li>\n<li> Kubernetes API-server aksepterer slike erkl\u00e6ringer som innspill og pr\u00f8ver deretter kontinuerlig \u00e5 bringe klyngen i den tilstanden som er beskrevet i erkl\u00e6ringen.<\/li>\n<li> Erkl\u00e6ringene er tilstrekkelige for \u00e5 beskrive og h\u00e5ndtere et bredt spekter av arbeidsbelastninger - \"applikasjoner\".<\/li>\n<li> Som et resultat skjer endringer i applikasjonen og klyngen p\u00e5 grunn av:\n<ul>\n<li> endringer i containerbilder;<\/li>\n<li> endringer i den deklarative spesifikasjonen;<\/li>\n<li> feil i milj\u00f8et - for eksempel containerkrasj.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Kubernetes sin fantastiske evne til konvergens<\/h3>\n<p>\nN\u00e5r en administrator gj\u00f8r endringer i konfigurasjonen, vil Kubernetes-orkestratoren anvende dem p\u00e5 klyngen inntil tilstanden <i>n\u00e6rmer seg den nye konfigurasjonen<\/i>. Denne modellen fungerer for enhver Kubernetes-ressurs og kan utvides med Custom Resource Definitions (CRDs). Derfor har Kubernetes-deploymentene f\u00f8lgende fantastiske egenskaper:<\/p>\n<ul>\n<li> <b>Automatisering<\/b>: Kubernetes-oppdateringer gir en mekanisme for \u00e5 automatisere prosessen med \u00e5 implementere endringer p\u00e5 en korrekt og tidsriktig m\u00e5te.<\/li>\n<li> <b>Konvergens<\/b>: Kubernetes vil fortsette \u00e5 fors\u00f8ke oppdateringer til det lykkes.<\/li>\n<li> <b>Idempotens<\/b>: Gjentatte anvendelser av konvergens gir det samme resultatet.<\/li>\n<li> <b>Determinisme<\/b>: N\u00e5r ressursene er tilstrekkelige, avhenger tilstanden til den oppdaterte klyngen kun av den \u00f8nskede tilstanden.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hvordan GitOps fungerer<\/h2>\n<p>\nVi har l\u00e6rt nok om Kubernetes til \u00e5 forklare prinsippene bak GitOps.<\/p>\n<p>La oss se tilbake p\u00e5 Family Insurance-teamene og hva de vanligvis jobber med. Se listen nedenfor (hvis noen punkter virker merkelige eller ukjente, vennligst vent med kritikk og bli med oss). Dette er bare eksempler p\u00e5 arbeidsflyter basert p\u00e5 Jenkins. Det finnes mange andre prosesser som involverer forskjellige verkt\u00f8y.<\/p>\n<p>Hovedpoenget er at vi ser at hver oppdatering ender med endringer i konfigurasjonsfiler og Git-repositories. Disse endringene i Git f\u00e5r \"GitOps-operat\u00f8ren\" til \u00e5 oppdatere klyngen:<\/p>\n<p>1. Arbeidsflyt: \"<i>Jenkins-bygge \u2013 master-grenen<\/i>\u00bb.<br \/>\nOppgaveliste:<\/p>\n<ul>\n<li> Jenkins pusher taggede bilder til Quay;<\/li>\n<li> Jenkins pusher konfigurering og Helm-diagrammer til master-lagringsb\u00f8tta;<\/li>\n<li> En skyfunksjon kopierer konfigurasjonen og diagrammene fra master-lagringsb\u00f8tta til Git-repositoriet master;<\/li>\n<li> GitOps-operat\u00f8ren oppdaterer klyngen.<\/li>\n<\/ul>\n<p>\n2. <i>Jenkins-bygge \u2013 release- eller hotfix-grenen<\/i>:<\/p>\n<ul>\n<li> Jenkins pusher utaggede bilder til Quay;<\/li>\n<li> Jenkins pusher konfigurering og Helm-diagrammer til staging-lagringsb\u00f8tta;<\/li>\n<li> En skyfunksjon kopierer konfigurasjonen og diagrammene fra staging-lagringsb\u00f8tta til Git-repositoriet staging;<\/li>\n<li> GitOps-operat\u00f8ren oppdaterer klyngen.<\/li>\n<\/ul>\n<p>\n3. <i>Jenkins-bygge \u2013 develop- eller feature-grenen<\/i>:<\/p>\n<ul>\n<li> Jenkins pusher utaggede bilder til Quay;<\/li>\n<li> Jenkins pusher konfigurering og Helm-diagrammer til develop-lagringsb\u00f8tta;<\/li>\n<li> En skyfunksjon kopierer konfigurasjonen og diagrammene fra develop-lagringsb\u00f8tta til Git-repositoriet develop;<\/li>\n<li>GitOps-operat\u00f8ren oppdaterer klyngen.<\/li>\n<\/ul>\n<p>\n4. <i>Legg til ny klient<\/i>:<\/p>\n<ul>\n<li> Manager eller administrator (LCM\/ops) kaller Gradle for den f\u00f8rste distribusjonen og konfigurerer nettverkslastbalanserere (NLB);<\/li>\n<li> LCM\/ops committer ny konfigurasjon for \u00e5 forberede deploymentet til oppdateringer;<\/li>\n<li> GitOps-operat\u00f8ren oppdaterer klyngen.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kort beskrivelse av GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Beskriv \u00f8nsket tilstand for hele systemet ved hjelp av deklarative spesifikasjoner for hvert milj\u00f8 (i v\u00e5r historie definerer Bobs team hele systemkonfigurasjonen i Git).\n<ul>\n<li> Git-repositoriet er den eneste sannhetskilden for \u00f8nsket tilstand for hele systemet.<\/li>\n<li> Alle endringer til \u00f8nsket tilstand gj\u00f8res ved \u00e5 commite til Git.<\/li>\n<li> Alle \u00f8nskede parametere for klyngen er ogs\u00e5 observerbare i selve klyngen. Dermed kan vi avgj\u00f8re om de \u00f8nskede og observerte tilstandene er like (konvergerer, <i>converge<\/i>) eller forskjellige (divergerer, <i>diverge<\/i>) tilstandene.<\/li>\n<\/ul>\n<\/li>\n<li> Hvis den \u00f8nskede og observerte tilstanden er forskjellige, s\u00e5:\n<ul>\n<li> Det finnes en konvergensmekanisme som tidlig eller sent automatisk synchroniserer den m\u00e5lrettede og observerte tilstanden. Inne i klyngen h\u00e5ndteres dette av Kubernetes.<\/li>\n<li> Prosessen startes umiddelbart med varslingen \"change committed\".<\/li>\n<li> Etter en viss konfigurerbar tidsperiode kan det sendes et varsel \"diff\" dersom tilstandene er forskjellige.<\/li>\n<\/ul>\n<\/li>\n<li> Dermed medf\u00f8rer alle commits i Git verifiserbare og idempotente oppdateringer i klyngen.\n<ul>\n<li>Rull tilbake \u2014 det er en konvergens til en tidligere \u00f8nsket tilstand.<\/li>\n<\/ul>\n<\/li>\n<li> Konvergensen er endelig. Dens oppn\u00e5else bekreftes av:\n<ul>\n<li> Ingen varsler \"diff\" i l\u00f8pet av en viss tidsperiode.<\/li>\n<li> Varsel \"converged\" (for eksempel webhook, Git writeback-hendelse).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Hva er divergens?<\/h3>\n<p>\nLa oss gjenta det: <i>alle \u00f8nskede egenskaper ved klyngen m\u00e5 v\u00e6re observerbare i selve klyngen.<\/i>.<\/p>\n<p>Noen eksempler p\u00e5 divergens:<\/p>\n<ul>\n<li> Endring i konfigurasjonsfilen p\u00e5 grunn av sammensl\u00e5ing av grener i Git.<\/li>\n<li> Endring i konfigurasjonsfilen p\u00e5 grunn av et commit i Git utf\u00f8rt av en GUI-klient.<\/li>\n<li> Flere endringer i \u00f8nsket tilstand p\u00e5 grunn av PR i Git etterfulgt av bygging av containerbilde og endringer i konfigurasjonen.<\/li>\n<li> Endring av klyngets tilstand p\u00e5 grunn av feil, ressurskonflikter som f\u00f8rer til \"d\u00e5rlig oppf\u00f8rsel\", eller bare tilfeldig avvik fra originaltilstanden.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Hva er en konvergensmekanisme?<\/h3>\n<p>\nNoen eksempler:<\/p>\n<ul>\n<li> For containere og klynger gir konvergensmekanismen Kubernetes.<\/li>\n<li> Den samme mekanismen kan brukes til \u00e5 administrere applikasjoner og konstruksjoner basert p\u00e5 Kubernetes (for eksempel Istio og Kubeflow).<\/li>\n<li> Mekanismen for \u00e5 h\u00e5ndtere arbeidsinteraksjonen mellom Kubernetes, bilde-repositorier og Git gir <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">GitOps-operat\u00f8ren Weave Flux<\/a><\/noindex>, som er en del av <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> For grunnleggende maskiner m\u00e5 konvergensmekanismen v\u00e6re deklarativ og autonom. Etter v\u00e5r erfaring kan vi si at <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> er n\u00e6rmest denne definisjonen, men krever likevel menneskelig kontroll. I denne forstand utvider GitOps tradisjonene til Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps kombinerer Git med den utmerkede konvergensmekanismen til Kubernetes, og tilbyr en modell for drift.<\/p>\n<p>GitOps lar oss hevde: <i>bare de systemene som kan beskrives og overv\u00e5kes, kan automatiseres og kontrolleres<\/i>.<\/p>\n<h3>GitOps er ment for hele cloud native-stakken (for eksempel Terraform osv.)<\/h3>\n<p>\nGitOps er ikke bare Kubernetes. Vi \u00f8nsker at hele systemet skal styres deklarativt og bruke konvergens. Med hele systemet mener vi et sett med milj\u00f8er som jobber med Kubernetes \u2014 for eksempel \u00abdev cluster 1\u00bb, \u00abproduksjon\u00bb osv. Hvert milj\u00f8 inkluderer maskiner, klynger, applikasjoner, samt grensesnitt for eksterne tjenester som tilbyr data, overv\u00e5king osv.<\/p>\n<p>Merk hvor viktig Terraform er for bootstrapping-problematikken. Kubernetes m\u00e5 v\u00e6re implementert et sted, og bruk av Terraform betyr at vi kan bruke de samme GitOps-arbeidsprosessene for \u00e5 opprette lagdannelsen som ligger til grunn for Kubernetes og applikasjonene. Dette er en nyttig beste praksis.<\/p>\n<p>Det legges stor vekt p\u00e5 \u00e5 anvende GitOps-konsepter p\u00e5 lag over Kubernetes. Det finnes n\u00e5 GitOps-l\u00f8sninger for Istio, Helm, Ksonnet, OpenFaaS og Kubeflow, samt for eksempel Pulumi, som skaper et lag for utvikling av applikasjoner for cloud native.<\/p>\n<h2>Kubernetes CI\/CD: sammenligning av GitOps med andre tiln\u00e6rminger<\/h2>\n<p>\nSom nevnt er GitOps to ting:<\/p>\n<ol>\n<li> En driftsmodell for Kubernetes og cloud native, beskrevet ovenfor.<\/li>\n<li> Veien til \u00e5 organisere et utviklingsorientert milj\u00f8 for applikasjonsadministrasjon.<\/li>\n<\/ol>\n<p>\nFor mange er GitOps f\u00f8rst og fremst en arbeidsprosess basert p\u00e5 Git-push. Det liker vi ogs\u00e5. Men det er ikke alt: la oss n\u00e5 se p\u00e5 CI\/CD-pipelines.<\/p>\n<h3>GitOps muliggj\u00f8r kontinuerlig distribusjon (CD) under Kubernetes<\/h3>\n<p>\nGitOps tilbyr en mekanisme for kontinuerlig distribusjon som eliminerer behovet for separate \u00abdistribusjonstyringssystemer\u00bb. Alt arbeidet utf\u00f8res for deg av Kubernetes.<\/p>\n<ul>\n<li> Oppdatering av applikasjonen krever en oppdatering i Git. Dette er en transaksjonell oppdatering til \u00f8nsket tilstand. \"Distribusjonen\" skjer deretter innenfor klyngen av Kubernetes selv, basert p\u00e5 den oppdaterte beskrivelsen.<\/li>\n<li> P\u00e5 grunn av spesifikken i Kubernetes fungerer disse oppdateringene konvergerende. Dette sikrer en mekanisme for kontinuerlig distribusjon, hvor alle oppdateringer er atom\u00e6re.<\/li>\n<li> Merk: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> tilbyr en GitOps-operator som integrerer Git og Kubernetes og gj\u00f8r det mulig \u00e5 utf\u00f8re CD ved \u00e5 balansere \u00f8nsket og n\u00e5v\u00e6rende tilstand av klyngen.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Uten kubectl og skript<\/h3>\n<p>\nB\u00f8r man unng\u00e5 \u00e5 bruke Kubectl for \u00e5 oppdatere klyngen, spesielt skript for \u00e5 gruppere kubectl-kommandoer. I stedet kan brukeren oppdatere sin Kubernetes-klynge via Git ved hjelp av en GitOps-pipeline.<\/p>\n<p>Fordelene inkluderer:<\/p>\n<ol>\n<li> <b>Korrektheten<\/b>. En gruppe oppdateringer kan anvendes, konvergeres og til slutt valideres, som bringer oss n\u00e6rmere m\u00e5let om atom\u00e6r distribusjon. I motsetning til det gir bruken av skript ingen garantier for konvergens (mer om dette nedenfor).<\/li>\n<li> <b>Tryggleik<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Siterer<\/a><\/noindex> Kelsey Hightower: \u00abBegrens tilgangen til Kubernetes-klyngen for automatiseringsverkt\u00f8y og administratorer som er ansvarlige for debugging eller opprettholdelse av drift.\u00bb Se ogs\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">mitt innlegg<\/a><\/noindex> om sikkerhet og overholdelse av tekniske spesifikasjoner, samt <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">artikkelen om hacking av Homebrew<\/a><\/noindex> ved \u00e5 stjele legitimasjon fra en uaktsomt skrevet Jenkins-skript.<\/li>\n<li> <b>Brukeropplevelse<\/b>. Kubectl avdekker mekanikken i Kubernetes' objektmodell, som er ganske kompleks. Ideelt sett b\u00f8r brukere interagere med systemet p\u00e5 et h\u00f8yere niv\u00e5 av abstraksjon. Her igjen vil jeg referere til Kelsey og anbefale \u00e5 se p\u00e5 <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">dette sammendraget<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Forskjellen mellom CI og CD<\/h3>\n<p>\nGitOps forbedrer eksisterende CI\/CD-modeller.<\/p>\n<p>Moderne CI-servere er verkt\u00f8y for orkestrering. Spesielt er det verkt\u00f8y for orkestrering av CI-pipelines. De inkluderer bygging, testing, sammensl\u00e5ing til trunk, osv. CI-servere automatiserer h\u00e5ndteringen av komplekse flerstegs pipelines. Et vanlig fristelse er \u00e5 lage et skript for \u00e5 oppdatere Kubernetes og kj\u00f8re det som et element i pipelinen for push av endringer til klyngen. Faktisk gj\u00f8r mange spesialister dette. Imidlertid er dette suboptimalt, og her er hvorfor.<\/p>\n<p>CI b\u00f8r brukes til \u00e5 oppdatere trunk, og Kubernetes-klyngen skal endre seg basert p\u00e5 disse oppdateringene for \u00e5 h\u00e5ndtere CD \u00abinternt\u00bb. Vi kaller dette <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">et pull-modell for CD<\/a><\/noindex>, i motsetning til CI push-modellen. CD er en del av <i>runtime-orchestrasjon<\/i>.<\/p>\n<h3>Hvorfor CI-servere ikke skal utf\u00f8re CD gjennom direkte oppdateringer til Kubernetes<\/h3>\n<p>\n<i>Ikke bruk CI-servere til \u00e5 orkestrere direkte oppdateringer til Kubernetes som et sett med CI-oppgaver. Dette er et antipattern, som vi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">allerede har diskutert<\/a><\/noindex> p\u00e5 bloggen v\u00e5r.<\/i><\/p>\n<p>La oss g\u00e5 tilbake til Alice og Bob.<\/p>\n<p>Hvilke problemer m\u00f8tte de? Bobs CI-server anvender endringer til klyngen, men hvis den feiler under prosessen, vet ikke Bob hvilken tilstand klyngen er i (eller b\u00f8r v\u00e6re i) og hvordan han kan fikse det. Det samme gjelder ved suksess.<\/p>\n<p>La oss anta at Bobs team har bygget et nytt bilde og deretter oppdatert sine distribusjoner for \u00e5 implementere bildet (alt dette fra CI-pipelinen).<\/p>\n<p>Hvis bildet bygges korrekt, men pipeline feiler, m\u00e5 teamet finne ut:<\/p>\n<ul>\n<li> Ble oppdateringen distribuert?<\/li>\n<li> Kj\u00f8rer vi en ny bygg? Vil dette f\u00f8re til un\u00f8dvendige bivirkninger \u2014 med mulighet for \u00e5 f\u00e5 to bygg av samme uendrede bilde? <\/li>\n<li> B\u00f8r vi vente p\u00e5 den neste oppdateringen f\u00f8r vi kj\u00f8rer en bygg?<\/li>\n<li> Hva gikk egentlig galt? Hvilke trinn m\u00e5 gjentas (og hvilke kan trygt gjentas)?<\/li>\n<\/ul>\n<p>\n<i>\u00c5 organisere en Git-basert arbeidsprosess garanterer ikke at Bobs team ikke vil m\u00f8te disse problemene. De kan fortsatt gj\u00f8re feil med push av commits, med tagger eller en annen parameter; men denne tiln\u00e6rmingen er fortsatt mye n\u00e6rmere en eksplisitt alt-eller-ingenting.<\/i><\/p>\n<p>Oppsummert, her er grunnen til at CI-servere ikke skal h\u00e5ndtere CD:<\/p>\n<ul>\n<li> Oppdateringsskripter er ikke alltid deterministiske; det er lett \u00e5 gj\u00f8re feil med dem.<\/li>\n<li> CI-servere konvergerer ikke til en deklarativ klynge-modell.<\/li>\n<li> Det er vanskelig \u00e5 garantere idempotens. Brukere m\u00e5 forst\u00e5 den dype semantikken i systemet.<\/li>\n<li> Det er mer komplisert \u00e5 gjenopprette etter en delvis feil.<\/li>\n<\/ul>\n<p>\n<i>Merk om Helm: hvis du \u00f8nsker \u00e5 bruke Helm, anbefaler vi \u00e5 kombinere det med en GitOps-operator som <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>. Dette vil bidra til \u00e5 sikre konvergens. Helm alene er verken deterministisk eller atomisk.<\/i><\/p>\n<h2>GitOps som den beste m\u00e5ten \u00e5 implementere Continuous Delivery for Kubernetes<\/h2>\n<p>\nAlice og Bob implementerer GitOps og oppdager at det har blitt mye lettere \u00e5 jobbe med programvareprodukter, samtidig som de opprettholder h\u00f8y ytelse og stabilitet. La oss avslutte denne artikkelen med illustrasjoner som viser hvordan deres nye tiln\u00e6rming ser ut. Merk at vi stort sett snakker om applikasjoner og tjenester, men GitOps kan brukes til \u00e5 administrere hele plattformen.<\/p>\n<h3>Driftsmodell for Kubernetes<\/h3>\n<p>\nSe p\u00e5 det f\u00f8lgende diagrammet. Det representerer Git og container image-lager som felles ressurser for to orkestrerte livssykluser:<\/p>\n<ul>\n<li> Pipelinen for kontinuerlig integrasjon som leser og skriver filer til Git og kan oppdatere lagret for containerbilder.<\/li>\n<li> Runtime GitOps-pipelinen, som kombinerer distribusjon med administrasjon og overv\u00e5king. Den leser og skriver filer til Git og kan laste opp containerbilder.<\/li>\n<\/ul>\n<h3>Hva er de viktigste konklusjonene?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Deling av problemer<\/b>: Merk at begge pipeliner kan utveksle data ved kun \u00e5 oppdatere Git eller containerbildelageret. Med andre ord, det finnes en brannmur mellom CI og runtime-milj\u00f8et. Vi kaller det 'immutability firewall' <i>(immutability firewall)<\/i>, fordi alle oppdateringer av lagre skaper nye versjoner. For mer informasjon om emnet, se lysbildene 72-87. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">denne presentasjonen<\/a><\/noindex>.<\/li>\n<li> <b>Du kan bruke hvilken som helst CI- og Git-server<\/b>: GitOps fungerer med alle komponenter. Du kan fortsette \u00e5 bruke dine foretrukne CI- og Git-servere, containerbildelagre og testsett. Nesten alle andre verkt\u00f8y for Continuous Delivery p\u00e5 markedet krever sin egen CI\/Git-server eller image-lager. Dette kan bli en begrensende faktor for utviklingen av cloud native. Med GitOps kan du bruke de verkt\u00f8yene du allerede er vant til.<\/li>\n<li> <b>Hendelser som integrasjonsverkt\u00f8y<\/b>: S\u00e5 snart data i Git oppdateres, varsler Weave Flux (eller Weave Cloud-operat\u00f8ren) om dette til runtime. Hver gang Kubernetes mottar et sett med endringer, oppdateres Git. Dette gir en enkel integrasjonsmodell for \u00e5 organisere arbeidsflyter for GitOps, som vist nedenfor.<\/li>\n<\/ol>\n<h2>Konklusjon<\/h2>\n<p>\nGitOps gir sterke garantier for oppdateringene som er n\u00f8dvendige for ethvert moderne CI\/CD-verkt\u00f8y:<\/p>\n<ul>\n<li> automatisering;<\/li>\n<li> konvergering;<\/li>\n<li> idempotens;<\/li>\n<li> determinisme.<\/li>\n<\/ul>\n<p>\nDette er viktig, fordi det tilbyr en driftsmodell for utviklere innen cloud native.<\/p>\n<ul>\n<li> Tradisjonelle verkt\u00f8y for administrasjon og overv\u00e5king av systemer er knyttet til driftsteam som opererer innenfor et runbook <i>(sett med rutineprosedyrer og operasjoner \u2014 anm. oversetter.)<\/i>, knyttet til et spesifikt deployment.<\/li>\n<li> I administrasjonen av cloud native-systemer er overv\u00e5kingsverkt\u00f8y det beste middelet for \u00e5 evaluere resultatene av deployeringene, slik at utviklerteamet raskt kan reagere p\u00e5 dem.<\/li>\n<\/ul>\n<p>\nTenk deg mange klynger spredt over forskjellige skyer og mange tjenester med sine egne team og deployeringsplaner. GitOps tilbyr en skalerbar og invariant modell for \u00e5 administrere all denne overfloden.<\/p>\n<h2>P.S. from the translator<\/h2>\n<p>\nAlso read in our blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: sammenligning av Pull- og Push-metoder<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Vi presenterer kubedog-biblioteket for overv\u00e5kning av Kubernetes-ressurser<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Utvider og supplere Kubernetes (oversikt og video av foredraget)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Kun registrerte brukere kan delta i unders\u00f8kelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logg inn<\/a><\/noindex>, v\u00e6r s\u00e5 snill.<\/p>\n<h2 class=\"default-block__polling-title\">Visste du om GitOps f\u00f8r disse to oversettelsene p\u00e5 Habr?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja, jeg visste alt.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Bare overfladisk.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nei<\/p>\n<\/li>\n<\/ul>\n<p>    35 brukere stemte. 10 brukere avholdt seg.<br \/>\n<br \/>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Hva er egentlig GitOps? | ProHoster","description":"Note.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}