Tutorial: Implementar CI/CD com GitOps usando clusters Kubernetes habilitados para Azure Arc

Importante

Este tutorial usa GitOps com o Flux v1. O GitOps com Flux v2 agora está disponível para clusters Kubernetes habilitados para Azure Arc e Serviço Kubernetes do Azure (AKS); vá para o tutorial que usa GitOps com o Flux v2. Recomendamos migrar para o Flux v2 o mais rápido possível.

O suporte para recursos de configuração de cluster baseados no Flux v1 criados antes de 1º de janeiro de 2024 terminará em 24 de maio de 2025. A partir de 1º de janeiro de 2024, você não poderá criar novos recursos de configuração de cluster baseados no Flux v1.

Neste tutorial, você configurará uma solução de CI/CD usando GitOps com clusters Kubernetes habilitados para Azure Arc. Usando o aplicativo Azure Vote de exemplo, você:

  • Crie um cluster Kubernetes habilitado para Azure Arc.
  • Conecte seu aplicativo e repositórios GitOps ao Azure Repos.
  • Importe pipelines de CI/CD.
  • Conecte seu Azure Container Registry (ACR) ao Azure DevOps e Kubernetes.
  • Crie grupos de variáveis de ambiente.
  • Implante os dev ambientes e stage .
  • Teste os ambientes de aplicativos.

Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

Azure Cloud Shell

O Azure aloja o Azure Cloud Shell, um ambiente de shell interativo que pode utilizar através do seu browser. Pode utilizar o Bash ou o PowerShell com o Cloud Shell para trabalhar com os serviços do Azure. Você pode usar os comandos pré-instalados do Cloud Shell para executar o código neste artigo, sem precisar instalar nada em seu ambiente local.

Para iniciar o Azure Cloud Shell:

Opção Exemplo/Ligação
Selecione Experimentar no canto superior direito de um código ou bloco de comandos. Selecionar Experimentar não copia automaticamente o código ou comando para o Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Aceda a https://shell.azure.com ou selecione o botão Iniciar Cloud Shell para abrir o Cloud Shell no browser. Button to launch Azure Cloud Shell.
Selecione o botão Cloud Shell na barra de menus, na parte direita do portal do Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Para usar o Azure Cloud Shell:

  1. Inicie o Cloud Shell.

  2. Selecione o botão Copiar em um bloco de código (ou bloco de comando) para copiar o código ou comando.

  3. Cole o código ou comando na sessão do Cloud Shell selecionando Ctrl+Shift+V no Windows e Linux ou selecionando Cmd+Shift+V no macOS.

  4. Selecione Enter para executar o código ou comando.

Antes de começar

Este tutorial pressupõe familiaridade com o Azure DevOps, Azure Repos and Pipelines e Azure CLI.

  • Entre nos Serviços de DevOps do Azure.

  • Conclua o tutorial anterior para aprender a implantar o GitOps em seu ambiente de CI/CD.

  • Entenda os benefícios e a arquitetura desse recurso.

  • Verifique se você tem:

    • Um cluster Kubernetes habilitado para Azure Arc conectado chamado arc-cicd-cluster.
    • Um Azure Container Registry (ACR) conectado com integração AKS ou autenticação de cluster não AKS.
    • Permissões "Administrador de Compilação" e "Administrador de Projeto" para Repositórios do Azure e Pipelines do Azure.
  • Instale as seguintes extensões da CLI do Kubernetes habilitadas para Azure Arc das versões >= 1.0.0:

    az extension add --name connectedk8s
    az extension add --name k8s-configuration
    
    • Para atualizar essas extensões para a versão mais recente, execute os seguintes comandos:

      az extension update --name connectedk8s
      az extension update --name k8s-configuration
      

Importar repositório de aplicativos e GitOps para o Azure Repos

Importe um repositório de aplicativo e um repositório GitOps para o Azure Repos. Para este tutorial, use o seguinte exemplo de repositórios:

Saiba mais sobre como importar repositórios Git.

Nota

Importar e usar dois repositórios separados para repositórios de aplicativos e GitOps pode melhorar a segurança e a simplicidade. As permissões e a visibilidade do aplicativo e dos repositórios GitOps podem ser ajustadas individualmente. Por exemplo, o administrador do cluster pode não encontrar as alterações no código do aplicativo relevantes para o estado desejado do cluster. Por outro lado, um desenvolvedor de aplicativos não precisa saber os parâmetros específicos para cada ambiente - um conjunto de valores de teste que fornecem cobertura para os parâmetros pode ser suficiente.

Conecte o repositório GitOps

Para implantar continuamente seu aplicativo, conecte o repositório de aplicativos ao cluster usando o GitOps. Seu repositório GitOps arc-cicd-demo-gitops contém os recursos básicos para colocar seu aplicativo em funcionamento no cluster arc-cicd-cluster .

O repositório inicial do GitOps contém apenas um manifesto que cria os namespaces dev e stage correspondentes aos ambientes de implantação.

A conexão GitOps que você criar irá, automaticamente:

  • Sincronize os manifestos no diretório de manifesto.
  • Atualize o estado do cluster.

O fluxo de trabalho CI/CD preencherá o diretório de manifesto com manifestos extras para implantar o aplicativo.

  1. Crie uma nova conexão GitOps para seu repositório arc-cicd-demo-gitops recém-importado no Azure Repos.

    az k8s-configuration create \
       --name cluster-config \
       --cluster-name arc-cicd-cluster \
       --resource-group myResourceGroup \
       --operator-instance-name cluster-config \
       --operator-namespace cluster-config \
       --repository-url https://dev.azure.com/<Your organization>/<Your project>/_git/arc-cicd-demo-gitops \
       --https-user <Azure Repos username> \
       --https-key <Azure Repos PAT token> \
       --scope cluster \
       --cluster-type connectedClusters \
       --operator-params='--git-readonly --git-path=arc-cicd-cluster/manifests'
    
  2. Certifique-se de que o Flux use apenas o arc-cicd-cluster/manifests diretório como caminho base. Defina o caminho usando o seguinte parâmetro de operador:

    --git-path=arc-cicd-cluster/manifests

    Nota

    Se você estiver usando uma cadeia de conexão HTTPS e estiver tendo problemas de conexão, certifique-se de omitir o prefixo do nome de usuário na URL. Por exemplo, https://alice@dev.azure.com/contoso/project/_git/arc-cicd-demo-gitops deve ter alice@ removido. O --https-user especifica o usuário em vez disso, por exemplo --https-user alice.

  3. Verifique o estado da implantação no portal do Azure.

    • Se for bem-sucedido, você verá ambos os dev namespaces criados stage no cluster.

Importar os pipelines de CI/CD

Agora que você sincronizou uma conexão GitOps, precisará importar os pipelines de CI/CD que criam os manifestos.

O repositório de aplicativos contém uma .pipeline pasta com os pipelines que você usará para PRs, CI e CD. Importe e renomeie os três pipelines fornecidos no repositório de exemplo:

Nome do arquivo de pipeline Description
.pipelines/az-vote-pr-pipeline.yaml O pipeline de PR do aplicativo, chamado arc-cicd-demo-src PR
.pipelines/az-vote-ci-pipeline.yaml O pipeline de CI do aplicativo, chamado arc-cicd-demo-src CI
.pipelines/az-vote-cd-pipeline.yaml O pipeline de CD do aplicativo, chamado arc-cicd-demo-src CD

Ligue o seu ACR

Tanto os pipelines quanto o cluster utilizarão o ACR para armazenar e recuperar imagens do Docker.

Conectar o ACR ao Azure DevOps

Durante o processo de CI, você implantará seus contêineres de aplicativo em um registro. Comece criando uma conexão de serviço do Azure:

  1. No Azure DevOps, abra a página Conexões de serviço na página de configurações do projeto. No TFS, abra a página Serviços no ícone de configurações na barra de menu superior.
  2. Escolha + Nova conexão de serviço e selecione o tipo de conexão de serviço que você precisa.
  3. Preencha os parâmetros para a conexão de serviço. Para este tutorial:
    • Nomeie a conexão de serviço arc-demo-acr.
    • Selecione myResourceGroup como o grupo de recursos.
  4. Selecione Conceder permissão de acesso a todos os pipelines.
    • Esta opção autoriza arquivos de pipeline YAML para conexões de serviço.
  5. Escolha OK para criar a conexão.

Conectar ACR ao Kubernetes

Habilite o cluster do Kubernetes para extrair imagens do ACR. Se for privado, a autenticação será necessária.

Conecte o ACR a clusters AKS existentes

Integre um ACR existente com clusters AKS existentes usando o seguinte comando:

az aks update -n arc-cicd-cluster -g myResourceGroup --attach-acr arc-demo-acr

Criar um segredo de pull de imagem

Para conectar clusters locais e não AKS ao seu ACR, crie um segredo de pull de imagem. O Kubernetes usa segredos de extração de imagem para armazenar as informações necessárias para autenticar seu registro.

Crie um segredo de pull de imagem com o seguinte kubectl comando. Repita para os dev namespaces e stage .

kubectl create secret docker-registry <secret-name> \
    --namespace <namespace> \
    --docker-server=<container-registry-name>.azurecr.io \
    --docker-username=<service-principal-ID> \
    --docker-password=<service-principal-password>

Para evitar ter que definir um imagePullSecret para cada Pod, considere adicionar o imagePullSecret à conta Service nos dev namespaces e stage . Consulte o tutorial do Kubernetes para obter mais informações.

Criar grupos de variáveis de ambiente

Grupo de variáveis de repositório de aplicativos

Crie um grupo de variáveis chamado az-vote-app-dev. Defina os seguintes valores:

Variável Value
AZ_ACR_NAME (sua instância ACR, por exemplo. azurearctest.azurecr.io)
AZURE_SUBSCRIPTION (sua Conexão de Serviço do Azure, que deve ser arc-demo-acr do início do tutorial)
AZURE_VOTE_IMAGE_REPO O caminho completo para o repositório do Aplicativo de Votação do Azure, por exemplo, azurearctest.azurecr.io/azvote
ENVIRONMENT_NAME Programador
MANIFESTS_BRANCH master
MANIFESTS_FOLDER azure-vote-manifests
MANIFESTS_REPO arc-cicd-demo-gitops
ORGANIZATION_NAME Nome da organização do Azure DevOps
PROJECT_NAME Nome do projeto GitOps no Azure DevOps
REPO_URL URL completo para repositório GitOps
SRC_FOLDER azure-vote
TARGET_CLUSTER arc-cicd-cluster
TARGET_NAMESPACE dev

Grupo de variáveis de ambiente de estágio

  1. Clone o grupo de variáveis az-vote-app-dev .
  2. Altere o nome para az-vote-app-stage.
  3. Assegure os seguintes valores para as variáveis correspondentes:
Variável Value
ENVIRONMENT_NAME Fase
TARGET_NAMESPACE stage

Agora você está pronto para implantar nos dev ambientes e stage .

Conceder mais permissões ao serviço de compilação

O pipeline de CD usa o token de segurança da compilação em execução para autenticar no repositório GitOps. São necessárias mais permissões para que o pipeline crie uma nova ramificação, envie alterações por push e crie solicitações pull.

  1. Vá para Project settings a página principal do projeto Azure DevOps.
  2. Selecione Repositories.
  3. Selecione <GitOps Repo Name>.
  4. Selecione Security.
  5. Para o <Project Name> Build Service (<Organization Name>), permitir Contribute, Contribute to pull requests, e Create branch.

Para obter mais informações, consulte:

Implantar o ambiente de desenvolvimento pela primeira vez

Com os pipelines de CI e CD criados, execute o pipeline de CI para implantar o aplicativo pela primeira vez.

Gasoduto CI

Durante a execução inicial do pipeline de CI, você pode obter um erro de autorização de recurso ao ler o nome da conexão de serviço.

  1. Verifique se a variável que está sendo acessada está AZURE_SUBSCRIPTION.
  2. Autorize o uso.
  3. Execute novamente o pipeline.

O pipeline de IC:

  • Garante que a alteração do aplicativo passe por todas as verificações de qualidade automatizadas para implantação.
  • Faz qualquer validação extra que não pôde ser concluída no pipeline de RP.
    • Específico para GitOps, o pipeline também publica os artefatos para a confirmação que serão implantados pelo pipeline de CD.
  • Verifica se a imagem do Docker foi alterada e se a nova imagem foi enviada por push.

Pipeline de CD

Durante a execução inicial do pipeline de CD, você será solicitado a conceder ao pipeline acesso ao repositório GitOps. Selecione Exibir quando solicitado que o pipeline precisa de permissão para acessar um recurso. Em seguida, selecione Permitir para conceder permissão para usar o repositório GitOps para as execuções atuais e futuras do pipeline.

A execução bem-sucedida do pipeline de CI aciona o pipeline de CD para concluir o processo de implantação. Você implantará em cada ambiente de forma incremental.

Gorjeta

Se o pipeline de CD não acionar automaticamente:

  1. Verifique se o nome corresponde ao gatilho de ramificação em .pipelines/az-vote-cd-pipeline.yaml
    • Deverá ser arc-cicd-demo-src CI.
  2. Execute novamente o pipeline de CI.

Depois que o modelo e as alterações de manifesto para o repositório GitOps tiverem sido gerados, o pipeline de CD criará um commit, enviá-lo-á por push e criará um PR para aprovação.

  1. Abra o link PR fornecido na saída da Create PR tarefa.

  2. Verifique as alterações no repositório GitOps. Deverá ver:

    • Alterações no modelo de leme de alto nível.
    • Manifestos Kubernetes de baixo nível que mostram as alterações subjacentes para o estado desejado. O Flux implanta esses manifestos.
  3. Se tudo estiver bem, aprove e conclua o PR.

  4. Após alguns minutos, o Flux pega a alteração e inicia a implantação.

  5. Encaminhe a porta localmente usando kubectl e verifique se o aplicativo funciona corretamente usando:

    kubectl port-forward -n dev svc/azure-vote-front 8080:80

  6. Exiba o aplicativo Azure Vote em seu navegador em http://localhost:8080/.

  7. Vote nos seus favoritos e prepare-se para fazer algumas alterações no aplicativo.

Configurar aprovações de ambiente

Após a implantação do aplicativo, você não só pode fazer alterações no código ou nos modelos, mas também pode colocar o cluster em um estado incorreto sem querer.

Se o ambiente de desenvolvimento revelar uma interrupção após a implantação, evite que ele vá para ambientes posteriores usando aprovações de ambiente.

  1. Em seu projeto de DevOps do Azure, vá para o ambiente que precisa ser protegido.
  2. Navegue até Aprovações e Verificações do recurso.
  3. Selecione Criar.
  4. Forneça os aprovadores e uma mensagem opcional.
  5. Selecione Criar novamente para concluir a adição da verificação de aprovação manual.

Para obter mais detalhes, consulte o tutorial Definir aprovação e verificações .

Da próxima vez que o pipeline de CD for executado, o pipeline será pausado após a criação do GitOps PR. Verifique se a alteração foi sincronizada corretamente e passa a funcionalidade básica. Aprove a verificação do pipeline para permitir que a alteração flua para o próximo ambiente.

Fazer uma alteração de aplicativo

Com esse conjunto de linha de base de modelos e manifestos que representam o estado no cluster, você fará uma pequena alteração no aplicativo.

  1. No repositório arc-cicd-demo-src, edite azure-vote/src/azure-vote-front/config_file.cfg o arquivo.

  2. Como "Cats vs Dogs" não está recebendo votos suficientes, altere-o para "Tabs vs Spaces" para aumentar a contagem de votos.

  3. Confirme a alteração em uma nova ramificação, envie-a por push e crie uma solicitação pull.

    • Este é o fluxo típico do desenvolvedor que iniciará o ciclo de vida do CI/CD.

Pipeline de validação de RP

O gasoduto PR é a primeira linha de defesa contra uma mudança defeituosa. As verificações usuais de qualidade do código do aplicativo incluem revestimento e análise estática. Do ponto de vista do GitOps, você também precisa garantir a mesma qualidade para a infraestrutura resultante a ser implantada.

Os gráficos Dockerfile e Helm do aplicativo podem usar linting de maneira semelhante ao aplicativo.

Os erros encontrados durante o revestimento variam de:

  • Arquivos YAML formatados incorretamente, para
  • Sugestões de práticas recomendadas, como definir limites de CPU e memória para seu aplicativo.

Nota

Para obter a melhor cobertura do Helm linting em uma aplicação real, você precisará substituir valores que são razoavelmente semelhantes aos usados em um ambiente real.

Os erros encontrados durante a execução do pipeline aparecem na seção de resultados do teste da execução. A partir daqui, pode:

  • Acompanhe as estatísticas úteis sobre os tipos de erro.
  • Encontre a primeira confirmação na qual eles foram detetados.
  • O estilo de rastreamento de pilha vincula as seções de código que causaram o erro.

Quando a execução do pipeline for concluída, você terá garantido a qualidade do código do aplicativo e do modelo que o implantará. Agora você pode aprovar e concluir o PR. O CI será executado novamente, regenerando os modelos e manifestos, antes de acionar o pipeline de CD.

Gorjeta

Em um ambiente real, não se esqueça de definir políticas de filial para garantir que o RP passe em suas verificações de qualidade. Para obter mais informações, consulte o artigo Definir políticas de ramificação.

Aprovações de processos de CD

Uma execução bem-sucedida do pipeline de CI aciona o pipeline de CD para concluir o processo de implantação. Semelhante à primeira vez que você pode usar o pipeline de CD, você implantará em cada ambiente de forma incremental. Desta vez, o pipeline exige que você aprove cada ambiente de implantação.

  1. Aprove a implantação no dev ambiente.
  2. Depois que o modelo e as alterações de manifesto para o repositório GitOps tiverem sido gerados, o pipeline de CD criará um commit, enviá-lo-á por push e criará um PR para aprovação.
  3. Abra o link PR fornecido na tarefa.
  4. Verifique as alterações no repositório GitOps. Você deve ver:
    • Alterações no modelo de leme de alto nível.
    • Manifestos Kubernetes de baixo nível que mostram as alterações subjacentes para o estado desejado.
  5. Se tudo estiver bem, aprove e conclua o PR.
  6. Aguarde pela conclusão da implementação.
  7. Como um teste de fumaça básico, navegue até a página do aplicativo e verifique se o aplicativo de votação agora exibe Tabs vs Spaces.
    • Encaminhe a porta localmente usando kubectl e verifique se o aplicativo funciona corretamente usando: kubectl port-forward -n dev svc/azure-vote-front 8080:80
    • Exiba o aplicativo Azure Vote em seu navegador e http://localhost:8080/ verifique se as opções de votação foram alteradas para Guias vs Espaços.
  8. Repita as etapas de 1 a 7 para o stage ambiente.

Sua implantação agora está concluída. Isso encerra o fluxo de trabalho de CI/CD.

Clean up resources (Limpar recursos)

Se você não vai continuar a usar este aplicativo, exclua todos os recursos com as seguintes etapas:

  1. Exclua a conexão de configuração do Azure Arc GitOps:

    az k8s-configuration delete \
    --name cluster-config \
    --cluster-name arc-cicd-cluster \
    --resource-group myResourceGroup \
    --cluster-type connectedClusters
    
  2. Remova o dev namespace:

    • kubectl delete namespace dev
  3. Remova o stage namespace:

    • kubectl delete namespace stage

Próximos passos

Neste tutorial, você configurou um fluxo de trabalho completo de CI/CD que implementa o DevOps desde o desenvolvimento do aplicativo até a implantação. As alterações no aplicativo acionam automaticamente a validação e a implantação, limitadas por aprovações manuais.

Avance para nosso artigo conceitual para saber mais sobre GitOps e configurações com o Kubernetes habilitado para Azure Arc.