Pipeline de CI/CD para cargas de trabalho baseados em contêinerCI/CD pipeline for container-based workloads

Este cenário de exemplo é aplicável a empresas que desejam modernizar o desenvolvimento de aplicativos usando contêineres e fluxos de trabalho de DevOps.This example scenario is applicable to businesses that want to modernize application development by using containers and DevOps workflows. Neste cenário, um aplicativo Web do Node.js é criado e implantado pelo Jenkins em um Registro de Contêiner do Azure e no Serviço de Kubernetes do Azure.In this scenario, a Node.js web app is built and deployed by Jenkins into an Azure Container Registry and Azure Kubernetes Service. O Azure Cosmos DB é usado para oferecer uma camada de banco de dados distribuído globalmente.For a globally distributed database tier, Azure Cosmos DB is used. Para monitorar e solucionar problemas de desempenho do aplicativo, o Azure Monitor integra-se a uma instância e um painel do Grafana.To monitor and troubleshoot application performance, Azure Monitor integrates with a Grafana instance and dashboard.

Entre os cenários de uso de exemplo estão o fornecimento de um ambiente de desenvolvimento automatizado, a validação de novas confirmações de código e o envio por push de novas implantações em ambientes de preparo ou produção.Example application scenarios include providing an automated development environment, validating new code commits, and pushing new deployments into staging or production environments. Tradicionalmente, as empresas tinham que criar e compilar aplicativos e atualizações e manter uma base de código grande e monolítica.Traditionally, businesses had to manually build and compile applications and updates, and maintain a large, monolithic code base. Com uma abordagem moderna para o desenvolvimento de aplicativos que usa CI (integração contínua) e CD (implantação contínua), você pode criar, testar e implantar serviços mais rapidamente.With a modern approach to application development that uses continuous integration (CI) and continuous deployment (CD), you can more quickly build, test, and deploy services. Essa abordagem moderna permite liberar aplicativos e atualizações para seus clientes mais rapidamente e responder às mudanças nas demandas dos negócios de forma mais ágil.This modern approach lets you release applications and updates to your customers faster, and respond to changing business demands in a more agile manner.

Usando serviços do Azure, como o Serviço de Kubernetes do Azure, o Registro de Contêiner e o Cosmos DB, as empresas podem usar o que há de mais recente em ferramentas e técnicas de desenvolvimento de aplicativos para simplificar o processo de implementação de alta disponibilidade.By using Azure services such as Azure Kubernetes Service, Container Registry, and Cosmos DB, companies can use the latest in application development techniques and tools to simplify the process of implementing high availability.

Casos de uso relevantesRelevant use cases

Outros casos de uso relevantes incluem:Other relevant use cases include:

  • Modernizar práticas de desenvolvimento de aplicativos para uma abordagem de microsserviços baseada em contêiner.Modernizing application development practices to a microservice, container-based approach.
  • Acelerar o desenvolvimento de aplicativos e ciclos de vida de implantação.Speeding up application development and deployment lifecycles.
  • Automatizar implantações de teste ou ambientes de aceitação para validação.Automating deployments to test or acceptance environments for validation.

ArquiteturaArchitecture

Visão geral de arquitetura dos componentes do Azure envolvidos em um cenário de DevOps usando o Jenkins, o Registro de Contêiner do Azure e o Serviço de Kubernetes do Azure

Este cenário trata de um pipeline DevOps para um aplicativo Web do Node.js e um back-end de banco de dados.This scenario covers a DevOps pipeline for a Node.js web application and database back end. O fluxo de dados neste cenário ocorre da seguinte forma:The data flows through the scenario as follows:

  1. Um desenvolvedor faz alterações no código-fonte do aplicativo Web Node.js.A developer makes changes to the Node.js web application source code.
  2. A alteração de código é confirmada em um repositório de controle do código-fonte, como o GitHub.The code change is committed to a source control repository, such as GitHub.
  3. Para iniciar o processo de CI (integração contínua), um webhook do GitHub dispara uma compilação de projeto Jenkins.To start the continuous integration (CI) process, a GitHub webhook triggers a Jenkins project build.
  4. O trabalho de compilação do Jenkins usa um agente de build dinâmico no Serviço de Kubernetes do Azure para executar um processo de compilação do contêiner.The Jenkins build job uses a dynamic build agent in Azure Kubernetes Service to perform a container build process.
  5. Uma imagem de contêiner é criada a partir do código no controle do código-fonte e, em seguida, é enviada por push para um Registro de Contêiner do Azure.A container image is created from the code in source control, and is then pushed to an Azure Container Registry.
  6. Por meio da CD (implantação contínua), o Jenkins implanta essa imagem de contêiner atualizada no cluster Kubernetes.Through continuous deployment (CD), Jenkins deploys this updated container image to the Kubernetes cluster.
  7. O aplicativo web Node.js usa o Cosmos DB como seu back-end.The Node.js web application uses Cosmos DB as its back end. Tanto o Cosmos DB quanto o Serviço de Kubernetes do Azure enviam métricas para o Azure Monitor.Both Cosmos DB and Azure Kubernetes Service report metrics to Azure Monitor.
  8. Uma instância do Grafana fornece painéis visuais sobre o desempenho do aplicativo com base nos dados do Azure Monitor.A Grafana instance provides visual dashboards of the application performance based on the data from Azure Monitor.

ComponentesComponents

  • O Jenkins é um servidor de automação de software livre que pode se integrar aos serviços do Azure para habilitar a CI (integração contínua) e a CD (implantação contínua).Jenkins is an open-source automation server that can integrate with Azure services to enable continuous integration (CI) and continuous deployment (CD). Neste cenário, o Jenkins orquestra a criação de novas imagens de contêiner com base nas confirmações no controle do código-fonte, envia por push essas imagens para o Registro de Contêiner do Azure e atualiza as instâncias do aplicativo no Serviço de Kubernetes do Azure.In this scenario, Jenkins orchestrates the creation of new container images based on commits to source control, pushes those images to Azure Container Registry, then updates application instances in Azure Kubernetes Service.
  • As Máquinas Virtuais do Linux do Azure são a plataforma de IaaS usada para executar as instâncias do Jenkins e do Grafana.Azure Linux Virtual Machines is the IaaS platform used to run the Jenkins and Grafana instances.
  • O Registro de Contêiner do Azure armazena e gerencia imagens de contêiner que são usadas pelo cluster do Serviço de Kubernetes do Azure.Azure Container Registry stores and manages container images that are used by the Azure Kubernetes Service cluster. As imagens são armazenadas com segurança e podem ser replicadas em outras regiões pela plataforma do Azure para acelerar os tempos de implantação.Images are securely stored, and can be replicated to other regions by the Azure platform to speed up deployment times.
  • O Serviço de Kubernetes do Azure é uma plataforma Kubernetes gerenciada que permite implantar e gerenciar aplicativos em contêineres sem conhecimento de orquestração de contêiner.Azure Kubernetes Service is a managed Kubernetes platform that lets you deploy and manage containerized applications without container orchestration expertise. Como um serviço Kubernetes hospedado, o Azure lida com as tarefas críticas para você, como o monitoramento da integridade e a manutenção.As a hosted Kubernetes service, Azure handles critical tasks like health monitoring and maintenance for you.
  • O Azure Cosmos DB é um banco de dados multimodelo distribuído globalmente que permite que você escolha entre vários modelos de banco de dados e de consistência para atender às suas necessidades.Azure Cosmos DB is a globally distributed, multi-model database that allows you to choose from various database and consistency models to suit your needs. Com o Cosmos DB, os dados podem ser replicados globalmente e não há a necessidade de implantação ou configuração de nenhum cluster de gerenciamento ou replicação.With Cosmos DB, your data can be globally replicated, and there is no cluster management or replication components to deploy and configure.
  • Azure monitor ajuda a acompanhar o desempenho, manter a segurança e identificar tendências.Azure Monitor helps you track performance, maintain security, and identify trends. As métricas obtidas pelo Monitor podem ser usadas por outros recursos e ferramentas, como o Grafana.Metrics obtained by Monitor can be used by other resources and tools, such as Grafana.
  • O Grafana é uma solução de software livre para consultar, visualizar, alertar e entender métricas.Grafana is an open-source solution to query, visualize, alert, and understand metrics. Um plug-in da fonte de dados para o Azure Monitor permite que o Grafana crie painéis visuais para monitorar o desempenho de seus aplicativos em execução no Serviço de Kubernetes do Azure que usam o Cosmos DB.A data source plugin for Azure Monitor allows Grafana to create visual dashboards to monitor the performance of your applications running in Azure Kubernetes Service and using Cosmos DB.

AlternativasAlternatives

  • O Azure Pipelines ajuda a implementar um pipeline de CI (integração contínua), teste contínuo e CD (implantação contínua) em qualquer aplicativo.Azure Pipelines help you implement a continuous integration (CI), test, and deployment (CD) pipeline for any app.
  • O Kubernetes pode ser executado diretamente em VMs do Azure em vez de usar um serviço gerenciado, se você quiser mais controle sobre o cluster.Kubernetes can be run directly on Azure VMs instead of via a managed service if you would like more control over the cluster.
  • O Service Fabric é outro orquestrador de contêiner alternativo que pode substituir o AKS.Service Fabric is another alternate container orchestrator that can replace AKS.

ConsideraçõesConsiderations

DisponibilidadeAvailability

Para monitorar o desempenho do aplicativo e relatar problemas, esse cenário combina o Azure Monitor com o Grafana para oferecer painéis visuais.To monitor your application performance and report on issues, this scenario combines Azure Monitor with Grafana for visual dashboards. Essas ferramentas permitem monitorar e solucionar problemas de desempenho que podem exigir atualizações de código, e podem todas ser implantadas com o pipeline de CI/CD.These tools let you monitor and troubleshoot performance issues that may require code updates, which can all then be deployed with the CI/CD pipeline.

Como parte do cluster do Serviço de Kubernetes do Azure, um balanceador de carga distribui o tráfego do aplicativo para um ou mais contêineres (pods) que executam o aplicativo.As part of the Azure Kubernetes Service cluster, a load balancer distributes application traffic to one or more containers (pods) that run your application. Essa abordagem para a execução de aplicativos em contêineres no Kubernetes oferece uma infraestrutura altamente disponível para seus clientes.This approach to running containerized applications in Kubernetes provides a highly available infrastructure for your customers.

EscalabilidadeScalability

O Serviço de Kubernetes do Azure permite que você dimensione o número de nós de cluster para atender às demandas dos aplicativos.Azure Kubernetes Service lets you scale the number of cluster nodes to meet the demands of your applications. À medida que seu aplicativo aumenta, você pode escalar horizontalmente o número de nós de Kubernetes que executa o serviço.As your application increases, you can scale out the number of Kubernetes nodes that run your service.

Os dados do aplicativo são armazenados no Azure Cosmos DB, um banco de dados multimodelo distribuído globalmente que pode ser dimensionado globalmente.Application data is stored in Azure Cosmos DB, a globally distributed, multi-model database that can scale globally. O Cosmos DB abstrai a necessidade de dimensionar sua infraestrutura, como é feito com os componentes de banco de dados tradicional e você pode optar por replicar o Cosmos DB globalmente para atender às demandas de seus clientes.Cosmos DB abstracts the need to scale your infrastructure as with traditional database components, and you can choose to replicate your Cosmos DB globally to meet the demands of your customers.

Para obter outros tópicos de escalabilidade, consulte a lista de verificação de eficiência de desempenho disponível no centro de arquitetura do Azure.For other scalability topics, see the performance efficiency checklist available in the Azure Architecture Center.

SegurançaSecurity

Para minimizar o volume de ataque, esse cenário não expõe a instância da VM Jenkins em HTTP.To minimize the attack footprint, this scenario does not expose the Jenkins VM instance over HTTP. Para as tarefas de gerenciamento que exigem a interação com o Jenkins, você deve criar uma conexão remota segura usando um túnel SSH em seu computador local.For any management tasks that require you to interact with Jenkins, you create a secure remote connection using an SSH tunnel from your local machine. Somente a autenticação de chave pública SSH é permitida para as instâncias de VM Grafana e Jenkins.Only SSH public key authentication is allowed for the Jenkins and Grafana VM instances. Os logons com base em senha são desabilitados.Password-based logins are disabled. Para obter mais informações, confira Executar um servidor Jenkins no Azure.For more information, see Run a Jenkins server on Azure.

Para separar credenciais e permissões, este cenário usa uma entidade de serviço dedicada do Azure AD (Active Directory).For separation of credentials and permissions, this scenario uses a dedicated Azure Active Directory (AD) service principal. As credenciais para essa entidade de serviço são armazenadas como um objeto de credencial segura no Jenkins para não serem diretamente expostas e ficarem visíveis dentro de scripts ou no pipeline de compilação.The credentials for this service principal are stored as a secure credential object in Jenkins so that they are not directly exposed and visible within scripts or the build pipeline.

Para obter diretrizes gerais sobre como projetar soluções seguras, consulte a documentação de segurança do Azure.For general guidance on designing secure solutions, see the Azure Security Documentation.

ResiliênciaResiliency

Este cenário usa o Serviço de Kubernetes do Azure para seu aplicativo.This scenario uses Azure Kubernetes Service for your application. O Kubernetes tem componentes de resiliência embutidos que monitoram e reiniciam os contêineres (pods) em caso de problema.Built into Kubernetes are resiliency components that monitor and restart the containers (pods) if there is an issue. Combinado com vários nós do Kubernetes em execução, seu aplicativo pode tolerar a indisponibilidade de um pod ou nó.Combined with running multiple Kubernetes nodes, your application can tolerate a pod or node being unavailable.

Para obter diretrizes gerais sobre como criar soluções resilientes, consulte projetando aplicativos confiáveis do Azure.For general guidance on designing resilient solutions, see Designing reliable Azure applications.

Implantar o cenárioDeploy the scenario

Pré-requisitosPrerequisites

  • Você deve ter uma conta do Azure já criada.You must have an existing Azure account. Caso não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.If you don't have an Azure subscription, create a free account before you begin.

  • Você precisa de um par de chaves públicas SSH.You need an SSH public key pair. Para obter etapas sobre como criar um par de chaves públicas, confira Criar e usar um par de chaves SSH para VMs Linux.For steps on how to create a public key pair, see Create and use an SSH key pair for Linux VMs.

  • Você precisa de uma entidade de serviço do Azure AD (Active Directory) para a autenticação de serviço e recursos.You need an Azure Active Directory (AD) service principal for the authentication of service and resources. Se necessário, crie uma entidade de serviço com az ad sp create-for-rbacIf needed, you can create a service principal with az ad sp create-for-rbac

    az ad sp create-for-rbac --name myDevOpsScenario
    

    Anote o appId e a senha na saída desse comando.Make a note of the appId and password in the output from this command. Forneça esses valores ao modelo quando implantar o cenário.You provide these values to the template when you deploy the scenario.

  • Localize as versões do kubernetes com suporte para sua região de implantação executando AZ AKs Get-Versions.Find the supported Kubernetes versions for your deployment region by running az aks get-versions. O comando a seguir obtém a versão padrão da CLI :The following command gets the CLI default version:

    az aks get-versions -l <region> --query "orchestrators[?default!=null].orchestratorVersion" -o tsv
    

Passo a passoWalk-through

Para implantar esse cenário com um modelo do Azure Resource Manager, execute as etapas a seguir.To deploy this scenario with an Azure Resource Manager template, perform the following steps.

  1. Clique no link abaixo para implantar a solução.Click the link below to deploy the solution.

    Implantar no AzureDeploy to Azure

  2. Aguarde até que a implantação de modelo seja aberta no portal do Azure e conclua as seguintes etapas:Wait for the template deployment to open in the Azure portal, then complete the following steps:

    • Escolha Criar novo recurso de grupo e insira um nome como myAKSDevOpsScenario na caixa de texto.Choose to Create new resource group, then provide a name such as myAKSDevOpsScenario in the text box.
    • Selecione uma região na caixa suspensa Local.Select a region from the Location drop-down box.
    • Insira sua ID de entidade de segurança de aplicativo de serviço e a senha no comando az ad sp create-for-rbac.Enter your service principal app ID and password from the az ad sp create-for-rbac command.
    • Forneça um nome de usuário e uma senha segura para a instância do Jenkins e o console do Grafana.Provide a username and secure password for the Jenkins instance and Grafana console.
    • Forneça uma chave SSH para proteger logons nas VMs Linux.Provide an SSH key to secure logins to the Linux VMs.
    • Insira a versão kubernetes do az aks get-versions comando.Enter the Kubernetes version from the az aks get-versions command.
    • Analise os termos e condições e marque a opção Concordo com os termos e condições declarados acima.Review the terms and conditions, then check I agree to the terms and conditions stated above.
    • Selecione o botão Comprar.Select the Purchase button.

Pode levar 15 a 20 minutos para a implantação ser concluída.It can take 15-20 minutes for the deployment to complete.

PreçosPricing

Para explorar o custo de executar esse cenário, todos os serviços são pré-configurados na calculadora de custos.To explore the cost of running this scenario, all of the services are pre-configured in the cost calculator. Para ver como o preço seria alterado em seu caso de uso específico, altere as variáveis apropriadas de acordo com o tráfego esperado.To see how the pricing would change for your particular use case, change the appropriate variables to match your expected traffic.

Nós fornecemos três perfis de custo de exemplo com base no número de imagens de contêiner a serem armazenados e nós de Kubernetes para executar seus aplicativos.We have provided three sample cost profiles based on the number of container images to store and Kubernetes nodes to run your applications.

  • Pequeno: esse exemplo de preço refere-se a mil builds de contêiner por mês.Small: this pricing example correlates to 1000 container builds per month.
  • Médio: esse exemplo de preço refere-se a 100 mil builds de contêiner por mês.Medium: this pricing example correlates to 100,000 container builds per month.
  • Grande: esse exemplo de preço refere-se a 1 milhão de builds de contêiner por mês.Large: this pricing example correlates to 1,000,000 container builds per month.

Este cenário usou o Registro de Contêiner do Azure e o Serviço de Kubernetes do Azure para armazenar e executar um aplicativo baseado em contêiner.This scenario used Azure Container Registry and Azure Kubernetes Service to store and run a container-based application. As Instâncias de Contêiner do Azure também podem ser usadas para executar aplicativos baseados em contêiner, sem precisar provisionar componentes de orquestração.Azure Container Instances can also be used to run container-based applications, without having to provision any orchestration components. Para obter mais informações, confira Visão geral das Instâncias de Contêiner do Azure.For more information, see Azure Container Instances overview.