{"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\/da\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"Hvad er GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Bem. overs.<\/b>: Efter den seneste offentligg\u00f8relse <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">materiale<\/a><\/noindex> om pull- og push-metoder i GitOps har vi set en interesse for denne model generelt, men der har vist sig at v\u00e6re meget f\u00e5 russisktalende publikationer om emnet (der er simpelthen ingen p\u00e5 Habr). Derfor er vi glade for at kunne tilbyde en overs\u00e6ttelse af en anden artikel - selvom den er n\u00e6sten et \u00e5r gammel! - fra Weaveworks, hvis leder opfandt termen 'GitOps'. Teksten forklarer essensen af tilgangen og de v\u00e6sentlige forskelle fra allerede eksisterende.<\/i><\/p>\n<p>\nFor et \u00e5r siden offentliggjorde vi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">en introduktion til GitOps<\/a><\/noindex>. Dengang fortalte vi, hvordan Weaveworks-teamet lancerede en SaaS, der er helt baseret p\u00e5 Kubernetes, og udviklede et s\u00e6t best practices for implementering, styring og overv\u00e5gning i en cloud native-milj\u00f8.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Artiklen blev popul\u00e6r. Andre begyndte at tale om GitOps og publicere nye v\u00e6rkt\u00f8jer til <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\">udvikling<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">af hemmeligheder<\/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> osv. P\u00e5 vores site dukkede der op <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">et stort antal<\/a><\/noindex> publikationer og brugsscenarier for GitOps. Men nogle mennesker havde stadig sp\u00f8rgsm\u00e5l. Hvordan adskiller modellen sig fra traditionel <noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">infrastruktur som kode<\/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\u00f8dvendigt at bruge Kubernetes?<\/p>\n<p>Snart inds\u00e5 vi, at der var behov for en ny beskrivelse, der tilbyder:<\/p>\n<ol>\n<li> Et stort antal eksempler og historier;<\/li>\n<li> En konkret definition af GitOps;<\/li>\n<li> Sammenligning med traditionel continuous delivery.<\/li>\n<\/ol>\n<p>\nI denne artikel har vi fors\u00f8gt at d\u00e6kke alle disse emner. Du vil finde en opdateret introduktion til GitOps og et perspektiv fra udviklere og CI\/CD. Vi fokuserer prim\u00e6rt p\u00e5 Kubernetes, selvom modellen helt sikkert kan generaliseres.<\/p>\n<h2>M\u00f8d GitOps<\/h2>\n<p>\nForestil dig Alice. Hun driver virksomheden Family Insurance, der tilbyder sundhedsforsikringer, bilforsikringer, ejendomsvurderinger og rejseforsikring til folk, der er for travle til selv at forst\u00e5 kontraktens nuancer. Hendes forretning begyndte som et sideprojekt, da Alice arbejdede i banken som data scientist. En dag inds\u00e5 hun, at hun kunne bruge avancerede computeralgoritmer til mere effektivt at analysere data og sammens\u00e6tte forsikringspakker. Investorer finansierede projektet, og nu genererer hendes virksomhed over 20 millioner dollars om \u00e5ret og vokser hastigt. I \u00f8jeblikket har hun 180 medarbejdere i forskellige stillinger. Blandt dem er et teknologiteam, der arbejder med udvikling, vedligeholdelse af hjemmesiden, databaser og analyse af kundedata. Teamet p\u00e5 60 personer ledes af Bob - virksomhedens tekniske direkt\u00f8r.<\/p>\n<p>Bobs team implementerer produktionssystemer i skyen. Deres prim\u00e6re applikationer k\u00f8rer p\u00e5 GKE, hvor de drager fordel af Kubernetes i Google Cloud. Derudover bruger de forskellige v\u00e6rkt\u00f8jer til datah\u00e5ndtering og analyse i deres arbejde.<\/p>\n<p>Family Insurance havde egentlig ikke planer om at bruge containere, men blev smittet med entusiasme omkring Docker. Snart opdagede virksomhedens specialister, at GKE g\u00f8r det nemt og ubesv\u00e6ret at implementere klynger til test af nye funktioner. Jenkins blev tilf\u00f8jet til CI og Quay til organisering af containerregistreret, og der blev skrevet scripts til Jenkins, der push'ede nye containere og konfigurationer til GKE.<\/p>\n<p>Der gik noget tid. Alice og Bob blev skuffede over den valgte tilgangs ydeevne og dens indflydelse p\u00e5 forretningen. Implementeringen af containere havde ikke forbedret ydeevnen s\u00e5 meget, som teamet havde h\u00e5bet. Nogle gange br\u00f8d deployment'ene sammen, og det var uklart, om det var \u00e6ndringerne i koden, der var skyld i det. Det viste sig ogs\u00e5 at v\u00e6re sv\u00e6rt at holde styr p\u00e5 \u00e6ndringerne i konfigurationerne. Ofte var de n\u00f8dt til at oprette en ny klynge og flytte applikationerne dertil, da det var den letteste m\u00e5de at rydde op i det rod, systemet var blevet til. Alice frygtede, at situationen ville blive v\u00e6rre, efterh\u00e5nden som applikationen udviklede sig (derudover var der et nyt projekt ved at tage form baseret p\u00e5 maskinl\u00e6ring). Bob havde automatiseret en stor del af arbejdet og forstod ikke, hvorfor pipeline stadigv\u00e6k var ustabil, d\u00e5rligt skalerede og periodisk kr\u00e6vede manuel indgriben?<\/p>\n<p><b>Derefter h\u00f8rte de om GitOps. Denne l\u00f8sning viste sig at v\u00e6re pr\u00e6cis det, de havde brug for for at kunne komme videre med sikkerhed.<\/b><\/p>\n<p>Alice og Bob havde i flere \u00e5r h\u00f8rt om arbejdsgange baseret p\u00e5 Git, DevOps og infrastruktur som kode. Det unikke ved GitOps er, at det bringer en r\u00e6kke bedste praksisser - kategoriske og normative - til implementeringen af disse ideer i konteksten af Kubernetes. Dette emne <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">er blevet rejst flere gange<\/a><\/noindex>, herunder 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 beslutter sig for at implementere GitOps. Nu har virksomheden en automatiseret driftsmodel, der er kompatibel med Kubernetes og kombinerer <i>hastighed<\/i> med <i>stabilitet<\/i>, idet de:<\/p>\n<ul>\n<li> har opdaget, at teamets produktivitet er fordoblet, og ingen bliver sk\u00f8r af det;<\/li>\n<li> er stoppet med at vedligeholde scripts. I stedet kan de nu fokusere p\u00e5 nye funktioner og forbedre ingeni\u00f8rmetoderne - for eksempel ved at implementere kanariefugle-udrulninger og forbedre testningen;<\/li>\n<li> har forbedret deploymentsprocessen - nu svigter den sj\u00e6ldent;<\/li>\n<li> fik mulighed for at genoprette deployment'er efter delvise nedbrud uden manuel indgriben;<\/li>\n<li> har f\u00e5et st\u00f8rre sikkerhed i leveringssystemer. Alice og Bob opdagede, at de kunne dele teamet op i grupper, der arbejder med mikrotjenester parallelt;<i>fleste af<\/i>de kan foretage 30-50 \u00e6ndringer i projektet hver dag gennem hver gruppe og afpr\u00f8ve nye teknikker;<\/li>\n<li> kan foretage 30-50 \u00e6ndringer i projektet hver dag gennem hver gruppe og pr\u00f8ve nye teknikker;<\/li>\n<li> tiltr\u00e6kker let nye udviklere til projektet, der har mulighed for at implementere opdateringer til produktionen ved hj\u00e6lp af pull requests allerede inden for f\u00e5 timer;<\/li>\n<li> let kan best\u00e5 revisioner i forbindelse med SOC2 <i>(i forhold til, at tjenesteudbydere lever op til kravene om sikker datastyring; l\u00e6s mere for eksempel, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">her<\/a><\/noindex> \u2014 red. anm.)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Hvad skete der?<\/h3>\n<p>\nGitOps er to ting:<\/p>\n<ol>\n<li> En driftsmodel for Kubernetes og cloud native. Den giver et s\u00e6t bedste praksisser for implementering, administration og overv\u00e5gning af containeriserede klynger og applikationer. En elegant definition p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">\u00e9n slide<\/a><\/noindex> fra <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> Vejen til at skabe et udviklingsorienteret milj\u00f8 til administrationsform\u00e5l. Vi anvender Git workflow b\u00e5de til drift og udvikling. V\u00e6r opm\u00e6rksom p\u00e5, at det ikke blot handler om Git push, men om at organisere hele s\u00e6t af CI\/CD og UI\/UX v\u00e6rkt\u00f8jer.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Et par ord om Git<\/h3>\n<p>\nHvis du ikke er bekendt med versionskontrolsystemer og Git-baserede arbejdsprocesser, anbefaler vi kraftigt at studere dem. I starten kan arbejdet med grene og pull requests virke som sort magi, men fordelene er det v\u00e6rd at bruge kr\u00e6fter p\u00e5. Her er <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">en god artikel<\/a><\/noindex> til at starte med.<\/p>\n<h2>Hvordan fungerer Kubernetes<\/h2>\n<p>\nI vores historie henvendte Alice og Bob sig til GitOps, efter at de har arbejdet med Kubernetes i et stykke tid. Faktisk er GitOps n\u00e6rt relateret til Kubernetes - det er en driftsmodel for infrastruktur og applikationer baseret p\u00e5 Kubernetes.<\/p>\n<h3>Hvad giver Kubernetes brugerne?<\/h3>\n<p>\nHer er nogle af de vigtigste funktioner:<\/p>\n<ol>\n<li> I Kubernetes-modellen kan alt beskrives i deklarativ form.<\/li>\n<li> Kubernetes API-serveren accepterer denne deklaration som input og fors\u00f8ger konstant at bringe klyngen i den tilstand, der er beskrevet i deklarationen.<\/li>\n<li> Deklarationerne er tilstr\u00e6kkelige til at beskrive og administrere et stort udvalg af arbejdsbelastninger - \"applikationer\".<\/li>\n<li> Som et resultat sker \u00e6ndringer i applikationen og klyngen p\u00e5 grund af:\n<ul>\n<li> \u00e6ndringer i containerbilleder;<\/li>\n<li> \u00e6ndringer i den deklarative specifikation;<\/li>\n<li> fejl i milj\u00f8et - for eksempel nedbrud af containere.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Kubernetes' fantastiske evner til konvergensen<\/h3>\n<p>\nN\u00e5r en administrator foretager \u00e6ndringer i konfigurationen, vil Kubernetes-orchestratoren anvende dem p\u00e5 klyngen, indtil dens tilstand <i>n\u00e6rmer sig den nye konfiguration<\/i>. Denne model fungerer for enhver ressource i Kubernetes og kan udvides via Custom Resource Definitions (CRDs). Derfor har Kubernetes deployment'er f\u00f8lgende fantastiske egenskaber:<\/p>\n<ul>\n<li> <b>Automatisering<\/b>: Kubernetes-opdateringer giver en mekanisme til at automatisere \u00e6ndringsanvendelsesprocessen korrekt og rettidigt.<\/li>\n<li> <b>Konvergens<\/b>: Kubernetes vil forts\u00e6tte med at fors\u00f8ge opdateringer indtil succes.<\/li>\n<li> <b>Idempotens<\/b>: gentagne anvendelser af konvergensen f\u00f8rer til det samme resultat.<\/li>\n<li> <b>Determinisme<\/b>: med tilstr\u00e6kkelige ressourcer afh\u00e6nger den opdaterede clusters tilstand kun af den \u00f8nskede tilstand.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hvordan GitOps fungerer<\/h2>\n<p>\nVi har l\u00e6rt nok om Kubernetes til at forklare GitOps-principperne.<\/p>\n<p>Lad os vende tilbage til Family Insurance-teams, der arbejder med mikrotjenester. Hvad skal de typisk h\u00e5ndtere? Se p\u00e5 listen nedenfor (hvis nogle punkter virker m\u00e6rkelige eller ukendte \u2014 v\u00e6r venlig at uds\u00e6tte kritikken og h\u00e6nge p\u00e5). Dette er blot eksempler p\u00e5 arbejdsprocesser baseret p\u00e5 Jenkins. Der findes mange andre processer, n\u00e5r man arbejder med andre v\u00e6rkt\u00f8jer.<\/p>\n<p>Det vigtigste er, at vi ser, at hver opdatering ender med \u00e6ndringer i konfigurationsfiler og Git-repositories. Disse \u00e6ndringer i Git f\u00e5r 'GitOps-operatoren' til at opdatere clusteren:<\/p>\n<p>1. Arbejdsproces: '<i>Jenkins build \u2014 master grenen<\/i>\u00bb.<br \/>\nOpgaveliste:<\/p>\n<ul>\n<li> Jenkins push'er taggede billeder til Quay;<\/li>\n<li> Jenkins push'er konfigurationen og Helm-diagrammer til master-bucket;<\/li>\n<li> En cloud-funktion kopierer konfig og diagrammer fra master-lagerets bucket til Git-repositoryet master;<\/li>\n<li> GitOps-operatoren opdaterer clusteren.<\/li>\n<\/ul>\n<p>\n2. <i>Jenkins build \u2014 release- eller hotfix-grenen<\/i>:<\/p>\n<ul>\n<li> Jenkins push'er u-tagged billeder til Quay;<\/li>\n<li> Jenkins push'er konfigurationen og Helm-diagrammer til staging-bucket;<\/li>\n<li> En cloud-funktion kopierer konfig og diagrammer fra staging-lagerets bucket til Git-repositoryet staging;<\/li>\n<li> GitOps-operatoren opdaterer clusteren.<\/li>\n<\/ul>\n<p>\n3. <i>Jenkins build \u2014 develop- eller feature-grenen<\/i>:<\/p>\n<ul>\n<li> Jenkins push'er u-tagged billeder til Quay;<\/li>\n<li> Jenkins push'er konfigurationen og Helm-diagrammer til develop-bucket;<\/li>\n<li> En cloud-funktion kopierer konfig og diagrammer fra develop-lagerets bucket til Git-repositoryet develop;<\/li>\n<li>GitOps-operatoren opdaterer clusteren.<\/li>\n<\/ul>\n<p>\n4. <i>Tilf\u00f8jelse af en ny klient<\/i>:<\/p>\n<ul>\n<li> En manager eller administrator (LCM\/ops) kalder Gradle for den indledende implementering og ops\u00e6tning af netv\u00e6rksbelastningsafbalancere (NLB);<\/li>\n<li> LCM\/ops committer en ny konfiguration til forberedelse af deployment til opdateringer;<\/li>\n<li> GitOps-operatoren opdaterer clusteren.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kort beskrivelse af GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Beskriv den \u00f8nskede tilstand af hele systemet ved at bruge deklarative specifikationer for hvert milj\u00f8 (i vores historie definerer Bobs team hele systemkonfigurationen i Git).\n<ul>\n<li> Git-repositoriet er den eneste sandhedskilde vedr\u00f8rende den \u00f8nskede tilstand af hele systemet.<\/li>\n<li> Alle \u00e6ndringer til den \u00f8nskede tilstand foretages gennem commits i Git.<\/li>\n<li> Alle \u00f8nskede parametre for klyngen er ogs\u00e5 observerbare i selve klyngen. S\u00e5ledes kan vi bestemme, om de \u00f8nskede og observerede tilstande konvergerer, <i>converge<\/i>) eller divergerer, <i>diverge<\/i>) fra hinanden.<\/li>\n<\/ul>\n<\/li>\n<li> Hvis de \u00f8nskede og observerede tilstande adskiller sig, s\u00e5:\n<ul>\n<li> Der findes en konvergeringsmekanisme, som f\u00f8r eller siden automatisk synkroniserer m\u00e5l- og observerede tilstande. Inden for klyngen h\u00e5ndteres dette af Kubernetes.<\/li>\n<li> Processen starter straks med notifikationen \u00abchange committed\u00bb.<\/li>\n<li> Efter et justerbart tidsinterval kan der sendes en notifikation \u00abdiff\u00bb, hvis tilstandene adskiller sig.<\/li>\n<\/ul>\n<\/li>\n<li> S\u00e5ledes udl\u00f8ser alle commits i Git verificerbare og idempotente opdateringer i klyngen.\n<ul>\n<li>Rollback er en konvergering til en tidligere \u00f8nsket tilstand.<\/li>\n<\/ul>\n<\/li>\n<li> Konvergeringen er endelig. Tegnene p\u00e5 dens indtr\u00e6den er:\n<ul>\n<li> Ingen \u00abdiff\u00bb notifikationer i en bestemt tidsperiode.<\/li>\n<li> En \u00abconverged\u00bb notifikation (f.eks. webhook, Git writeback-h\u00e6ndelse).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Hvad er divergens?<\/h3>\n<p>\nLad os gentage: <i>alle \u00f8nskede egenskaber for klyngen skal v\u00e6re observerbare i selve klyngen.<\/i>.<\/p>\n<p>Nogle eksempler p\u00e5 divergens:<\/p>\n<ul>\n<li> \u00c6ndring af konfigurationsfilen p\u00e5 grund af sammensmeltning af grene i Git.<\/li>\n<li> \u00c6ndring af konfigurationsfilen p\u00e5 grund af et commit i Git lavet af en GUI-klient.<\/li>\n<li> Flere \u00e6ndringer i den \u00f8nskede tilstand p\u00e5 grund af PR i Git efterfulgt af bygning af et containerbillede og \u00e6ndringer i konfigurationsfilen.<\/li>\n<li> \u00c6ndring af klyngens tilstand p\u00e5 grund af fejl, ressourcekonflikter, der f\u00f8rer til 'd\u00e5rlig opf\u00f8rsel', eller blot en tilf\u00e6ldig afvigelse fra den oprindelige tilstand.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Hvad er konvergeringsmekanismen?<\/h3>\n<p>\nNogle eksempler:<\/p>\n<ul>\n<li> For containere og klynger leverer konvergeringsmekanismen Kubernetes.<\/li>\n<li> Den samme mekanisme kan bruges til at styre applikationer og strukturer baseret p\u00e5 Kubernetes (f.eks. Istio og Kubeflow).<\/li>\n<li> Mekanismen til at styre arbejdsgangen mellem Kubernetes, billedrepositorier og Git leverer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">GitOps-operator Weave Flux<\/a><\/noindex>, som er en del af <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> For grundl\u00e6ggende maskiner skal konvergensmekanismen v\u00e6re deklarativ og autonom. Af erfaring kan vi sige, 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> n\u00e6rmer sig denne definition, men stadig kr\u00e6ver menneskelig kontrol. I denne forstand udvider GitOps traditionerne fra Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps kombinerer Git med den fremragende konvergensmekanisme i Kubernetes og tilbyder en model for drift.<\/p>\n<p>GitOps giver os mulighed for at sige: <i>kun de systemer, der kan beskrives og overv\u00e5ges, er underlagt automatisering og kontrol<\/i>.<\/p>\n<h3>GitOps er designet til hele cloud native-stakken (f.eks. Terraform osv.)<\/h3>\n<p>\nGitOps handler ikke kun om Kubernetes. Vi \u00f8nsker, at hele systemet skal styres deklarativt og bruge konvergens. Med hele systemet refererer vi til samlingen af milj\u00f8er, der arbejder med Kubernetes \u2014 for eksempel \"dev cluster 1\", \"production\" osv. Hvert milj\u00f8 inkluderer maskiner, klynger, applikationer samt gr\u00e6nseflader til eksterne tjenester, der leverer data, overv\u00e5gning osv.<\/p>\n<p>Bem\u00e6rk, hvor vigtig Terraform er for bootstrapping-problemet i dette tilf\u00e6lde. Kubernetes skal v\u00e6re implementeret et sted, og brug af Terraform betyder, at vi kan anvende de samme GitOps-arbejdsgange til at oprette det styresystem, der ligger til grund for Kubernetes og applikationer. Dette er en nyttig bedste praksis.<\/p>\n<p>Der l\u00e6gges stor v\u00e6gt p\u00e5 anvendelse af GitOps-koncepter til lag over Kubernetes. Ind til videre findes der GitOps-l\u00f8sninger for Istio, Helm, Ksonnet, OpenFaaS og Kubeflow, samt f.eks. Pulumi, som skaber et lag til udvikling af applikationer til cloud native.<\/p>\n<h2>Kubernetes CI\/CD: sammenligning af GitOps med andre tilgange<\/h2>\n<p>\nSom n\u00e6vnt er GitOps to ting:<\/p>\n<ol>\n<li> En driftmodel for Kubernetes og cloud native, som beskrevet ovenfor.<\/li>\n<li> Vejen til at organisere et udviklerfokuseret milj\u00f8 til applikationsstyring.<\/li>\n<\/ol>\n<p>\nFor mange er GitOps f\u00f8rst og fremmest en arbejdsgang baseret p\u00e5 Git push. Det kan vi ogs\u00e5 lide. Men det er ikke alt: lad os nu se p\u00e5 CI\/CD-pipelines.<\/p>\n<h3>GitOps sikrer kontinuerlig implementering (CD) under Kubernetes<\/h3>\n<p>\nGitOps tilbyder en mekanisme til kontinuerlig implementering, der fjerner behovet for separate \"deploymentsstyringssystemer\". Alt arbejdet udf\u00f8res af Kubernetes.<\/p>\n<ul>\n<li> Opdatering af applikationen kr\u00e6ver en opdatering i Git. Dette er en transaktionel opdatering til den \u00f8nskede tilstand. \"Deployment\" udf\u00f8res derefter inden for klyngen af selve Kubernetes baseret p\u00e5 den opdaterede beskrivelse.<\/li>\n<li> P\u00e5 grund af den specifikke m\u00e5de, Kubernetes arbejder p\u00e5, er disse opdateringer konvergerende. Dette sikrer en mekanisme for kontinuerlig udrulning, hvor alle opdateringer er atomare.<\/li>\n<li> Bem\u00e6rk: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> tilbyder en GitOps-operator, der integrerer Git og Kubernetes og muligg\u00f8r CD ved at afstemme den \u00f8nskede og den aktuelle tilstand i klyngen.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Uden kubectl og scripts<\/h3>\n<p>\nDet er bedst at undg\u00e5 brugen af Kubectl til at opdatere klyngen, is\u00e6r scripts til at gruppere kubectl-kommandoer. I stedet kan brugeren ved hj\u00e6lp af en GitOps-pipeline opdatere sin Kubernetes-klynge gennem Git.<\/p>\n<p>Fordelene inkluderer:<\/p>\n<ol>\n<li> <b>Korrekthed<\/b>. En gruppe opdateringer kan anvendes, konvergeres og endelig valideres, hvilket bringer os t\u00e6ttere p\u00e5 m\u00e5let om atomar udrulning. I mods\u00e6tning hertil giver brugen af scripts ingen garantier for konvergens (mere om dette nedenfor).<\/li>\n<li> <b>Sikkerhed<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Citerer<\/a><\/noindex> Kelsey Hightower: 'Begr\u00e6ns adgangen til Kubernetes-klyngen til automatiseringsv\u00e6rkt\u00f8jer og administratorer, der har til opgave at debugge eller vedligeholde den.' Se ogs\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">min publikation<\/a><\/noindex> om sikkerhed og overholdelse af tekniske krav, samt <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">artiklen om Homebrew-hacking<\/a><\/noindex> ved at stj\u00e6le legitimationsoplysninger fra et sjusket lavet Jenkins-script.<\/li>\n<li> <b>Brugeroplevelse<\/b>. Kubectl afsl\u00f8rer mekanikken i Kubernetes' objektmodel, som er ganske kompleks. Ideelt set skal brugerne interagere med systemet p\u00e5 et h\u00f8jere abstraktionsniveau. Her vil jeg igen referere til Kelsey og anbefale at se <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">dette resume<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Forskellen mellem CI og CD<\/h3>\n<p>\nGitOps forbedrer eksisterende CI\/CD-modeller.<\/p>\n<p>Moderne CI-servere fungerer som v\u00e6rkt\u00f8jer til orkestrering. Is\u00e6r er det v\u00e6rkt\u00f8jer til orkestrering af CI-pipelines. De inkluderer build, test, merge til trunk osv. CI-servere automatiserer styringen af komplekse multitrins-pipelines. En almindelig fristelse er at oprette et script til s\u00e6t opdateringer til Kubernetes og udf\u00f8re det som en del af pipelinen for at pushe \u00e6ndringerne til klyngen. Mange fagfolk g\u00f8r faktisk det. Men dette er ikke optimalt, og her er grunden.<\/p>\n<p>CI b\u00f8r bruges til at opdatere trunk, mens Kubernetes-klusteret skal \u00e6ndre sig baseret p\u00e5 disse opdateringer for at styre CD \"internt\". Vi kalder dette <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">pull-modellen for CD<\/a><\/noindex>, i mods\u00e6tning til CI push-modellen. CD er en del af <i>runtime-orkestrering<\/i>.<\/p>\n<h3>Hvorfor CI-servere ikke b\u00f8r udf\u00f8re CD gennem direkte opdateringer i Kubernetes<\/h3>\n<p>\n<i>Brug ikke CI-serveren til at orkestrere direkte opdateringer i Kubernetes som et s\u00e6t CI-opgaver. Dette er et antipattern, vi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">allerede fortalt<\/a><\/noindex> diskuterer i vores blog.<\/i><\/p>\n<p>Lad os vende tilbage til Alice og Bob.<\/p>\n<p>Hvilke problemer stod de overfor? Bobs CI-server anvender \u00e6ndringerne til klustret, men hvis den fejler undervejs, ved Bob ikke, hvilken tilstand klustret er i (eller burde v\u00e6re i), eller hvordan man retter det. Det samme g\u00e6lder i tilf\u00e6lde af succes.<\/p>\n<p>Lad os antage, at Bobs team har bygget et nyt billede og derefter patcheret deres deployments for at implementere billedet (alt sammen fra CI-pipelinen).<\/p>\n<p>Hvis billedet bygges korrekt, men pipelinen fejler, m\u00e5 teamet finde ud af:<\/p>\n<ul>\n<li> Blev opdateringen implementeret?<\/li>\n<li> K\u00f8rer vi en ny bygning? Vil det medf\u00f8re un\u00f8dvendige bivirkninger \u2014 med muligheden for at f\u00e5 to bygninger af det samme u\u00e6ndrede billede? <\/li>\n<li> Skal vi vente p\u00e5 den n\u00e6ste opdatering, f\u00f8r vi k\u00f8rer bygningen?<\/li>\n<li> Hvad gik helt galt? Hvilke trin skal gentages (og hvilke kan gentages sikkert)?<\/li>\n<\/ul>\n<p>\n<i>At organisere en Git-baseret arbejdsgang garanterer ikke, at Bobs team ikke vil st\u00e5 over for disse problemer. De kan stadig lave fejl med pushet af committet, med tagget eller en hvilken som helst anden parameter; men denne tilgang er stadig meget t\u00e6ttere p\u00e5 det eksplicitte alt-eller-intet.<\/i><\/p>\n<p>Sammenfattende, her er hvorfor CI-servere ikke skal h\u00e5ndtere CD:<\/p>\n<ul>\n<li> Opdateringsscripts er ikke altid deterministiske; det er let at lave fejl i dem.<\/li>\n<li> CI-servere konvergerer ikke til en deklarativ model for klustret.<\/li>\n<li> Det er vanskeligt at garantere idempotens. Brugerne skal forst\u00e5 den dybe semantik i systemet.<\/li>\n<li> Det er sv\u00e6rere at gennemf\u00f8re en gendannelse efter en delvis fejl.<\/li>\n<\/ul>\n<p>\n<i>Bem\u00e6rkning om Helm: hvis du \u00f8nsker at bruge Helm, anbefaler vi at 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 hj\u00e6lpe med at sikre konvergens. Helm alene er hverken deterministisk eller atomisk.<\/i><\/p>\n<h2>GitOps som den bedste metode til at gennemf\u00f8re Continuous Delivery for Kubernetes<\/h2>\n<p>\nAlice og Bobs team implementerer GitOps og opdager, at det er blevet meget lettere at arbejde med softwareprodukter og opretholde h\u00f8j ydeevne og stabilitet. Lad os afslutte denne artikel med illustrationer, der viser, hvordan deres nye tilgang ser ud. Bem\u00e6rk, at vi hovedsageligt taler om applikationer og tjenester, men GitOps kan bruges til at administrere hele platformen.<\/p>\n<h3>Driftsmodel for Kubernetes<\/h3>\n<p>\nSe p\u00e5 f\u00f8lgende diagram. Det repr\u00e6senterer Git og containerbilledeopbevaring som f\u00e6lles ressourcer for to orkestrerede livscyklusser:<\/p>\n<ul>\n<li> En pipeline til kontinuerlig integration, der l\u00e6ser og skriver filer til Git og kan opdatere containerbilledrepoet.<\/li>\n<li> Runtime GitOps pipeline, der kombinerer deployment med administration og overv\u00e5gning. Den l\u00e6ser og skriver filer til Git og kan uploade containerbilleder.<\/li>\n<\/ul>\n<h3>Hvad er de vigtigste konklusioner?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Opdeling af problemer<\/b>: Bem\u00e6rk, at begge pipelines kan udveksle data, alene ved at opdatere Git eller billedrepoet. Med andre ord er der en firewall mellem CI og runtime-milj\u00f8et. Vi kalder det 'immutability firewall' <i>(immutability firewall)<\/i>, da alle opdateringer af repositorier skaber nye versioner. For yderligere information om emnet henvises til slides 72-87. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">denne pr\u00e6sentation<\/a><\/noindex>.<\/li>\n<li> <b>Enhver CI- og Git-server kan bruges<\/b>: GitOps fungerer med enhver komponent. Du kan forts\u00e6tte med at bruge dine foretrukne CI- og Git-servere, billedeopbevaringer og testpakker. N\u00e6sten alle andre v\u00e6rkt\u00f8jer til Continuous Delivery p\u00e5 markedet kr\u00e6ver deres egen CI\/Git-server eller billedeopbevaring. Dette kan blive en begr\u00e6nsende faktor i udviklingen af cloud native. I tilf\u00e6ldet med GitOps kan du bruge de v\u00e6rkt\u00f8jer, du allerede kender.<\/li>\n<li> <b>Begivenheder som integrationsv\u00e6rkt\u00f8j<\/b>: S\u00e5 snart data opdateres i Git, underretter Weave Flux (eller Weave Cloud operator) runtime om dette. Hver gang Kubernetes accepterer et s\u00e6t \u00e6ndringer, opdateres Git. Dette sikrer en enkel integrationsmodel til at organisere workflows for GitOps, som vist nedenfor.<\/li>\n<\/ol>\n<h2>Konklusion<\/h2>\n<p>\nGitOps giver v\u00e6sentlige garantier for opdateringen, som ethvert moderne CI\/CD-v\u00e6rkt\u00f8j har brug for:<\/p>\n<ul>\n<li> automatisering;<\/li>\n<li> konvergens;<\/li>\n<li> idempotens;<\/li>\n<li> determinisme.<\/li>\n<\/ul>\n<p>\nDette er vigtigt, da det tilbyder en driftsmodel for udviklere inden for cloud native.<\/p>\n<ul>\n<li> Traditionelle v\u00e6rkt\u00f8jer til systemstyring og overv\u00e5gning er knyttet til driftsteams, der arbejder inden for et runbook <i>(s\u00e6t af rutineprocedurer og operationer \u2014 bem\u00e6rkning fra overs\u00e6tteren.)<\/i>, der er knyttet til et specifikt deployment.<\/li>\n<li> I administrationen af cloud native-systemer er overv\u00e5gningsv\u00e6rkt\u00f8jet den bedste m\u00e5de at vurdere resultaterne af deployments, s\u00e5 udviklingsteamet kan reagere hurtigt p\u00e5 dem.<\/li>\n<\/ul>\n<p>\nForestil dig mange klynger spredt over forskellige skyer og mange tjenester med deres egne teams og deployment-planer. GitOps tilbyder en skalerbar invariant model til at styre alt dette overflod.<\/p>\n<h2>P.S. fra overs\u00e6tteren<\/h2>\n<p>\nL\u00e6s ogs\u00e5 p\u00e5 vores blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: sammenligning af 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 pr\u00e6senterer kubedog-biblioteket til overv\u00e5gning af Kubernetes-ressourcer<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Udvikler Kubernetes (oversigt og videopr\u00e6sentation)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Kun registrerede brugere kan deltage i unders\u00f8gelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log ind<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Vidste du om GitOps f\u00f8r disse to overs\u00e6ttelser 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 vidste det.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Kun overfladisk.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nej<\/p>\n<\/li>\n<\/ul>\n<p>    35 brugere har stemt. 10 brugere har hverken stemt for eller imod.<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.3 - 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\/da\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Hvad er GitOps? | ProHoster","description":"Bem.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}