{"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\/hr\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"\u0160ta je GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Napomena za prijevod.<\/b>: Nakon nedavne objave <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">materijala<\/a><\/noindex> o metodama pull i push u GitOps-u, primijetili smo interes za ovaj model u cjelini, no na hrvatskom jeziku gotovo da i nema publikacija na ovu temu (na Habr-u ih jednostavno nema). Stoga smo sretni \u0161to vam mo\u017eemo ponuditi prijevod drugog \u010dlanka \u2014 iako je star gotovo godinu dana! \u2014 od tvrtke Weaveworks, \u010diji je osniva\u010d smislio pojam \u201eGitOps\u201c. U tekstu se obja\u0161njava su\u0161tina pristupa i klju\u010dne razlike u odnosu na postoje\u0107e modele.<\/i><\/p>\n<p>\nPrije godinu dana objavili smo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">uvod u GitOps<\/a><\/noindex>. Tada smo govorili o tome kako je tim Weaveworks-a pokrenuo SaaS koji se u potpunosti temelji na Kubernetes-u i razvio set propisnih najboljih praksi za implementaciju, upravljanje i nadzor u cloud native okru\u017eenju.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>\u010clanak je bio popularan. Drugi ljudi su po\u010deli govoriti o GitOps-u, a pojavili su se i novi alati za <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\">razvoj<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">tajni<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">funkcija<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">neprekidnoj integraciji<\/a><\/noindex> itd. Na na\u0161oj web stranici pojavio se <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">velik broj<\/a><\/noindex> publikacija i primjera kori\u0161tenja GitOps-a. No, neki ljudi su ipak imali pitanja. Kako se ovaj model razlikuje od tradicionalnog <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> i kontinuirane isporuke (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">continuous delivery<\/a><\/noindex>)? Je li obavezno koristiti Kubernetes?<\/p>\n<p>Ubrzo smo shvatili da je potrebno novo obja\u0161njenje koje nudi:<\/p>\n<ol>\n<li> Velik broj primjera i pri\u010da;<\/li>\n<li> Konkretnu definiciju GitOps-a;<\/li>\n<li> Usporedbu s tradicionalnom kontinuiranom isporukom.<\/li>\n<\/ol>\n<p>\nU ovom \u010dlanku poku\u0161ali smo obuhvatiti sve ove teme. Prona\u0107i \u0107ete a\u017eurirani uvod u GitOps i pogled na njega iz perspektive programera i CI\/CD-a. Ve\u0107inom se fokusiramo na Kubernetes, iako se model mo\u017ee generalizirati.<\/p>\n<h2>Upoznajte se: GitOps<\/h2>\n<p>\nZamislite Alisu. Ona upravlja kompanijom Family Insurance koja nudi police zdravstvenog osiguranja, osiguranja automobila, nekretnina i putnog osiguranja ljudima koji su previ\u0161e zauzeti da bi se sami bavili sitnicama ugovora. Njen posao po\u010deo je kao sporedni projekt dok je Alisa radila u banci kao podatkovna znanstvenica. Jednog dana shvatila je da mo\u017ee koristiti napredne ra\u010dunalne algoritme za u\u010dinkovitiju analizu podataka i kreiranje osiguravateljskih paketa. Investitori su financirali projekt i sada njezina kompanija zara\u0111uje vi\u0161e od 20 milijuna dolara godi\u0161nje i brzo raste. Trenutno u njoj radi 180 osoba na raznim pozicijama, uklju\u010duju\u0107i tehnolo\u0161ki tim koji se bavi razvojem, odr\u017eavanjem web stranice, baze podataka i analizom klijentske baze. Tim od 60 ljudi predvodi Bob, tehni\u010dki direktor kompanije.<\/p>\n<p>Bobov tim implementira produkcijske sustave u oblaku. Njihove glavne aplikacije rade na GKE-u, koriste\u0107i prednosti Kubernetesa u Google Cloud-u. Tako\u0111er koriste razne alate za obradu podataka i analitiku.<\/p>\n<p>Tvrtka Family Insurance nije planirala koristiti kontejnere, no ubrzo je postala entuzijasti\u010dna oko Dockera. Ubrzo su stru\u010dnjaci tvrtke otkrili da GKE omogu\u0107uje lako i bez stresa postavljanje klastera za testiranje novih funkcionalnosti. Dodan je Jenkins za CI i Quay za organizaciju registra kontejnera, napisani su skripti za Jenkins koji su pushali nove kontejnere i konfiguracije u GKE.<\/p>\n<p>Pro\u0161lo je neko vrijeme. Alisa i Bob su bili razo\u010darani performansama odabranog pristupa i njegovim utjecajem na posao. Uvo\u0111enje kontejnera nije pobolj\u0161alo performanse onoliko koliko je tim o\u010dekivao. Ponekad su se deploymenti ru\u0161ili, a nije bilo jasno jesu li za to krivi izmjene koda. Tako\u0111er je bilo te\u0161ko pratiti promjene u konfiguracijama. \u010cesto je bilo potrebno izraditi novi klaster i premjestiti aplikacije, jer je to bilo najlak\u0161i na\u010din da se rije\u0161i kaos koji je nastao u sustavu. Alisa se bojala da \u0107e se situacija pogor\u0161ati s razvojem aplikacije (uz to, nova je bila planirana na temelju strojnog u\u010denja). Bob je automatizirao ve\u0107i dio posla i nije razumio za\u0161to je pipeline i dalje nestabilan, slabo se skalira i povremeno zahtijeva ru\u010dnu intervenciju.<\/p>\n<p><b>Tada su saznali za GitOps. Ovo rje\u0161enje se pokazalo upravo onim \u0161to im je bilo potrebno za sigurno kretanje unaprijed.<\/b><\/p>\n<p>Alisa i Bob ve\u0107 godinama \u010duju o radnim procesima temeljenim na Gitu, DevOpsu i infrastrukturi kao kodu. Jedinstvenost GitOps-a le\u017ei u tome \u0161to uvodi niz najboljih praksi \u2014 strogo definiranih i normativnih \u2014 za implementaciju ovih ideja u kontekstu Kubernetes-a. Ova tema <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">nekoliko puta je spominjana<\/a><\/noindex>, uklju\u010duju\u0107i i u <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">blogu Weaveworks<\/a><\/noindex>.<\/p>\n<p>Family Insurance odlu\u010duje implementirati GitOps. Sada kompanija ima automatizirani model operacija, kompatibilan s Kubernetesom, koji kombinira <i>brzinu<\/i> s <i>stabilno\u0161\u0107u<\/i>, jer su:<\/p>\n<ul>\n<li> otkrili da je timska produktivnost dvostruko ve\u0107a i nitko pritom ne poludi;<\/li>\n<li> prestali su odr\u017eavati skripte. Umjesto toga, sada se mogu fokusirati na nove zna\u010dajke i unaprijediti in\u017eenjerske metode \u2014 na primjer, implementirati kanareke i pobolj\u0161ati testiranje;<\/li>\n<li> uspavili proces implementacije \u2014 sada se rijetko ru\u0161i;<\/li>\n<li> dobivena je mogu\u0107nost obnavljanja deploymenta nakon djelomi\u010dnih kvarova bez ru\u010dne intervencije;<\/li>\n<li> stvorili ve\u0107u sigurnost u sustavima isporuke. Alisa i Bob su otkrili da mogu podijeliti tim na grupe koje se bave mikroservisima i rade paralelno;<i>o<\/i>mogu unositi 30-50 promjena u projekt svaki dan trudi svake grupe i isprobavati nove tehnike;<\/li>\n<li> mogu unositi 30-50 promjena u projekt svaki dan naporima svake grupe i isprobavati nove tehnike;<\/li>\n<li> lako privla\u010de nove programere u projekt, koji imaju mogu\u0107nost postavljanja a\u017euriranja na produkciju putem pull requestova ve\u0107 unutar nekoliko sati;<\/li>\n<li> lako prolaze reviziju u okviru SOC2 <i>(u vezi s uskla\u0111eno\u0161\u0107u pru\u017eatelja usluga s zahtjevima za sigurnim upravljanjem podacima; vi\u0161e informacija pro\u010ditajte, na primjer, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">ovdje<\/a><\/noindex> \u2014 napomena prev.)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u0160to se dogodilo?<\/h3>\n<p>\nGitOps - to su dvije stvari:<\/p>\n<ol>\n<li> Model operacija za Kubernetes i cloud native. Pru\u017ea skup najboljih praksi za implementaciju, upravljanje i pra\u0107enje klastera i aplikacija pakiranih u kontejnere. Elegantan opis u obliku <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">jednog slajda<\/a><\/noindex> od <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> Put do stvaranja okru\u017eenja usmjerenog na programere za upravljanje aplikacijama. Primjenjujemo radni proces Git za operacije i razvoj. Imajte na umu da ne govorimo samo o Git push, ve\u0107 o organizaciji kompletnog skupa CI\/CD i UI\/UX alata.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Par rije\u010di o Git-u<\/h3>\n<p>\nAko niste upoznati s sustavima kontrole verzija i Git radnim procesima, toplo preporu\u010dujemo da ih istra\u017eite. U po\u010detku se rad s granama i pull requestovima mo\u017ee \u010diniti kao crna magija, ali prednosti vrijede ulo\u017eenog truda. Evo <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">dobrog \u010dlanka<\/a><\/noindex> za po\u010detak.<\/p>\n<h2>Kako radi Kubernetes<\/h2>\n<p>\nU na\u0161oj pri\u010di, Alisa i Bob su se obratili GitOps-u, nakon \u0161to su neko vrijeme radili s Kubernetesom. Uistinu, GitOps je usko povezan s Kubernetesom - to je model operacije za infrastrukturu i aplikacije temeljene na Kubernetesu.<\/p>\n<h3>\u0160to Kubernetes pru\u017ea korisnicima?<\/h3>\n<p>\nEvo nekoliko osnovnih mogu\u0107nosti:<\/p>\n<ol>\n<li> U Kubernetes modelu sve se mo\u017ee opisati u deklarativnom obliku.<\/li>\n<li> Kubernetes API server prihva\u0107a takvu deklaraciju kao ulazne podatke, a zatim neprekidno poku\u0161ava dovesti klaster u stanje opisano u deklaraciji.<\/li>\n<li> Deklaracije su dovoljne za opisivanje i upravljanje velikim raznolikostima radnih optere\u0107enja - \"aplikacija\".<\/li>\n<li> Kao rezultat, promjene u aplikaciji i klasteru se doga\u0111aju zbog:\n<ul>\n<li> promjena u slikama kontejnera;<\/li>\n<li> promjena u deklarativnoj specifikaciji;<\/li>\n<li> gre\u0161aka u okru\u017eenju - na primjer, padova kontejnera.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Izvrsne sposobnosti Kubernetes-a za konvergenciju<\/h3>\n<p>\nKada administrator unese promjene u konfiguraciju, Kubernetes orkestrator \u0107e ih primjenjivati na klaster sve dok njegovo stanje <i>ne bude blizu nove konfiguracije<\/i>. Ovaj model radi za sve resurse Kubernetesa i pro\u0161iruje se pomo\u0107u Custom Resource Definitions (CRD). Stoga Kubernetes deploymenti imaju sljede\u0107e sjajne osobine:<\/p>\n<ul>\n<li> <b>Automatizacija<\/b>: a\u017euriranja Kubernetes-a pru\u017eaju mehanizam za automatizaciju procesa primjene promjena na ispravan i pravodoban na\u010din.<\/li>\n<li> <b>Konvergencija<\/b>: Kubernetes \u0107e nastaviti poku\u0161avati a\u017euriranja dok ne postigne uspjeh.<\/li>\n<li> <b>Idempotentnost<\/b>: ponovna primjena konvergencije dovodi do istog rezultata.<\/li>\n<li> <b>Deterministi\u010dnost<\/b>: pri dovoljnoj koli\u010dini resursa stanje a\u017eurirane grupe ovisi samo o \u017eeljenom stanju.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kako funkcionira GitOps<\/h2>\n<p>\nDovoljno smo nau\u010dili o Kubernetesu da objasnimo principe rada GitOps-a.<\/p>\n<p>Vratimo se timovima Family Insurance vezanim za mikroservise. \u010cime se obi\u010dno bave? Pogledajte popis u nastavku (ako neki stavci djeluju \u010dudno ili nepoznato \u2014 molim vas, suzdr\u017eite se od kritike i ostanite s nama). Ovo su samo primjeri radnih procesa temeljenih na Jenkins-u. Postoji mnogo drugih procesa na drugim alatima.<\/p>\n<p>Najva\u017enije \u2014 vidimo da svako a\u017euriranje zavr\u0161ava promjenama u konfiguracijskim datotekama i Git repozitorijima. Te promjene u Gitu dovode do toga da \u201eGitOps operater\u201c a\u017eurira grupu:<\/p>\n<p>1. Radni proces: \u201e<i>Jenkins Build \u2014 master grana<\/i>\u00bb.<br \/>\nPopis zadataka:<\/p>\n<ul>\n<li> Jenkins pushuje ozna\u010dene slike u Quay;<\/li>\n<li> Jenkins pushuje konfiguraciju i Helm karte u master spremi\u0161te;<\/li>\n<li> Obla\u010dna funkcija kopira konfiguraciju i grafikone iz master skladi\u0161ta u Git repozitorij master;<\/li>\n<li> GitOps operater a\u017eurira grupu.<\/li>\n<\/ul>\n<p>\n2. <i>Jenkins Build \u2014 release ili hotfix grana<\/i>:<\/p>\n<ul>\n<li> Jenkins pushuje neozna\u010dene slike u Quay;<\/li>\n<li> Jenkins pushuje konfiguraciju i Helm karte u staging spremi\u0161te;<\/li>\n<li> Obla\u010dna funkcija kopira konfiguraciju i grafikone iz staging skladi\u0161ta u Git repozitorij staging;<\/li>\n<li> GitOps operater a\u017eurira grupu.<\/li>\n<\/ul>\n<p>\n3. <i>Jenkins Build \u2014 develop ili feature grana<\/i>:<\/p>\n<ul>\n<li> Jenkins pushuje neozna\u010dene slike u Quay;<\/li>\n<li> Jenkins pushuje konfiguraciju i Helm karte u develop spremi\u0161te;<\/li>\n<li> Obla\u010dna funkcija kopira konfiguraciju i grafikone iz develop skladi\u0161ta u Git repozitorij develop;<\/li>\n<li>GitOps operater a\u017eurira grupu.<\/li>\n<\/ul>\n<p>\n4. <i>Dodavanje novog klijenta<\/i>:<\/p>\n<ul>\n<li> Menad\u017eer ili administrator (LCM\/ops) pokre\u0107e Gradle za inicijalno raspore\u0111ivanje i postavljanje mre\u017enih balansiraju\u0107ih sistema (NLB);<\/li>\n<li> LCM\/ops komitira novu konfiguraciju za pripremu deploymenta za a\u017euriranja;<\/li>\n<li> GitOps operater a\u017eurira grupu.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kratak opis GitOps-a<\/h3>\n<p><\/p>\n<ol>\n<li> Opi\u0161ite \u017eeljeno stanje cijelog sustava koriste\u0107i deklarativne specifikacije za svako okru\u017eenje (u na\u0161oj pri\u010di Bobov tim definira svu konfiguraciju sustava u Gitu).\n<ul>\n<li> Git repozitorij je jedini izvor istine u vezi \u017eeljenog stanja cijelog sustava.<\/li>\n<li> Sve promjene u \u017eeljenom stanju doga\u0111aju se putem commitova u Gitu.<\/li>\n<li> Sve \u017eeljene karakteristike klastera tako\u0111er su uo\u010dljive u samom klasteru. Tako mo\u017eemo odrediti da li se \u017eeljeno i uo\u010deno stanje poklapaju (konvergiraju, <i>converge<\/i>) ili se razlikuju (divergiraju, <i>diverge<\/i>) od \u017eeljenog i uo\u010denog stanja.<\/li>\n<\/ul>\n<\/li>\n<li> Ako se \u017eeljeno i uo\u010deno stanje razlikuju, tada:\n<ul>\n<li> Postoji mehanizam konvergencije koji \u0107e prije ili kasnije automatski sinkronizirati ciljno i uo\u010deno stanje. Unutar klastera time se bavi Kubernetes.<\/li>\n<li> Proces zapo\u010dinje odmah s obavijesti \u201epromjena potvr\u0111ena\u201d.<\/li>\n<li> Nakon odre\u0111enog prilagodljivog vremenskog perioda mo\u017ee biti poslana obavijest \u201ediff\u201d, ako se stanja razlikuju.<\/li>\n<\/ul>\n<\/li>\n<li> Tako svi commitovi u Gitu uzrokuju provjerljive i idempotentne a\u017euriranja u klasteru.\n<ul>\n<li>Povratak je konvergencija prema ranije \u017eeljenom stanju.<\/li>\n<\/ul>\n<\/li>\n<li> Konvergencija je kona\u010dna. O njoj svjedo\u010de:\n<ul>\n<li> Nema obavijesti \u201ediff\u201d tijekom odre\u0111enog vremenskog razdoblja.<\/li>\n<li> Obavijest \u201ekonvergirano\u201d (na primjer, webhook, doga\u0111aj Git writeback).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>\u0160to je divergenicija?<\/h3>\n<p>\nPonovimo jo\u0161 jednom: <i>sva \u017eeljena svojstva klastera moraju biti uo\u010dljiva u samom klasteru<\/i>.<\/p>\n<p>Nekoliko primjera divergenicije:<\/p>\n<ul>\n<li> Promjena u datoteci konfiguracije zbog spajanja grana u Gitu.<\/li>\n<li> Promjena u datoteci konfiguracije zbog commit-a u Gitu, napravljenog putem GUI klijenta.<\/li>\n<li> Vi\u0161estruke promjene u \u017eeljenom stanju zbog PR-a u Gitu s naknadnom izgradnjom kontejnerske slike i promjenama u konfiguraciji.<\/li>\n<li> Promjena stanja klastera zbog gre\u0161ke, sukoba resursa koji vodi do \u201elo\u0161eg pona\u0161anja\u201d, ili jednostavno slu\u010dajne odstupanja od originalnog stanja.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u0160to predstavlja mehanizam konvergencije?<\/h3>\n<p>\nNekoliko primjera:<\/p>\n<ul>\n<li> Za kontejnere i klastere mehanizam konvergencije osigurava Kubernetes.<\/li>\n<li> Isti mehanizam se mo\u017ee koristiti za upravljanje aplikacijama i konstrukcijama temeljenim na Kubernetesu (npr. Istio i Kubeflow).<\/li>\n<li> Mehanizam za upravljanje radnom interakcijom izme\u0111u Kubernetesa, repozitorija slika i Gita pru\u017ea <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">GitOps operator Weave Flux<\/a><\/noindex>, koji je deo <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> Za osnovne ma\u0161ine, mehanizam konvergencije mora biti deklarativan i autonoman. Na\u0161e iskustvo ukazuje na to da <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> najbli\u017ee ovom definiciji, iako ipak zahteva ljudsku kontrolu. U tom smislu, GitOps pro\u0161iruje tradiciju Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps povezuje Git s odli\u010dnim mehanizmom konvergencije Kubernetes-a, nude\u0107i model za eksploataciju.<\/p>\n<p>GitOps nam omogu\u0107ava da ka\u017eemo: <i>automatski se kontroli\u0161u samo oni sistemi koje mo\u017eemo opisati i posmatrati<\/i>.<\/p>\n<h3>GitOps je namenjen celom cloud native staku (na primer, Terraform i sli\u010dno)<\/h3>\n<p>\nGitOps nije samo Kubernetes. \u017delimo da \u010ditav sistem bude upravljan deklarativno i da koristi konvergenciju. Pod celim sistemom podrazumevamo skup okru\u017eenja koja rade sa Kubernetes-om \u2014 na primer, 'dev cluster 1', 'production' i sli\u010dno. U svako okru\u017eenje ulaze ma\u0161ine, klasteri, aplikacije i interfejsi za spoljne usluge koje pru\u017eaju podatke, monitoring i sli\u010dno.<\/p>\n<p>Primijetite koliko je Terraform va\u017ean za problem bootstrappinga. Kubernetes mora biti negdje implementiran, a kori\u0161tenje Terraforma zna\u010di da mo\u017eemo primijeniti iste GitOps radne procese za izgradnju kontrolnog sloja koji le\u017ei u osnovi Kubernetesa i aplikacija. Ovo je korisna najbolja praksa.<\/p>\n<p>Velika pa\u017enja posve\u0107ena je primeni koncepta GitOps na slojeva iznad Kubernetes-a. Do sada postoje GitOps re\u0161enja za Istio, Helm, Ksonnet, OpenFaaS i Kubeflow, kao i, na primer, za Pulumi, koji stvaraju sloj za razvoj aplikacija pod cloud native.<\/p>\n<h2>Kubernetes CI\/CD: pore\u0111enje GitOps-a s drugim pristupima<\/h2>\n<p>\nKao \u0161to je re\u010deno, GitOps je dve stvari:<\/p>\n<ol>\n<li> Model eksploatacije za Kubernetes i cloud native, opisano gore.<\/li>\n<li> Put ka organizaciji orijentisanoj na programere za upravljanje aplikacijama.<\/li>\n<\/ol>\n<p>\nZa mnoge GitOps je prije svega radni proces temeljen na Git push. Nama se tako\u0111er svi\u0111a. No to nije sve: sada pogledajmo CI\/CD pipeline.<\/p>\n<h3>GitOps omogu\u0107ava kontinuirano razme\u0161tanje (CD) pod Kubernetes-om<\/h3>\n<p>\nGitOps nudi mehanizam kontinuiranog razme\u0161tanja koji elimini\u0161e potrebu za posebnim 'sistemima za upravljanje razme\u0161tanjem'. Sav posao obavlja Kubernetes.<\/p>\n<ul>\n<li> A\u017euriranje aplikacije zahtijeva a\u017euriranje u Gitu. To je transakcijsko a\u017euriranje u \u017eeljeno stanje. \"Implementacija\" se zatim odvija unutar klastera samog Kubernetesa na temelju a\u017euriranog opisa.<\/li>\n<li> Zbog specifi\u010dnosti rada Kubernetesa, ta a\u017euriranja su konvergenta. Tako se omogu\u0107ava mehanizam za kontinuiranu implementaciju, gdje su sva a\u017euriranja atomska.<\/li>\n<li> Napomena: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> nudi GitOps-operator koji integrira Git i Kubernetes i omogu\u0107ava izvr\u0161avanje CD-a uskla\u0111ivanjem \u017eeljenog i trenutnog stanja klastera.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Bez kubectl i skripti<\/h3>\n<p>\nTrebali bismo izbjegavati kori\u0161tenje Kubectl-a za a\u017euriranje klastera, a posebno skripti za grupiranje kubectl naredbi. Umjesto toga, uz pomo\u0107 GitOps pipeline-a korisnik mo\u017ee a\u017eurirati svoj Kubernetes klaster putem Gita.<\/p>\n<p>Prednosti uklju\u010duju:<\/p>\n<ol>\n<li> <b>Ispravnost<\/b>. Grupa a\u017euriranja mo\u017ee se primijeniti, konvergirati i kona\u010dno validirati, \u0161to nas pribli\u017eava cilju atomskog implementiranja. S druge strane, kori\u0161tenje skripti ne pru\u017ea nikakve garancije konvergencije (vi\u0161e o tome u nastavku).<\/li>\n<li> <b>Sigurnost<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Citiraju\u0107i<\/a><\/noindex> Kelsey Hightower: \u201eOgrani\u010dite pristup klasteru Kubernetesa automatizacijskim alatima i administratorima \u010dija je odgovornost njegovu dijagnostiku ili odr\u017eavanje funkcionalnosti\u201c. Tako\u0111er pogledajte <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">moj post<\/a><\/noindex> o sigurnosti i uskla\u0111enosti sa tehni\u010dkim specifikacijama, kao i <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">\u010dlanak o hakiranju Homebrew-a<\/a><\/noindex> kroz kra\u0111u vjerodajnica iz nepa\u017eljivo sastavljenog Jenkins skripta.<\/li>\n<li> <b>Korisni\u010dko iskustvo<\/b>. Kubectl otkriva mehaniku objektne modele Kubernetesa, koja je vrlo slo\u017eena. U idealnom slu\u010daju, korisnici bi trebali komunicirati sa sustavom na vi\u0161em razini apstrakcije. Ovdje se ponovno referiram na Kelsey-a i preporu\u010dujem da pogledate <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">takvo sa\u017eimanje<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Razlika izme\u0111u CI i CD<\/h3>\n<p>\nGitOps pobolj\u0161ava postoje\u0107e CI\/CD modele.<\/p>\n<p>Moderni CI server je alat za orkestraciju. Konkretno, to je alat za orkestraciju CI pipelinea. Oni uklju\u010duju izgradnju, testiranje, spajanje na trunk itd. CI serveri automatiziraju upravljanje slo\u017eenim vi\u0161ekratnim pipelineima. Uobi\u010dajena zamka je stvoriti skriptu za set a\u017euriranja Kubernetesa i izvesti je kao dio pipelinea za push promjena u klaster. Zaista, mnogi stru\u010dnjaci tako rade. Me\u0111utim, to nije optimalno, i evo za\u0161to.<\/p>\n<p>CI treba koristiti za primjenu a\u017euriranja u trunk, a Kubernetes klastra treba se mijenjati na temelju tih a\u017euriranja radi upravljanja CD \"unutarnje\". Ovo nazivamo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">pull-modelom za CD<\/a><\/noindex>, za razliku od CI push-modela. CD je dio <i>runtime-orchestracije<\/i>.<\/p>\n<h3>Za\u0161to CI serveri ne bi trebali raditi CD putem izravnih a\u017euriranja u Kubernetes<\/h3>\n<p>\n<i>Ne koristiti CI server za orkestraciju izravnih a\u017euriranja u Kubernetes kao set CI poslova. Ovo je antipatron, o tome smo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">ve\u0107 smo pri\u010dali<\/a><\/noindex> na na\u0161em blogu.<\/i><\/p>\n<p>Vratimo se Alisi i Bobu.<\/p>\n<p>S kojim problemima su se suo\u010dili? CI server Boba nanosi promjene u klaster, ali ako tijekom procesa do\u0111e do pada, Bob ne\u0107e znati u kojem je stanju (ili bi trebao biti) klaster i kako ga popraviti. Isto vrijedi i u slu\u010daju uspjeha.<\/p>\n<p>Pretpostavimo da je Bobov tim stvorio novu sliku i zatim a\u017eurirao svoje deployment kako bi implementirao sliku (sve ovo iz CI pipelinea).<\/p>\n<p>Ako se slika normalno izgradi, ali pipeline padne, timu \u0107e biti potrebno utvrditi:<\/p>\n<ul>\n<li> Je li a\u017euriranje implementirano?<\/li>\n<li> Pokre\u0107emo li novu verziju? Ho\u0107e li to dovesti do neopravdanih nuspojava \u2014 s mogu\u0107no\u0161\u0107u da dobijemo dvije verzije iste nepromijenjene slike? <\/li>\n<li> Trebamo li \u010dekati sljede\u0107e a\u017euriranje prije nego \u0161to pokrenemo verziju?<\/li>\n<li> \u0160to to\u010dno nije bilo u redu? Koje korake treba ponoviti (i koji od njih su sigurno ponovljivi)?<\/li>\n<\/ul>\n<p>\n<i>Organizacija radnog procesa temeljenog na Gitu ne jam\u010di da \u0107e se Bobov tim suo\u010diti s ovim problemima. I dalje mogu napraviti gre\u0161ku s pushanjem commit, s etiketom ili nekim drugim parametrom; no ovaj pristup je ipak mnogo bli\u017ei jasnom sve-ili-ni\u0161ta.<\/i><\/p>\n<p>Ukratko, evo za\u0161to CI serveri ne bi trebali raditi CD:<\/p>\n<ul>\n<li> Skripte za a\u017euriranje nisu uvijek deterministi\u010dne; lako je napraviti gre\u0161ke u njima.<\/li>\n<li> CI serveri se ne konvergiraju u deklarativni model klastera.<\/li>\n<li> Te\u0161ko je jam\u010diti idempotentnost. Korisnici trebaju razumjeti duboku semantiku sustava.<\/li>\n<li> Te\u017ee se oporaviti od djelomi\u010dnog kvara.<\/li>\n<\/ul>\n<p>\n<i>Napomena o Helmu: ako \u017eelite koristiti Helm, preporu\u010dujemo da ga kombinirate s GitOps operatorom, kao \u0161to je <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>. To \u0107e pomo\u0107i osigurati konvergenciju. Sam po sebi Helm nije ni deterministi\u010dki ni atomski.<\/i><\/p>\n<h2>GitOps kao najbolji na\u010din za provo\u0111enje Continuous Delivery za Kubernetes<\/h2>\n<p>\nTim Alice i Boba implementira GitOps i otkriva da je mnogo lak\u0161e raditi s softverskim proizvodima, odr\u017eavati visoku produktivnost i stabilnost. Zavr\u0161imo ovaj \u010dlanak ilustracijama koje prikazuju kako izgleda njihov novi pristup. Imajte na umu da se uglavnom bavimo aplikacijama i servisima, no GitOps se mo\u017ee koristiti za upravljanje cijelom platformom.<\/p>\n<h3>Model rada za Kubernetes<\/h3>\n<p>\nPogledajte sljede\u0107u dijagramu. Ona prikazuje Git i spremi\u0161te slika kontejnera kao zajedni\u010dke resurse za dva orkestrirana \u017eivotna ciklusa:<\/p>\n<ul>\n<li> Pipeline kontinuirane integracije, koji \u010dita i zapisuje datoteke u Git i mo\u017ee a\u017eurirati spremi\u0161te kontejnerskih slika.<\/li>\n<li> Pipeline Runtime GitOps, koji kombinira implementaciju s upravljanjem i nadgledanjem. On \u010dita i zapisuje datoteke u Git i mo\u017ee u\u010ditati slike kontejnera.<\/li>\n<\/ul>\n<h3>Koji su glavni zaklju\u010dci?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Razdvajanje problema<\/b>: Imajte na umu da oba pipelinea mogu razmjenjivati podatke samo a\u017euriranjem Gita ili spremi\u0161ta slika. Drugim rije\u010dima, postoji vatrozid izme\u0111u CI i runtime okru\u017eenja. Nazivamo ga 'vatrozidom nepromjenjivosti' <i>(immutability firewall)<\/i>, budu\u0107i da sve novosti u spremi\u0161tima stvaraju nove verzije. Za dodatne informacije o ovoj temi, obratite se slajdovima 72-87 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">ove prezentacije<\/a><\/noindex>.<\/li>\n<li> <b>Mo\u017ee se koristiti bilo koji CI i Git poslu\u017eitelj<\/b>: GitOps radi s bilo kojim komponentama. Mo\u017eete nastaviti koristiti svoje omiljene CI i Git poslu\u017eitelje, spremi\u0161ta slika i testne skupove. Gotovo svi ostali alati za kontinuiranu isporuku na tr\u017ei\u0161tu zahtijevaju vlastiti CI\/Git poslu\u017eitelj ili spremi\u0161te slika. To mo\u017ee postati ograni\u010davaju\u0107i faktor u razvoju cloud native. U slu\u010daju GitOps-a mo\u017eete koristiti alate na koje ste navikli.<\/li>\n<li> <b>Doga\u0111aji kao alat za integraciju<\/b>: \u010cim se podaci u Gitu a\u017euriraju, Weave Flux (ili Weave Cloud operator) obavje\u0161tava o tome runtime. Svaki put kada Kubernetes prihvati skup promjena, Git se a\u017eurira. To osigurava jednostavan model integracije za organizaciju radnih procesa za GitOps, kao \u0161to je prikazano u nastavku.<\/li>\n<\/ol>\n<h2>Zaklju\u010dak<\/h2>\n<p>\nGitOps pru\u017ea zna\u010dajna jamstva a\u017euriranja potrebna svakom modernom CI\/CD alatu:<\/p>\n<ul>\n<li> automacija;<\/li>\n<li> konvergencija;<\/li>\n<li> idempotentnost;<\/li>\n<li> determinizam.<\/li>\n<\/ul>\n<p>\nTo je va\u017eno jer nudi operativni model za programere u podru\u010dju cloud native.<\/p>\n<ul>\n<li> Tradicionalni alati za upravljanje i nadzor sustava povezani su s timovima za operacije koji djeluju unutar runbooka <i>(skupa rutinskih postupaka i operacija \u2014 nap. prev.)<\/i>, vezanog za odre\u0111eni deployment.<\/li>\n<li> U upravljanju cloud native sustavima, alati za nadzor su najbolji na\u010din za procjenu rezultata isporuka kako bi se tim programera mogao brzo prilagoditi.<\/li>\n<\/ul>\n<p>\nZamislite brojne klastere rasprostranjene preko raznih oblaka i mno\u0161tvo usluga s vlastitim timovima i planovima isporuka. GitOps nudi skalabilan model za upravljanje tom raznoliko\u0161\u0107u.<\/p>\n<h2>P.S. od prevodioca<\/h2>\n<p>\nPro\u010ditajte i na na\u0161em blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: usporedba Pull i Push metoda<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Predstavljamo biblioteku kubedog za pra\u0107enje resursa Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Pro\u0161irujemo i nadopunjavamo Kubernetes (pregled i video prezentacije)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Samo registrirani korisnici mogu sudjelovati u anketi. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Prijavite se<\/a><\/noindex>, molimo.<\/p>\n<h2 class=\"default-block__polling-title\">Jeste li znali za GitOps prije nego \u0161to su ova dva prijevoda objavljena na Habra?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Da, sve sam znao(la)<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Samo povremeno<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ne<\/p>\n<\/li>\n<\/ul>\n<p>    Glasalo je 35 korisnika. Uzdr\u017ealo se 10 korisnika.<br \/>\n<br \/>Izvor: <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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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\udd47\u0160to je GitOps? | ProHoster","description":"Prim.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}