O que é GitOps?

Nota perev. : Ap√≥s a recente publica√ß√£o de material sobre m√©todos pull e push no GitOps, vimos interesse nesse modelo como um todo; no entanto, havia muito poucas publica√ß√Ķes em russo sobre esse t√≥pico (elas simplesmente n√£o est√£o no hub). Portanto, temos o prazer de chamar a aten√ß√£o para a tradu√ß√£o de outro artigo - h√° quase um ano! - da empresa Weaveworks, cujo chefe cunhou o termo "GitOps". O texto explica a ess√™ncia da abordagem e as principais diferen√ßas das existentes.



Há um ano, publicamos uma introdução ao GitOps . Depois, conversamos sobre como a equipe do Weaveworks lançou o SaaS baseado em Kubernetes e desenvolveu um conjunto de práticas recomendadas prescritivas para implantar, gerenciar e monitorar em um ambiente nativo da nuvem.

O artigo acabou sendo popular. Outras pessoas come√ßaram a falar sobre GitOps, come√ßaram a publicar novas ferramentas para git push , desenvolvimento , segredos , fun√ß√Ķes , integra√ß√£o cont√≠nua etc. Um grande n√ļmero de publica√ß√Ķes e casos de uso do GitOps apareceu em nosso site. Mas algumas pessoas ainda t√™m d√ļvidas. Como o modelo difere da infraestrutura tradicional como c√≥digo e entrega cont√≠nua? √Č obrigat√≥rio usar o Kubernetes?

Logo percebemos que era necessária uma nova descrição, oferecendo:

  1. Um grande n√ļmero de exemplos e hist√≥rias;
  2. A definição específica de GitOps;
  3. Comparação com entrega contínua tradicional.

Neste artigo, tentamos abordar todos esses tópicos. Nele, você encontrará uma introdução atualizada ao GitOps e uma visão do lado dos desenvolvedores e do CI / CD. Nós nos concentramos principalmente no Kubernetes, embora o modelo possa ser generalizado.

Conheça GitOps


Imagine Alice. Ela administra a Family Insurance, uma empresa que oferece ap√≥lices de seguro de sa√ļde, carro, im√≥veis e viagens para pessoas que est√£o ocupadas demais para entender as nuances de seus contratos por conta pr√≥pria. Seu neg√≥cio come√ßou como um projeto paralelo quando Alice trabalhou no banco como cientista de dados. Uma vez que ela percebeu que poderia usar algoritmos avan√ßados de computador para analisar com mais efici√™ncia os dados e formar pacotes de seguros. Os investidores financiaram o projeto e agora sua empresa fatura mais de US $ 20 milh√Ķes por ano e est√° crescendo rapidamente. Atualmente, 180 pessoas trabalham em v√°rios cargos. Entre eles, uma equipe de tecnologia que desenvolve, mant√©m um site, um banco de dados e analisa a base de clientes. Uma equipe de 60 pessoas √© liderada por Bob, diretor t√©cnico da empresa.

A equipe de Bob está implantando sistemas de produção na nuvem. Seus principais aplicativos são executados no GKE, aproveitando o Kubernetes no Google Cloud. Além disso, eles usam várias ferramentas para trabalhar com dados e análises em seu trabalho.

O Family Insurance n√£o usaria cont√™ineres, mas estava infectado com entusiasmo por Docker. Em breve, os especialistas da empresa descobriram que o GKE facilita e facilita a implanta√ß√£o de clusters para testar novos recursos. Foram adicionados Jenkins para CI e Quay para organizar o registro de cont√™iner, foram escritos scripts para Jenkins que enviam ou novos cont√™ineres e configura√ß√Ķes no GKE.

Algum tempo se passou. Alice e Bob ficaram desapontados com o desempenho da abordagem escolhida e seu impacto nos neg√≥cios. A introdu√ß√£o de cont√™ineres n√£o aumentou a produtividade tanto quanto a equipe esperava. √Äs vezes, as implanta√ß√Ķes eram interrompidas e n√£o era claro se as altera√ß√Ķes no c√≥digo eram respons√°veis. Tamb√©m se mostrou dif√≠cil rastrear altera√ß√Ķes nas configura√ß√Ķes. Muitas vezes, era necess√°rio criar um novo cluster e mover aplicativos para ele, pois era a maneira mais f√°cil de eliminar a bagun√ßa na qual o sistema se transformou. Alice temia que a situa√ß√£o piorasse √† medida que o aplicativo se desenvolvesse (al√©m disso, um novo projeto baseado no aprendizado de m√°quina estava sendo produzido). Bob automatizou a maior parte do trabalho e n√£o entendeu por que o pipeline ainda √© inst√°vel, n√£o escala bem e requer interven√ß√£o manual de tempos em tempos?

Então eles aprenderam sobre o GitOps. Essa decisão acabou sendo exatamente o que eles precisavam para avançar com confiança.

Alice e Bob ouviram falar sobre fluxos de trabalho baseados em Git, DevOps e infraestrutura como código há anos. A singularidade do GitOps é que ele traz várias práticas recomendadas - categóricas e normativas - para implementar essas idéias no contexto do Kubernetes. Este tópico foi levantado repetidamente , inclusive no blog do Weaveworks .

O Seguro de Família decide implementar GitOps. A empresa agora possui um modelo operacional automatizado compatível com o Kubernetes que combina velocidade com estabilidade , pois:

  • descobriu que a equipe dobrou a produtividade e ningu√©m est√° ficando louco;
  • parou de executar scripts. Em vez disso, agora eles podem se concentrar em novos recursos e melhorar os m√©todos de engenharia - por exemplo, introduzir lan√ßamentos de can√°rios e melhorar os testes;
  • processo de implanta√ß√£o aprimorado - agora raramente quebra;
  • teve a oportunidade de recuperar implanta√ß√Ķes ap√≥s falhas parciais sem interven√ß√£o manual;
  • ganhou maior confian√ßa nos sistemas de suprimentos. Alice e Bob descobriram que a equipe pode ser dividida em grupos que trabalham em microsservi√ßos e trabalham em paralelo;
  • pode fazer de 30 a 50 mudan√ßas no projeto todos os dias pelos esfor√ßos de cada grupo e tentar novas t√©cnicas;
  • eles s√£o facilmente atra√≠dos para o projeto por novos desenvolvedores que t√™m a capacidade de lan√ßar atualiza√ß√Ķes na produ√ß√£o usando solicita√ß√Ķes pull em poucas horas;
  • auditado facilmente no SOC2 (para conformidade dos provedores de servi√ßos com requisitos para gerenciamento seguro de dados; leia mais, por exemplo, aqui - trad. aprox.) .

O que aconteceu


GitOps s√£o duas coisas:

  1. Modelo de opera√ß√£o para Kubernetes e nativo da nuvem. Ele fornece um conjunto de pr√°ticas recomendadas para implantar, gerenciar e monitorar clusters e aplicativos em cont√™iner. Defini√ß√£o elegante em um √ļnico slide de Luis Faceira :

  2. O caminho para criar um ambiente orientado ao desenvolvedor para gerenciar aplicativos. Aplicamos o fluxo de trabalho do Git à exploração e desenvolvimento. Observe que não se trata apenas de push do Git, mas de organizar todo o conjunto de ferramentas de CI / CD e UI / UX.

Algumas palavras sobre o Git


Se voc√™ n√£o estiver familiarizado com os sistemas de controle de vers√£o e o fluxo de trabalho baseado em Git, √© altamente recomend√°vel que voc√™ os estude. A princ√≠pio, trabalhar com solicita√ß√Ķes de ramifica√ß√Ķes e pull pode parecer magia negra, mas os profissionais valem o esfor√ßo. Aqui est√° um bom artigo para voc√™ come√ßar.

Como o Kubernetes funciona


Em nossa história, Alice e Bob se voltaram para o GitOps depois de trabalhar com o Kubernetes por um tempo. De fato, o GitOps está intimamente ligado ao Kubernetes - é um modelo operacional para a infraestrutura e aplicativos baseados no Kubernetes.

O que o Kubernetes oferece aos usu√°rios?


Aqui est√£o alguns dos principais recursos:

  1. No modelo Kubernetes, tudo pode ser descrito de forma declarativa.
  2. O servidor da API do Kubernetes aceita essa declaração como entrada e, em seguida, tenta constantemente trazer o cluster para o estado descrito na declaração.
  3. As declara√ß√Ķes s√£o suficientes para descrever e gerenciar uma ampla variedade de cargas de trabalho - "aplicativos".
  4. Como resultado, as altera√ß√Ķes no aplicativo e no cluster devem-se a:
    • altera√ß√Ķes nas imagens do cont√™iner;
    • altera√ß√Ķes na especifica√ß√£o declarativa;
    • erros no ambiente - por exemplo, travamentos de cont√™ineres.

As grandes habilidades de convergência de Kubernetes


Quando um administrador faz altera√ß√Ķes na configura√ß√£o, o orquestrador do Kubernetes as aplicar√° ao cluster at√© que seu estado se aproxime da nova configura√ß√£o . Este modelo funciona para qualquer recurso Kubernetes e se estende √†s Defini√ß√Ķes de Recursos Customizados (CRDs). Portanto, as implanta√ß√Ķes do Kubernetes t√™m as seguintes propriedades maravilhosas:

  • Automa√ß√£o : as atualiza√ß√Ķes do Kubernetes fornecem um mecanismo para automatizar o processo de aplica√ß√£o das altera√ß√Ķes corretamente e em tempo h√°bil.
  • Converg√™ncia : o Kubernetes continuar√° tentando as atualiza√ß√Ķes at√© o sucesso.
  • Idempot√™ncia : aplica√ß√Ķes repetidas de converg√™ncia produzem o mesmo resultado.
  • Determinismo : com recursos suficientes, o estado do cluster atualizado depende apenas do estado desejado.

Como o GitOps funciona


Nós aprendemos o suficiente sobre o Kubernetes para explicar como o GitOps funciona.

Vamos voltar às equipes de Seguros familiares relacionadas aos microsserviços. O que eles geralmente têm que fazer? Veja a lista abaixo (se algum ponto parecer estranho ou desconhecido - adie as críticas e fique conosco). Estes são apenas exemplos de fluxos de trabalho baseados em Jenkins. Existem muitos outros processos ao trabalhar com outras ferramentas.

O principal √© que vemos que cada atualiza√ß√£o termina com altera√ß√Ķes nos arquivos de configura√ß√£o e nos reposit√≥rios Git. Essas altera√ß√Ķes no Git fazem com que a "instru√ß√£o GitOps" atualize o cluster:

1. Fluxo de trabalho: " Jenkins Build - filial principal ".
A lista de tarefas:

  • Jenkins envia imagens marcadas no Quay;
  • Jenkins envia gr√°ficos de configura√ß√£o e Helm para o bucket de armazenamento principal;
  • A fun√ß√£o cloud copia a configura√ß√£o e os gr√°ficos do bucket de armazenamento principal para o reposit√≥rio master git;
  • A instru√ß√£o GitOps atualiza o cluster.

2. Jenkins build - release ou hotfix branch :

  • Jenkins envia imagens n√£o identificadas no Quay;
  • Jenkins envia os gr√°ficos de configura√ß√£o e Helm para o balde de armazenamento tempor√°rio;
  • A fun√ß√£o de nuvem copia a configura√ß√£o e os gr√°ficos do bucket do armazenamento tempor√°rio para o armazenamento tempor√°rio do reposit√≥rio Git;
  • A instru√ß√£o GitOps atualiza o cluster.

3. Jenkins build - ramo de desenvolvimento ou recurso :

  • Jenkins envia imagens n√£o identificadas no Quay;
  • Jenkins envia os gr√°ficos de configura√ß√£o e Helm para o dep√≥sito de desenvolvimento;
  • A fun√ß√£o de nuvem copia a configura√ß√£o e os gr√°ficos do dep√≥sito de armazenamento de desenvolvimento para o reposit√≥rio git de desenvolvimento;
  • A instru√ß√£o GitOps atualiza o cluster.

4. Adicionando um novo cliente :

  • Um gerente ou administrador (LCM / ops) chama a Gradle para implantar e configurar inicialmente os balanceadores de carga de rede (NLBs);
  • LCM / ops confirma uma nova configura√ß√£o para preparar a implanta√ß√£o para atualiza√ß√Ķes;
  • A instru√ß√£o GitOps atualiza o cluster.

Breve descrição do GitOps


  1. Descreva o estado desejado de todo o sistema usando especifica√ß√Ķes declarativas para cada ambiente (em nosso hist√≥rico, a equipe de Bob define toda a configura√ß√£o do sistema no Git).

    • O reposit√≥rio git √© a √ļnica fonte de verdade sobre o estado desejado de todo o sistema.
    • Todas as altera√ß√Ķes no estado desejado s√£o feitas atrav√©s de confirma√ß√Ķes no Git.
    • Todos os par√Ęmetros de cluster desejados tamb√©m s√£o observ√°veis ‚Äč‚Äčno pr√≥prio cluster. Assim, podemos determinar se os estados desejados e observados coincidem (convergem, convergem ) ou diferem ( divergem , divergem ).
  2. Se os estados desejados e observados forem diferentes, ent√£o:

    • Existe um mecanismo de converg√™ncia que, mais cedo ou mais tarde, sincroniza automaticamente o destino e os estados observados. Dentro do cluster, o Kubernetes faz isso.
    • O processo come√ßa imediatamente com uma notifica√ß√£o de "altera√ß√£o confirmada".
    • Ap√≥s um per√≠odo de tempo configur√°vel, um alerta de diferen√ßa pode ser enviado se os estados forem diferentes.
  3. Portanto, todas as confirma√ß√Ķes no Git acionam atualiza√ß√Ķes verific√°veis ‚Äč‚Äče idempotentes no cluster.

    • A revers√£o √© uma converg√™ncia para um estado anteriormente desejado.
  4. A convergência é final. Sobre o seu início, testemunhe:

    • Falta de alertas "diff" por um determinado per√≠odo de tempo.
    • Um alerta convergente (por exemplo, webhook, evento de write-back do Git).

O que é divergência?


Repetimos novamente: todas as propriedades desejadas do cluster devem ser observ√°veis ‚Äč‚Äčno pr√≥prio cluster .

Alguns exemplos de divergência:

  • Mudan√ßa no arquivo de configura√ß√£o devido √† mesclagem de ramifica√ß√Ķes no Git.
  • Uma altera√ß√£o no arquivo de configura√ß√£o devido a uma confirma√ß√£o no Git feita pelo cliente da GUI.
  • V√°rias altera√ß√Ķes no estado desejado devido ao PR no Git com a montagem subsequente da imagem do cont√™iner e altera√ß√Ķes na configura√ß√£o.
  • Altera√ß√£o do estado do cluster devido a um erro, conflito de recursos levando a "mau comportamento" ou apenas um desvio acidental do estado original.

O que é um mecanismo de convergência?


Alguns exemplos:

  • Para cont√™ineres e clusters, o mecanismo de converg√™ncia fornece o Kubernetes.
  • O mesmo mecanismo pode ser usado para gerenciar aplicativos e designs baseados no Kubernetes (por exemplo, Istio e Kubeflow).
  • O mecanismo para gerenciar a intera√ß√£o de trabalho entre o Kubernetes, os reposit√≥rios de imagens e o Git √© fornecido pelo operador Weave Flux GitOps , que faz parte do Weave Cloud .
  • Para m√°quinas de base, o mecanismo de converg√™ncia deve ser declarativo e aut√īnomo. De nossa pr√≥pria experi√™ncia, podemos dizer que o Terraform est√° mais pr√≥ximo dessa defini√ß√£o, mas ainda requer controle humano. Nesse sentido, o GitOps estende a tradi√ß√£o da infraestrutura como c√≥digo.

O GitOps combina o Git com o excelente mecanismo de convergência do Kubernetes, oferecendo um modelo para operação.

O GitOps nos permite declarar que apenas os sistemas que podem ser descritos e observados podem ser automatizados e controlados .

GitOps é para toda a pilha nativa da nuvem (por exemplo, Terraform etc.)


GitOps n√£o √© apenas Kubernetes. Queremos que todo o sistema seja gerenciado declarativamente e use converg√™ncia. Por um sistema inteiro, queremos dizer um conjunto de ambientes que trabalham com o Kubernetes - por exemplo, ‚Äúdev cluster 1‚ÄĚ, ‚Äúprodu√ß√£o‚ÄĚ etc. Cada ambiente inclui m√°quinas, clusters, aplicativos, bem como interfaces para servi√ßos externos que fornecem dados, monitoramento e etc.

Observe como o Terraform é importante neste caso para o problema de inicialização. O Kubernetes precisa ser implantado em algum lugar, e o uso do Terraform significa que podemos usar os mesmos fluxos de trabalho do GitOps para criar a camada de controle subjacente ao Kubernetes e aplicativos. Essa é uma boa prática recomendada.

√Č dada muita aten√ß√£o √† aplica√ß√£o dos conceitos do GitOps a camadas sobre o Kubernetes. Atualmente, existem solu√ß√Ķes 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 nativos da nuvem.

Kubernetes CI / CD: comparando GitOps com outras abordagens


Como afirmado, GitOps s√£o duas coisas:

  1. O modelo operacional para o Kubernetes e o nativo da nuvem descrito acima.
  2. O caminho para organizar um ambiente de gerenciamento de aplicativos centrado no desenvolvedor.

Para muitos, o GitOps é principalmente um fluxo de trabalho baseado em push do Git. Nós também gostamos dele. Mas isso não é tudo: vamos agora olhar para os pipelines de CI / CD.

GitOps fornece implantação contínua (CD) para Kubernetes


O GitOps oferece um mecanismo de implantação contínua que elimina a necessidade de "sistemas de gerenciamento de implantação" separados. O Kubernetes faz todo o trabalho para você.

  • A atualiza√ß√£o do aplicativo requer atualiza√ß√£o no Git. Esta √© uma atualiza√ß√£o transacional para o estado desejado. A ‚Äúimplanta√ß√£o‚ÄĚ √© realizada dentro do cluster pelo pr√≥prio Kubernetes com base em uma descri√ß√£o atualizada.
  • Devido √†s especificidades do Kubernetes, essas atualiza√ß√Ķes s√£o convergentes. Isso fornece um mecanismo para implanta√ß√£o cont√≠nua em que todas as atualiza√ß√Ķes s√£o at√īmicas.
  • Nota: O Weave Cloud oferece um operador GitOps que integra o Git e o Kubernetes e permite executar um CD, correspondendo ao estado desejado e atual do cluster.

Sem kubectl e scripts


Evite usar o Kubectl para atualizar o cluster e, especialmente, scripts para agrupar comandos do kubectl. Em vez disso, com um pipeline GitOps, um usuário pode atualizar seu cluster Kubernetes através do Git.

Os benefícios incluem:

  1. Corre√ß√£o . Um grupo de atualiza√ß√Ķes pode ser aplicado, convergido e finalmente validado, o que nos aproxima do objetivo da implanta√ß√£o at√īmica. Pelo contr√°rio, o uso de scripts n√£o oferece nenhuma garantia de converg√™ncia (mais sobre isso abaixo).
  2. Seguran√ßa Citando Kelsey Hightower: ‚ÄúLimite o acesso ao cluster Kubernetes a ferramentas de automa√ß√£o e administradores respons√°veis ‚Äč‚Äčpela depura√ß√£o ou manuten√ß√£o do mesmo‚ÄĚ. Veja tamb√©m minha publica√ß√£o sobre seguran√ßa e conformidade, bem como um artigo sobre hackers da Homebrew roubando credenciais de um script de Jenkins descuidadamente escrito.
  3. Experi√™ncia do usu√°rio . O Kubectl exp√Ķe a mec√Ęnica do modelo de objetos Kubernetes, que √© bastante complexo. Idealmente, os usu√°rios devem interagir com o sistema em um n√≠vel mais alto de abstra√ß√£o. Aqui, refiro-me novamente a Kelsey e recomendo examinar esse curr√≠culo .

A diferença entre IC e CD


O GitOps aprimora os modelos de CI / CD existentes.

O servidor de CI moderno √© um instrumento para orquestra√ß√£o. Em particular, √© um instrumento para orquestrar pipelines de IC. Eles incluem compila√ß√£o, teste, mesclagem ao tronco, etc. Os servidores de CI automatizam o gerenciamento de pipelines complexos de v√°rias etapas. Uma tenta√ß√£o comum √© criar um script para o conjunto de atualiza√ß√Ķes do Kubernetes e execut√°-lo como um elemento de pipeline para enviar altera√ß√Ķes ao cluster. De fato, √© isso que muitos especialistas fazem. No entanto, isso n√£o √© ideal, e aqui est√° o porqu√™.

O IC deve ser usado para fazer atualiza√ß√Ķes no tronco, e o cluster Kubernetes deve mudar automaticamente com base nessas atualiza√ß√Ķes para gerenciar o CD "internamente". Chamamos isso de modelo pull para o CD , diferentemente do modelo push de IC. O CD faz parte de uma orquestra√ß√£o de tempo de execu√ß√£o .

Por que os servidores de CI n√£o devem criar CDs por meio de atualiza√ß√Ķes diretas no Kubernetes


N√£o use o servidor de IC para orquestrar atualiza√ß√Ķes diretas no Kubernetes como um conjunto de tarefas de IC. Esse √© o antipadr√£o que j√° falamos em nosso blog.

Vamos voltar para Alice e Bob.

Que problemas eles encontraram? O servidor de IC de Bob aplica as altera√ß√Ķes ao cluster, mas se ele cair no processo, Bob n√£o saber√° em que estado o cluster est√° (ou deveria estar) e como corrigi-lo. O mesmo vale se for bem-sucedido.

Vamos supor que a equipe de Bob montou uma nova imagem e depois corrigiu suas implanta√ß√Ķes para implantar a imagem (todas do pipeline de IC).

Se a imagem for criada normalmente, mas o pipeline cair, a equipe precisar√° descobrir:

  • A atualiza√ß√£o foi implantada?
  • Estamos iniciando uma nova compila√ß√£o? ‚ÄĒ ?
  • , ?
  • ? ( )?

Git' , . - push' , - ; --.

, CI- CD:

  • ; .
  • CI- .
  • . .
  • .

Helm'e: Helm, GitOps-, Flux-Helm . . Helm , .

GitOps Continuous Delivery Kubernetes


GitOps , , . , , . , , GitOps .

Kubernetes


. Git :

  • , Git .
  • Runtime GitOps, . Git .



?


  1. : , , Git . , CI runtime-. ¬ę ¬Ľ (immutability firewall) , . 72-87 .
  2. CI- Git- : GitOps . CI- Git-, . Continuous Delivery CI-/Git- . cloud native. GitOps .
  3. : Git , Weave Flux ( Weave Cloud) runtime. , Kubernetes , Git . GitOps, .



Conclus√£o


GitOps , CI/CD:

  • ;
  • ;
  • ;
  • .

, cloud native.

  • , runbook' ( ‚ÄĒ . .) , deployment'.
  • cloud native- , .

, . GitOps - .

PS do tradutor


Leia também em nosso blog:

Source: https://habr.com/ru/post/pt458878/


All Articles