{"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\/pt\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"O que \u00e9 GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Nota do tradutor.<\/b>: Ap\u00f3s uma publica\u00e7\u00e3o recente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">de conte\u00fado<\/a><\/noindex> , sobre os m\u00e9todos pull e push em GitOps, notamos um interesse crescente por esse modelo de forma geral; no entanto, h\u00e1 muito poucas publica\u00e7\u00f5es em russo sobre o assunto (n\u00e3o h\u00e1 nenhuma no Habr). Portanto, estamos felizes em apresentar a tradu\u00e7\u00e3o de outro artigo \u2014 embora j\u00e1 quase um ano velho! \u2014 da empresa Weaveworks, cujo fundador criou o termo \"GitOps\". O texto explica a ess\u00eancia da abordagem e as principais diferen\u00e7as em rela\u00e7\u00e3o ao que j\u00e1 existe.<\/i><\/p>\n<p>\nUm ano atr\u00e1s, publicamos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">uma introdu\u00e7\u00e3o ao GitOps<\/a><\/noindex>. Naquela ocasi\u00e3o, contamos como a equipe da Weaveworks lan\u00e7ou um SaaS inteiramente baseado em Kubernetes e desenvolveu um conjunto de melhores pr\u00e1ticas prescritivas para implanta\u00e7\u00e3o, gerenciamento e monitoramento em ambientes cloud native.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>O artigo se tornou popular. Outras pessoas come\u00e7aram a falar sobre GitOps, passaram a publicar novas ferramentas para <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\">desenvolvimento<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">de segredos<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">fun\u00e7\u00f5es<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">integra\u00e7\u00e3o cont\u00ednua<\/a><\/noindex> etc. Em nosso site, surgiram <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">guias de configura\u00e7\u00e3o<\/a><\/noindex> publica\u00e7\u00f5es e casos de uso do GitOps. Mas algumas pessoas ainda tinham d\u00favidas. Como o modelo se diferencia do tradicional <noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">infrastructure as code<\/a><\/noindex> e da entrega cont\u00ednua (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">continuous delivery<\/a><\/noindex>)? \u00c9 absolutamente necess\u00e1rio usar Kubernetes?<\/p>\n<p>Logo percebemos que era necess\u00e1rio uma nova descri\u00e7\u00e3o, oferecendo:<\/p>\n<ol>\n<li> Uma grande quantidade de exemplos e hist\u00f3rias;<\/li>\n<li> Uma defini\u00e7\u00e3o concreta de GitOps;<\/li>\n<li> Uma compara\u00e7\u00e3o com a entrega cont\u00ednua tradicional.<\/li>\n<\/ol>\n<p>\nNeste artigo, tentamos abordar todos esses temas. Voc\u00ea encontrar\u00e1 uma introdu\u00e7\u00e3o atualizada ao GitOps e uma perspectiva dele do ponto de vista de desenvolvedores e CI\/CD. Focamos principalmente em Kubernetes, embora o modelo possa ser generalizado.<\/p>\n<h2>Conhe\u00e7a: GitOps<\/h2>\n<p>\nImagine Alice. She runs Family Insurance, offering health, auto, real estate, and travel insurance policies to people who are too busy to delve into the intricacies of contracts themselves. Her business started as a side project while Alice worked at a bank as a data scientist. One day she realized that she could use advanced computer algorithms for more effective data analysis and the creation of insurance packages. Investors funded the project, and now her company generates over $20 million a year and is rapidly growing. Currently, 180 people work there in various positions, including a tech team responsible for the development, maintenance of the website, database, and customer base analysis. The team of 60 is led by Bob, the company's CTO.<\/p>\n<p>Bob's team deploys production systems in the cloud. Their main applications run on GKE, taking advantage of Kubernetes on Google Cloud. Additionally, they use various data and analytics tools in their work.<\/p>\n<p>A Family Insurance n\u00e3o planejava usar containers, mas acabou se empolgando com o Docker. Logo, os especialistas da empresa descobriram que o GKE permite implantar clusters para testar novas funcionalidades de forma f\u00e1cil e descomplicada. Jenkins foi adicionado para CI e Quay para organizar o registro de containers, e scripts para Jenkins foram escritos para fazer push de novos containers e configura\u00e7\u00f5es no GKE.<\/p>\n<p>Depois de algum tempo, Alice e Bob ficaram decepcionados com o desempenho da abordagem escolhida e seu impacto nos neg\u00f3cios. A implementa\u00e7\u00e3o de containers n\u00e3o melhorou o desempenho tanto quanto a equipe esperava. \u00c0s vezes, os deployments falhavam, e n\u00e3o estava claro se isso era culpa das mudan\u00e7as no c\u00f3digo. Tamb\u00e9m foi dif\u00edcil acompanhar as altera\u00e7\u00f5es nas configura\u00e7\u00f5es. Muitas vezes, era necess\u00e1rio criar um novo cluster e mover os aplicativos para ele, pois isso era a forma mais f\u00e1cil de limpar a bagun\u00e7a em que o sistema se tornou. Alice temia que a situa\u00e7\u00e3o piorasse \u00e0 medida que o aplicativo evolu\u00edsse (al\u00e9m disso, um novo projeto de aprendizado de m\u00e1quina estava se aproximando). Bob automatizou a maior parte do trabalho e n\u00e3o entendia por que o pipeline ainda era inst\u00e1vel, escalava mal e ocasionalmente exigia interven\u00e7\u00e3o manual.<\/p>\n<p><b>Ent\u00e3o, eles ouviram falar do GitOps. Essa solu\u00e7\u00e3o se mostrou exatamente o que precisavam para avan\u00e7ar com confian\u00e7a.<\/b><\/p>\n<p>Alice e Bob j\u00e1 ouviam h\u00e1 anos sobre workflows baseados em Git, DevOps e infraestrutura como c\u00f3digo. A singularidade do GitOps \u00e9 que ele traz uma s\u00e9rie de melhores pr\u00e1ticas \u2014 rigorosas e normativas \u2014 para a implementa\u00e7\u00e3o dessas ideias no contexto do Kubernetes. Esse assunto <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">foi levantado repetidamente<\/a><\/noindex>, inclusive no <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">blog da Weaveworks.<\/a><\/noindex>.<\/p>\n<p>A Family Insurance decide implementar GitOps. Agora, a empresa possui um modelo de opera\u00e7\u00e3o automatizado, compat\u00edvel com Kubernetes e que combina <i>a velocidade<\/i> com um <i>estabilidade<\/i>, uma vez que eles:<\/p>\n<ul>\n<li> descobriram que a produtividade da equipe dobrou e ningu\u00e9m enlouquece com isso;<\/li>\n<li> pararam de gerenciar scripts. Em vez disso, agora podem se concentrar em novas funcionalidades e aprimorar as pr\u00e1ticas de engenharia \u2014 por exemplo, implementar deploys de can\u00e1rio e melhorar os testes;<\/li>\n<li> aperfei\u00e7oaram o processo de deployment \u2014 agora ele raramente falha;<\/li>\n<li> obteve a capacidade de restaurar deployments ap\u00f3s falhas parciais sem interven\u00e7\u00e3o manual;<\/li>\n<li> adquiriram b<i>maior<\/i>largura de confian\u00e7a nos sistemas de entrega. Alice e Bob descobriram que podiam dividir a equipe em grupos que cuidavam de microsservi\u00e7os e trabalhavam em paralelo;<\/li>\n<li> podem fazer de 30 a 50 altera\u00e7\u00f5es no projeto todos os dias com os esfor\u00e7os de cada grupo e experimentar novas t\u00e9cnicas.<\/li>\n<li> atraem facilmente novos desenvolvedores para o projeto, que j\u00e1 podem aplicar atualiza\u00e7\u00f5es em produ\u00e7\u00e3o por meio de pull requests em poucas horas;<\/li>\n<li> passam facilmente pela auditoria dentro do SOC2 <i>(em conformidade com os requisitos dos prestadores de servi\u00e7os para a gest\u00e3o segura de dados; leia mais, por exemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">aqui<\/a><\/noindex> \u2014 nota do tradutor.)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>O que aconteceu?<\/h3>\n<p>\nGitOps \u2014 s\u00e3o duas coisas:<\/p>\n<ol>\n<li> Um modelo de opera\u00e7\u00e3o para Kubernetes e cloud native. Ele fornece um conjunto de melhores pr\u00e1ticas para a implanta\u00e7\u00e3o, gest\u00e3o e monitoramento de clusters e aplicativos empacotados em cont\u00eaineres. Uma defini\u00e7\u00e3o elegante em forma de <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">um \u00fanico slide<\/a><\/noindex> de <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> O caminho para criar um ambiente orientado a desenvolvedores para gest\u00e3o de aplicativos. Aplicamos o fluxo de trabalho do Git tanto para opera\u00e7\u00f5es quanto para desenvolvimento. Note que n\u00e3o se trata apenas de Git push, mas de organizar todo o conjunto de ferramentas de CI\/CD e UI\/UX.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Algumas palavras sobre o Git<\/h3>\n<p>\nSe voc\u00ea n\u00e3o est\u00e1 familiarizado com sistemas de controle de vers\u00e3o e o fluxo de trabalho baseado em Git, n\u00f3s recomendamos fortemente que voc\u00ea os estude. No come\u00e7o, trabalhar com branches e pull requests pode parecer m\u00e1gica negra, mas os benef\u00edcios valem o esfor\u00e7o. Aqui est\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">um bom artigo<\/a><\/noindex> para come\u00e7ar.<\/p>\n<h2>Como funciona o Kubernetes<\/h2>\n<p>\nNa nossa hist\u00f3ria, Alice e Bob recorreram ao GitOps ap\u00f3s trabalharem um tempo com Kubernetes. De fato, o GitOps est\u00e1 intimamente relacionado ao Kubernetes \u2014 \u00e9 um modelo de opera\u00e7\u00e3o para infraestrutura e aplicativos baseados em Kubernetes.<\/p>\n<h3>O que o Kubernetes oferece aos usu\u00e1rios?<\/h3>\n<p>\nAqui est\u00e3o algumas das principais funcionalidades:<\/p>\n<ol>\n<li> No modelo Kubernetes, tudo pode ser descrito de forma declarativa.<\/li>\n<li> O servidor API do Kubernetes aceita essa declara\u00e7\u00e3o como entrada e, em seguida, tenta constantemente levar o cluster ao estado descrito na declara\u00e7\u00e3o.<\/li>\n<li> As declara\u00e7\u00f5es s\u00e3o suficientes para descrever e gerenciar uma ampla variedade de cargas de trabalho \u2014 \"aplicativos\".<\/li>\n<li> Como resultado, as altera\u00e7\u00f5es no aplicativo e no cluster ocorrem devido a:\n<ul>\n<li> altera\u00e7\u00f5es nas imagens dos cont\u00eaineres;<\/li>\n<li> altera\u00e7\u00f5es na especifica\u00e7\u00e3o declarativa;<\/li>\n<li> erros no ambiente \u2014 por exemplo, falhas em cont\u00eaineres.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>As magn\u00edficas capacidades de converg\u00eancia do Kubernetes<\/h3>\n<p>\nQuando um administrador faz altera\u00e7\u00f5es na configura\u00e7\u00e3o, o orquestrador do Kubernetes as aplicar\u00e1 ao cluster at\u00e9 que seu estado <i>se aproxime da nova configura\u00e7\u00e3o<\/i>. Este modelo funciona para qualquer recurso do Kubernetes e se expande com Custom Resource Definitions (CRDs). Portanto, os deployments do Kubernetes possuem as seguintes propriedades incr\u00edveis:<\/p>\n<ul>\n<li> <b>Automa\u00e7\u00e3o<\/b>: as atualiza\u00e7\u00f5es do Kubernetes fornecem um mecanismo para automatizar o processo de aplica\u00e7\u00e3o de altera\u00e7\u00f5es de forma correta e pontual.<\/li>\n<li> <b>Converg\u00eancia<\/b>: o Kubernetes continuar\u00e1 tentando atualiza\u00e7\u00f5es at\u00e9 alcan\u00e7ar o sucesso.<\/li>\n<li> <b>Idempot\u00eancia<\/b>: reaplica\u00e7\u00f5es da converg\u00eancia levam ao mesmo resultado.<\/li>\n<li> <b>Determinismo<\/b>: dado recursos suficientes, o estado do cluster atualizado depende apenas do estado desejado.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Como funciona o GitOps<\/h2>\n<p>\nAprendemos o suficiente sobre o Kubernetes para explicar os princ\u00edpios do GitOps.<\/p>\n<p>Vamos voltar para as equipes de Family Insurance que lidam com microsservi\u00e7os. O que elas costumam fazer? Confira a lista abaixo (se algum dos itens parecer estranho ou desconhecido \u2014 por favor, aguarde antes de criticar e fique conosco). Esses s\u00e3o apenas exemplos de fluxos de trabalho baseados em Jenkins. Existem muitos outros processos com outras ferramentas.<\/p>\n<p>O principal \u00e9 que vemos que cada atualiza\u00e7\u00e3o resulta em altera\u00e7\u00f5es nos arquivos de configura\u00e7\u00e3o e nos reposit\u00f3rios Git. Essas altera\u00e7\u00f5es no Git fazem com que o \u2018operador GitOps\u2019 atualize o cluster:<\/p>\n<p>1. Fluxo de trabalho: \u201c<i>Build do Jenkins \u2014 branch master<\/i>\u00bb.<br \/>\nLista de tarefas:<\/p>\n<ul>\n<li> Jenkins faz push de imagens marcadas para o Quay;<\/li>\n<li> Jenkins faz push de configura\u00e7\u00f5es e helm charts para o bucket do reposit\u00f3rio master;<\/li>\n<li> Uma fun\u00e7\u00e3o em nuvem copia a configura\u00e7\u00e3o e os charts do bucket do reposit\u00f3rio master para o reposit\u00f3rio Git master;<\/li>\n<li> O operador GitOps atualiza o cluster.<\/li>\n<\/ul>\n<p>\n2. <i>Build do Jenkins \u2014 branch release ou hotfix<\/i>:<\/p>\n<ul>\n<li> Jenkins faz push de imagens n\u00e3o marcadas para o Quay;<\/li>\n<li> Jenkins faz push de configura\u00e7\u00f5es e helm charts para o bucket do reposit\u00f3rio staging;<\/li>\n<li> Uma fun\u00e7\u00e3o em nuvem copia a configura\u00e7\u00e3o e os charts do bucket do reposit\u00f3rio staging para o reposit\u00f3rio Git staging;<\/li>\n<li> O operador GitOps atualiza o cluster.<\/li>\n<\/ul>\n<p>\n3. <i>Build do Jenkins \u2014 branch develop ou feature<\/i>:<\/p>\n<ul>\n<li> Jenkins faz push de imagens n\u00e3o marcadas para o Quay;<\/li>\n<li> Jenkins faz push de configura\u00e7\u00f5es e helm charts para o bucket do reposit\u00f3rio develop;<\/li>\n<li> Uma fun\u00e7\u00e3o em nuvem copia a configura\u00e7\u00e3o e os charts do bucket do reposit\u00f3rio develop para o reposit\u00f3rio Git develop;<\/li>\n<li>O operador GitOps atualiza o cluster.<\/li>\n<\/ul>\n<p>\n4. <i>Adicionando um novo cliente<\/i>:<\/p>\n<ul>\n<li> O gerente ou administrador (LCM\/ops) chama o Gradle para o primeiro deploy e configura\u00e7\u00e3o dos balanceadores de carga (NLB);<\/li>\n<li> LCM\/ops comita uma nova configura\u00e7\u00e3o para preparar o deployment para atualiza\u00e7\u00f5es;<\/li>\n<li> O operador GitOps atualiza o cluster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Breve descri\u00e7\u00e3o do GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Descreva o estado desejado de todo o sistema, utilizando especifica\u00e7\u00f5es declarativas para cada ambiente (na nossa hist\u00f3ria, a equipe do Bob define toda a configura\u00e7\u00e3o do sistema no Git).\n<ul>\n<li> O reposit\u00f3rio Git \u00e9 a \u00fanica fonte de verdade em rela\u00e7\u00e3o ao estado desejado de todo o sistema.<\/li>\n<li> Todas as mudan\u00e7as no estado desejado s\u00e3o feitas por meio de commits no Git.<\/li>\n<li> Todos os par\u00e2metros desejados do cluster tamb\u00e9m s\u00e3o observ\u00e1veis no pr\u00f3prio cluster. Assim, podemos determinar se os estados desejados e observ\u00e1veis convergem, <i>converge<\/i>) ou divergem, <i>diverge<\/i>) dos estados desejado e observado.<\/li>\n<\/ul>\n<\/li>\n<li> Se os estados desejado e observado diferem, ent\u00e3o:\n<ul>\n<li> H\u00e1 um mecanismo de converg\u00eancia que, mais cedo ou mais tarde, sincroniza automaticamente os estados alvo e observado. Dentro do cluster, isso \u00e9 tratado pelo Kubernetes.<\/li>\n<li> O processo \u00e9 iniciado imediatamente com a notifica\u00e7\u00e3o \"change committed\".<\/li>\n<li> Ap\u00f3s um intervalo de tempo configur\u00e1vel, pode ser enviada uma notifica\u00e7\u00e3o \"diff\", caso os estados estejam diferentes.<\/li>\n<\/ul>\n<\/li>\n<li> Assim, todos os commits no Git provocam atualiza\u00e7\u00f5es verific\u00e1veis e idempotentes no cluster.\n<ul>\n<li>Um rollback \u00e9 uma converg\u00eancia para um estado desejado anterior.<\/li>\n<\/ul>\n<\/li>\n<li> A converg\u00eancia \u00e9 final. Sua ocorr\u00eancia \u00e9 sinalizada por:\n<ul>\n<li> Aus\u00eancia de notifica\u00e7\u00f5es \"diff\" durante um determinado intervalo de tempo.<\/li>\n<li> Notifica\u00e7\u00e3o \"converged\" (por exemplo, webhook, evento de grava\u00e7\u00e3o no Git).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>O que \u00e9 diverg\u00eancia?<\/h3>\n<p>\nRepetindo mais uma vez: <i>todas as propriedades desejadas do cluster devem ser observ\u00e1veis no pr\u00f3prio cluster.<\/i>.<\/p>\n<p>Alguns exemplos de diverg\u00eancia:<\/p>\n<ul>\n<li> Mudan\u00e7a em um arquivo de configura\u00e7\u00e3o devido a um merge de branches no Git.<\/li>\n<li> Mudan\u00e7a em um arquivo de configura\u00e7\u00e3o devido a um commit no Git, feito por um cliente GUI.<\/li>\n<li> M\u00faltiplas altera\u00e7\u00f5es no estado desejado devido a um PR no Git, seguido pela constru\u00e7\u00e3o de uma imagem de container e altera\u00e7\u00f5es na configura\u00e7\u00e3o.<\/li>\n<li> Mudan\u00e7a no estado do cluster devido a um erro, conflito de recursos causando \"comportamento indesejado\", ou simplesmente um desvio acidental do estado original.<\/li>\n<\/ul>\n<p><\/p>\n<h3>O que representa um mecanismo de converg\u00eancia?<\/h3>\n<p>\nAlguns exemplos:<\/p>\n<ul>\n<li> Para containers e clusters, o mecanismo de converg\u00eancia \u00e9 fornecido pelo Kubernetes.<\/li>\n<li> O mesmo mecanismo pode ser usado para gerenciar aplica\u00e7\u00f5es e constru\u00e7\u00f5es baseadas em Kubernetes (por exemplo, Istio e Kubeflow).<\/li>\n<li> O mecanismo para gerenciar a intera\u00e7\u00e3o de trabalho entre Kubernetes, reposit\u00f3rios de imagens e Git fornece <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">o operador GitOps Weave Flux<\/a><\/noindex>, que \u00e9 parte de <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> Para m\u00e1quinas b\u00e1sicas, o mecanismo de converg\u00eancia deve ser declarativo e aut\u00f4nomo. Pela nossa experi\u00eancia, podemos dizer que <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> est\u00e1 mais pr\u00f3ximo dessa defini\u00e7\u00e3o, embora ainda exija controle humano. Nesse sentido, o GitOps expande as tradi\u00e7\u00f5es do Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nO GitOps combina o Git com um excelente mecanismo de converg\u00eancia do Kubernetes, oferecendo um modelo para opera\u00e7\u00e3o.<\/p>\n<p>O GitOps nos permite afirmar: <i>sistemas que podem ser descritos e monitorados s\u00e3o os \u00fanicos pass\u00edveis de automa\u00e7\u00e3o e controle<\/i>.<\/p>\n<h3>O GitOps \u00e9 destinado a toda a pilha cloud native (por exemplo, Terraform, etc.)<\/h3>\n<p>\nO GitOps n\u00e3o se limita ao Kubernetes. Queremos que todo o sistema seja gerido de forma declarativa e utilize a converg\u00eancia. Por todo o sistema, entendemos o conjunto de ambientes que operam com Kubernetes \u2014 por exemplo, 'dev cluster 1', 'produ\u00e7\u00e3o', etc. Cada ambiente inclui m\u00e1quinas, clusters, aplicativos e interfaces para servi\u00e7os externos que fornecem dados, monitoramento, etc.<\/p>\n<p>Note como o Terraform \u00e9 crucial para o problema de bootstrapping. O Kubernetes precisa estar implementado em algum lugar, e o uso do Terraform significa que podemos aplicar os mesmos fluxos de trabalho GitOps para criar uma camada de controle subjacente ao Kubernetes e aos aplicativos. Essa \u00e9 uma boa pr\u00e1tica \u00fatil.<\/p>\n<p>H\u00e1 uma grande \u00eanfase na aplica\u00e7\u00e3o dos conceitos de GitOps \u00e0s camadas sobre o Kubernetes. At\u00e9 o momento, existem solu\u00e7\u00f5es do tipo GitOps para Istio, Helm, Ksonnet, OpenFaaS e Kubeflow, bem como, por exemplo, para Pulumi, que criam uma camada para o desenvolvimento de aplicativos cloud native.<\/p>\n<h2>Kubernetes CI\/CD: compara\u00e7\u00e3o do GitOps com outras abordagens<\/h2>\n<p>\nComo mencionado, o GitOps \u00e9 duas coisas:<\/p>\n<ol>\n<li> Um modelo de opera\u00e7\u00e3o para Kubernetes e cloud native, descrito acima.<\/li>\n<li> Um caminho para organizar um ambiente orientado a desenvolvedores para gerenciar aplicativos.<\/li>\n<\/ol>\n<p>\nPara muitos, GitOps \u00e9, acima de tudo, um fluxo de trabalho baseado em commits do Git. N\u00f3s tamb\u00e9m gostamos disso. Mas n\u00e3o \u00e9 s\u00f3 isso: agora vamos dar uma olhada nos pipelines de CI\/CD.<\/p>\n<h3>O GitOps fornece implanta\u00e7\u00e3o cont\u00ednua (CD) para Kubernetes<\/h3>\n<p>\nO GitOps oferece um mecanismo de implanta\u00e7\u00e3o cont\u00ednua que elimina a necessidade de 'sistemas de gerenciamento de implanta\u00e7\u00f5es' separados. Todo o trabalho \u00e9 realizado pelo Kubernetes.<\/p>\n<ul>\n<li> A atualiza\u00e7\u00e3o de um aplicativo requer uma atualiza\u00e7\u00e3o no Git. Essa \u00e9 uma atualiza\u00e7\u00e3o transacional para o estado desejado. O 'desdobramento' \u00e9 ent\u00e3o realizado dentro do cluster pelo pr\u00f3prio Kubernetes com base na descri\u00e7\u00e3o atualizada.<\/li>\n<li> Devido \u00e0 especificidade do funcionamento do Kubernetes, essas atualiza\u00e7\u00f5es s\u00e3o convergentes. Isso garante um mecanismo para desdobramentos cont\u00ednuos, onde todas as atualiza\u00e7\u00f5es s\u00e3o at\u00f4micas.<\/li>\n<li> Nota: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> oferece um operador GitOps, que integra Git e Kubernetes e permite a execu\u00e7\u00e3o de CD por meio da concilia\u00e7\u00e3o do estado desejado e atual do cluster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Sem kubectl e scripts<\/h3>\n<p>\nDeve-se evitar o uso do kubectl para atualizar o cluster, especialmente scripts para agrupar comandos kubectl. Em vez disso, atrav\u00e9s do pipeline GitOps, o usu\u00e1rio pode atualizar seu cluster Kubernetes via Git.<\/p>\n<p>As vantagens incluem:<\/p>\n<ol>\n<li> <b>Corretude<\/b>. Um grupo de atualiza\u00e7\u00f5es pode ser aplicado, convergido e, finalmente, validado, nos aproximando do objetivo de desdobramento at\u00f4mico. Em contrapartida, o uso de scripts n\u00e3o oferece garantias de converg\u00eancia (mais sobre isso abaixo).<\/li>\n<li> <b>Seguran\u00e7a<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Citando<\/a><\/noindex> Kelsey Hightower: \"Restringa o acesso ao cluster Kubernetes \u00e0s ferramentas de automa\u00e7\u00e3o e administradores, cuja responsabilidade \u00e9 depurar ou manter sua opera\u00e7\u00e3o\". Veja tamb\u00e9m <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">minha publica\u00e7\u00e3o<\/a><\/noindex> sobre seguran\u00e7a e conformidade t\u00e9cnica, bem como <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">um artigo sobre a invas\u00e3o do Homebrew<\/a><\/noindex> por meio do roubo de credenciais em um script Jenkins descuidado.<\/li>\n<li> <b>Experi\u00eancia do usu\u00e1rio<\/b>. O kubectl exp\u00f5e a mec\u00e2nica do modelo de objeto do Kubernetes, que \u00e9 bastante complexa. Idealmente, os usu\u00e1rios devem interagir com o sistema em um n\u00edvel mais alto de abstra\u00e7\u00e3o. Aqui, vou referenciar Kelsey novamente e recomendar a leitura <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">dessa s\u00edntese<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>A diferen\u00e7a entre CI e CD<\/h3>\n<p>\nGitOps melhora os modelos existentes de CI\/CD.<\/p>\n<p>Um servidor CI moderno \u00e9 uma ferramenta para orquestra\u00e7\u00e3o. Em particular, \u00e9 uma ferramenta para orquestrar pipelines de CI. Eles incluem build, teste, merge para trunk, etc. Os servidores CI automatizam o gerenciamento de pipelines complexos e de m\u00faltiplas etapas. Uma tenta\u00e7\u00e3o comum \u00e9 criar um script para um conjunto de atualiza\u00e7\u00f5es do Kubernetes e execut\u00e1-lo como parte do pipeline para push de mudan\u00e7as no cluster. De fato, muitos profissionais fazem assim. No entanto, isso n\u00e3o \u00e9 ideal, e eis o porqu\u00ea.<\/p>\n<p>O CI deve ser usado para implementar atualiza\u00e7\u00f5es no trunk, e o cluster Kubernetes deve se atualizar com base nessas atualiza\u00e7\u00f5es para gerenciar o CD \"internamente\". N\u00f3s chamamos isso de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">modelo pull para CD<\/a><\/noindex>, ao contr\u00e1rio do modelo push do CI. O CD \u00e9 parte da <i>orquestra\u00e7\u00e3o em tempo de execu\u00e7\u00e3o.<\/i>.<\/p>\n<h3>Por que os servidores CI n\u00e3o devem realizar CD por meio de atualiza\u00e7\u00f5es diretas no Kubernetes?<\/h3>\n<p>\n<i>N\u00e3o use o servidor CI para orquestrar atualiza\u00e7\u00f5es diretas no Kubernetes em forma de um conjunto de tarefas CI. Este \u00e9 um anti-padr\u00e3o sobre o qual n\u00f3s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">j\u00e1 comentamos<\/a><\/noindex> em nosso blog.<\/i><\/p>\n<p>Vamos voltar a Alice e Bob.<\/p>\n<p>Quais problemas eles enfrentaram? O servidor CI de Bob aplica as mudan\u00e7as ao cluster, mas se ele falhar durante o processo, Bob n\u00e3o saber\u00e1 em que estado est\u00e1 (ou deveria estar) o cluster e como corrigi-lo. O mesmo se aplica no caso de sucesso.<\/p>\n<p>Vamos supor que a equipe do Bob tenha constru\u00eddo uma nova imagem e ent\u00e3o tenha patchado suas implanta\u00e7\u00f5es para desdobrar a imagem (tudo isso a partir do pipeline de CI).<\/p>\n<p>Se a imagem for criada corretamente, mas o pipeline falhar, a equipe ter\u00e1 que descobrir:<\/p>\n<ul>\n<li> A atualiza\u00e7\u00e3o foi implantada?<\/li>\n<li> Estamos executando uma nova build? Isso levar\u00e1 a efeitos colaterais indesejados \u2014 com a possibilidade de ter duas builds da mesma imagem inalterada? <\/li>\n<li> Devemos esperar pela pr\u00f3xima atualiza\u00e7\u00e3o antes de executar a build?<\/li>\n<li> O que exatamente deu errado? Quais passos precisam ser repetidos (e quais deles podem ser repetidos com seguran\u00e7a)?<\/li>\n<\/ul>\n<p>\n<i>Organizar um fluxo de trabalho baseado em Git n\u00e3o garante que a equipe do Bob n\u00e3o encontrar\u00e1 esses problemas. Eles ainda podem cometer um erro ao fazer push de um commit, com a tag ou qualquer outro par\u00e2metro; no entanto, essa abordagem \u00e9 muito mais pr\u00f3xima do expl\u00edcito 'tudo ou nada'.<\/i><\/p>\n<p>Resumindo, aqui est\u00e1 o motivo pelo qual os servidores CI n\u00e3o devem lidar com CD:<\/p>\n<ul>\n<li> Os scripts de atualiza\u00e7\u00e3o n\u00e3o s\u00e3o sempre determin\u00edsticos; \u00e9 f\u00e1cil cometer erros com eles.<\/li>\n<li> Os servidores CI n\u00e3o se convergem para um modelo declarativo de cluster.<\/li>\n<li> \u00c9 dif\u00edcil garantir idempot\u00eancia. Os usu\u00e1rios precisam entender a sem\u00e2ntica profunda do sistema.<\/li>\n<li> \u00c9 mais dif\u00edcil realizar a recupera\u00e7\u00e3o ap\u00f3s uma falha parcial.<\/li>\n<\/ul>\n<p>\n<i>Nota sobre o Helm: se voc\u00ea deseja usar o Helm, recomendamos combin\u00e1-lo com um operador GitOps como <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>. Isso ajudar\u00e1 a garantir a converg\u00eancia. O Helm por si s\u00f3 n\u00e3o \u00e9 nem determin\u00edstico nem at\u00f4mico.<\/i><\/p>\n<h2>GitOps como a melhor maneira de realizar Continuous Delivery para Kubernetes<\/h2>\n<p>\nA equipe de Alice e Bob implementa GitOps e descobre que \u00e9 muito mais f\u00e1cil trabalhar com produtos de software, mantendo um alto desempenho e estabilidade. Vamos finalizar este artigo com ilustra\u00e7\u00f5es que mostram como \u00e9 a nova abordagem deles. Tenha em mente que estamos falando principalmente sobre aplicativos e servi\u00e7os, mas GitOps pode ser usado para gerenciar toda a plataforma.<\/p>\n<h3>Modelo de opera\u00e7\u00e3o para Kubernetes<\/h3>\n<p>\nVeja o pr\u00f3ximo diagrama. Ele representa Git e o reposit\u00f3rio de imagens de containers como recursos comuns para dois ciclos de vida orquestrados:<\/p>\n<ul>\n<li> O pipeline de integra\u00e7\u00e3o cont\u00ednua, que l\u00ea e grava arquivos no Git e pode atualizar o reposit\u00f3rio de imagens de containers.<\/li>\n<li> O pipeline Runtime GitOps, que combina implanta\u00e7\u00e3o com gerenciamento e monitoramento. Ele l\u00ea e grava arquivos no Git e pode carregar imagens de containers.<\/li>\n<\/ul>\n<h3>Quais s\u00e3o as principais conclus\u00f5es?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Separa\u00e7\u00e3o de problemas<\/b>: Observe que ambos os pipelines podem trocar dados apenas atualizando o Git ou o reposit\u00f3rio de imagens. Em outras palavras, h\u00e1 um firewall entre o CI e o ambiente de runtime. Chamamos isso de \"firewall de imutabilidade\" <i>(immutability firewall)<\/i>, uma vez que todas as atualiza\u00e7\u00f5es dos reposit\u00f3rios criam novas vers\u00f5es. Para mais informa\u00e7\u00f5es sobre este assunto, consulte os slides 72-87 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">desta apresenta\u00e7\u00e3o<\/a><\/noindex>.<\/li>\n<li> <b>Qualquer servidor CI e Git pode ser utilizado<\/b>: GitOps funciona com qualquer componente. Voc\u00ea pode continuar usando seus servidores CI e Git favoritos, reposit\u00f3rios de imagens e conjuntos de testes. Quase todas as outras ferramentas para Continuous Delivery no mercado exigem seu pr\u00f3prio servidor CI\/Git ou reposit\u00f3rio de imagens. Isso pode se tornar um fator limitante no desenvolvimento de cloud native. No caso do GitOps, voc\u00ea pode usar as ferramentas com as quais j\u00e1 est\u00e1 acostumado.<\/li>\n<li> <b>Eventos como ferramenta de integra\u00e7\u00e3o<\/b>: Assim que os dados no Git s\u00e3o atualizados, o Weave Flux (ou operador Weave Cloud) informa ao runtime. Sempre que o Kubernetes aceita um conjunto de mudan\u00e7as, o Git \u00e9 atualizado. Isso proporciona um modelo simples de integra\u00e7\u00e3o para organizar fluxos de trabalho para GitOps, como mostrado abaixo.<\/li>\n<\/ol>\n<h2>Conclus\u00e3o<\/h2>\n<p>\nGitOps fornece garantias s\u00f3lidas de atualiza\u00e7\u00e3o necess\u00e1rias para qualquer ferramenta moderna de CI\/CD:<\/p>\n<ul>\n<li> automa\u00e7\u00e3o;<\/li>\n<li> converg\u00eancia;<\/li>\n<li> idempot\u00eancia;<\/li>\n<li> determinismo.<\/li>\n<\/ul>\n<p>\nIsso \u00e9 importante, pois oferece um modelo de opera\u00e7\u00e3o para desenvolvedores na \u00e1rea de cloud native.<\/p>\n<ul>\n<li> Ferramentas tradicionais para gerenciamento e monitoramento de sistemas est\u00e3o relacionadas \u00e0s equipes de opera\u00e7\u00f5es que atuam dentro de um runbook <i>(conjunto de procedimentos e opera\u00e7\u00f5es de rotina \u2014 nota do tradutor)<\/i>, vinculado a um desdobramento espec\u00edfico.<\/li>\n<li> No gerenciamento de sistemas cloud native, as ferramentas de observa\u00e7\u00e3o s\u00e3o a melhor maneira de avaliar os resultados das implanta\u00e7\u00f5es, permitindo que a equipe de desenvolvedores reaja rapidamente.<\/li>\n<\/ul>\n<p>\nImagine m\u00faltiplos clusters distribu\u00eddos por v\u00e1rias nuvens e uma variedade de servi\u00e7os com suas pr\u00f3prias equipes e planos de implanta\u00e7\u00e3o. GitOps oferece um modelo de gerenciamento invari\u00e1vel a grande escala para gerenciar toda essa diversidade.<\/p>\n<h2>P.S. do tradutor<\/h2>\n<p>\nConfira tamb\u00e9m em nosso blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: compara\u00e7\u00e3o entre m\u00e9todos Pull e Push<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Apresentamos a biblioteca kubedog para monitoramento de recursos Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Expandindo e complementando o Kubernetes (vis\u00e3o geral e v\u00eddeo da apresenta\u00e7\u00e3o)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Apenas usu\u00e1rios registrados podem participar da pesquisa. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Entre<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">Voc\u00ea sabia sobre GitOps antes dessas duas tradu\u00e7\u00f5es no Habr?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Sim, sabia<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Apenas superficialmente<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    N\u00e3o<\/p>\n<\/li>\n<\/ul>\n<p>    35 usu\u00e1rios votaram. 10 usu\u00e1rios se abstiveram.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35941","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47O que \u00e9 GitOps? | ProHoster","description":"Nota.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-zhe-takoe-gitops","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/35941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}