Arquitetura de Microsserviços no Azure Kubernetes Service (AKS)Microservices architecture on Azure Kubernetes Service (AKS)

Este arquiteturas de referência mostra uma aplicação de microsserviços implementada para o Azure Kubernetes Service (AKS).This reference architectures shows a microservices application deployed to Azure Kubernetes Service (AKS). Mostra uma configuração básica do AKS que pode ser o ponto de partida para a maioria das implementações.It shows a basic AKS configuration that can be the starting point for most deployments. As opções mais avançadas, incluindo opções de rede avançadas, serão abordadas numa arquitetura de referência separado.More advanced options, including advanced networking options, will be covered in a separate reference architecture.

Este artigo pressupõe um conhecimento básico do Kubernetes.This article assumes basic knowledge of Kubernetes. O artigo se concentra principalmente na infraestrutura e as considerações de DevOps da execução de uma arquitetura de microsserviços no AKS.The article focuses mainly on the infrastructure and DevOps considerations of running a microservices architecture on AKS. Para obter orientações sobre como estruturar microsserviços de uma perspectiva de Design controlado por domínio (DDD), veja estruturar, criar e utilizar microsserviços no Azure.For guidance on how to design microservices from a Domain Driven Design (DDD) perspective, see Designing, building, and operating microservices on Azure.

Nota

Estamos a trabalhar numa implementação de referência (RI) que acompanhará este artigo, que podemos esperar para publicar no início de 2019.We are working on a reference implementation (RI) to accompany this article, which we expect to publish in early 2019. Este artigo será atualizado para incorporar as melhores práticas adicionais de que RI.This article will be updated to incorporate additional best practices from that RI.

Arquitetura de referência do AKS

ArquiteturaArchitecture

A arquitetura é composta pelos seguintes componentes.The architecture consists of the following components.

Serviço Kubernetes do Azure (AKS).Azure Kubernetes Service (AKS). AKS é um serviço do Azure que implementa um cluster de Kubernetes gerido.AKS is an Azure service that deploys a managed Kubernetes cluster.

Cluster de Kubernetes.Kubernetes cluster. AKS é responsável por implementar o cluster de Kubernetes e para a gestão de modelos de estrutura mestres Kubernetes.AKS is responsible for deploying the Kubernetes cluster and for managing the Kubernetes masters. Gerir apenas os nós de agente.You only manage the agent nodes.

Rede virtual.Virtual network. Por predefinição, o AKS cria uma rede virtual para implementar os nós de agente em.By default, AKS creates a virtual network to deploy the agent nodes into. Para cenários mais avançados, pode criar a rede virtual em primeiro lugar, que permite que controlar como as sub-redes são configuradas, conectividade no local e endereçamento IP.For more advanced scenarios, you can create the virtual network first, which lets you control things like how the subnets are configured, on-premises connectivity, and IP addressing. Para obter mais informações, consulte configurar avançadas no Azure Kubernetes Service (AKS) de rede.For more information, see Configure advanced networking in Azure Kubernetes Service (AKS).

Entrada.Ingress. Uma entrada expõe rotas de HTTP (S) para serviços dentro do cluster.An ingress exposes HTTP(S) routes to services inside the cluster. Para obter mais informações, consulte a secção Gateway de API abaixo.For more information, see the section API Gateway below.

Arquivos de dados externo.External data stores. Microsserviços são normalmente sem monitoração de estado e escreveu o estado em arquivos de dados externas, como a base de dados do Azure SQL ou Cosmos DB.Microservices are typically stateless and write state to external data stores, such as Azure SQL Database or Cosmos DB.

O Azure Active Directory.Azure Active Directory. AKS usa uma identidade do Azure Active Directory (Azure AD) para criar e gerir outros recursos do Azure, como balanceadores de carga do Azure.AKS uses an Azure Active Directory (Azure AD) identity to create and manage other Azure resources such as Azure load balancers. O Azure AD também é recomendado para a autenticação de utilizador em aplicativos cliente.Azure AD is also recommended for user authentication in client applications.

Azure Container Registry.Azure Container Registry. Utilize o registo de contentores para armazenar imagens privadas do Docker, que são implementadas para o cluster.Use Container Registry to store private Docker images, which are deployed to the cluster. AKS pode autenticar com o registo de contentores com a respetiva identidade do Azure AD.AKS can authenticate with Container Registry using its Azure AD identity. Tenha em atenção que o AKS não requer o Azure Container Registry.Note that AKS does not require Azure Container Registry. Pode utilizar outros registos de contentores, como o Docker Hub.You can use other container registries, such as Docker Hub.

Pipelines do Azure.Azure Pipelines. Pipelines faz parte dos serviços de DevOps do Azure e execuções automatizado de compilações, testes e implementações.Pipelines is part of Azure DevOps Services and runs automated builds, tests, and deployments. Também pode utilizar soluções de CI/CD de terceiros, como o Jenkins.You can also use third-party CI/CD solutions such as Jenkins.

Helm.Helm. Helm é como um Gestor de pacotes para Kubernetes — uma forma de agrupar objetos de Kubernetes numa única unidade que pode publicar, implementar, versão e atualizar.Helm is as a package manager for Kubernetes — a way to bundle Kubernetes objects into a single unit that you can publish, deploy, version, and update.

O Azure Monitor.Azure Monitor. Monitor do Azure recolhe e armazena métricas e registos, incluindo métricas de plataforma para os serviços do Azure na telemetria da aplicação e solução.Azure Monitor collects and stores metrics and logs, including platform metrics for the Azure services in the solution and application telemetry. Utilize estes dados para monitorizar a aplicação, configurar alertas e dashboards e efetuar a análise da causa raiz de falhas.Use this data to monitor the application, set up alerts and dashboards, and perform root cause analysis of failures. O Azure Monitor integra-se com o AKS para recolher métricas de controladores, nós e contentores, bem como registos de contentor e registos de nó principal.Azure Monitor integrates with AKS to collect metrics from controllers, nodes, and containers, as well as container logs and master node logs.

Considerações de conceçãoDesign considerations

Esta arquitetura de referência está concentrada em arquiteturas de microsserviços, embora muitas das práticas recomendadas serão aplicada a outras cargas de trabalho em execução no AKS.This reference architecture is focused on microservices architectures, although many of the recommended practices will apply to other workloads running on AKS.

MicrosserviçosMicroservices

O objeto de serviço do Kubernetes é uma forma natural para microsserviços de modelo no Kubernetes.The Kubernetes Service object is a natural way to model microservices in Kubernetes. Um microsserviço é uma unidade de menos rígida, implementável independentemente do código.A microservice is a loosely coupled, independently deployable unit of code. Microsserviços normalmente comunicam através de APIs bem definidas e são descobertos por meio de alguma forma de deteção do serviço.Microservices typically communicate through well-defined APIs, and are discoverable through some form of service discovery. O objeto de serviço do Kubernetes fornece um conjunto de recursos que correspondam a estes requisitos:The Kubernetes Service object provides a set of capabilities that match these requirements:

  • Endereço IP.IP address. O objeto de serviço fornece um endereço IP estático interno para um grupo de pods (ReplicaSet).The Service object provides a static internal IP address for a group of pods (ReplicaSet). Conforme os pods são criados ou movidos, o serviço é sempre acessível neste endereço IP interno.As pods are created or moved around, the service is always reachable at this internal IP address.

  • Balanceamento de carga.Load balancing. O tráfego enviado para o endereço IP do serviço é a carga balanceada para os pods.Traffic sent to the service's IP address is load balanced to the pods.

  • Deteção do serviço.Service discovery. Os serviços são atribuídos a entradas DNS internas pelo serviço de DNS do Kubernetes.Services are assigned internal DNS entries by the Kubernetes DNS service. Isso significa que o gateway de API pode chamar um serviço de back-end com o nome DNS.That means the API gateway can call a backend service using the DNS name. O mesmo mecanismo pode ser utilizado para comunicação de serviço a serviço.The same mechanism can be used for service-to-service communication. As entradas de DNS são organizadas por namespace, portanto, se os espaços de nomes correspondem à estagnação contextos, então o nome DNS para um serviço irá mapear naturalmente para o domínio do aplicativo.The DNS entries are organized by namespace, so if your namespaces correspond to bounded contexts, then the DNS name for a service will map naturally to the application domain.

O diagrama seguinte mostra a relação conceptual entre serviços e os pods.The following diagram show the conceptual relation between services and pods. O mapeamento real para as portas e endereços IP do ponto final é feito pelo proxy kube, o proxy de rede do Kubernetes.The actual mapping to endpoint IP addresses and ports is done by kube-proxy, the Kubernetes network proxy.

Serviços e pods

Gateway de APIAPI Gateway

Uma gateway de API é um gateway que fica entre clientes externos e os microsserviços.An API gateway is a gateway that sits between external clients and the microservices. Ele atua como proxy inverso, encaminhamento de pedidos de clientes para microsserviços.It acts as a reverse proxy, routing requests from clients to microservices. Ele também pode fazer várias tarefas de transversais, como autenticação, a terminação de SSL e a limitação de velocidade.It may also perform various cross-cutting tasks such as authentication, SSL termination, and rate limiting.

Funcionalidade fornecida por um gateway pode ser agrupada da seguinte forma:Functionality provided by a gateway can be grouped as follows:

  • Encaminhamento de gateway: Encaminhamento de pedidos de cliente para os serviços de back-end certo.Gateway Routing: Routing client requests to the right backend services. Isto fornece um único ponto final para clientes e ajuda a desacoplar os clientes dos serviços.This provides a single endpoint for clients, and helps to decouple clients from services.

  • Agregação de gateway: Agregação de vários pedidos num único pedido, para reduzir o diálogo entre o cliente e o back-end.Gateway Aggregation: Aggregation of multiple requests into a single request, to reduce chattiness between the client and the backend.

  • Descarregamento de gateway.Gateway Offloading. Um gateway pode descarregar a funcionalidade de serviços back-end, como a terminação de SSL, autenticação, listas de permissões de IP ou limitação (limitação) de taxas de cliente.A gateway can offload functionality from the backend services, such as SSL termination, authentication, IP whitelisting, or client rate limiting (throttling).

Gateways de API são um general padrão de estruturação dos microsserviços.API gateways are a general microservices design pattern. Podem ser implementados utilizando um número de diferentes tecnologias.They can be implemented using a number of different technologies. Provavelmente, a implementação mais comum é implementar um router de limite ou o proxy inverso, como o Nginx, HAProxy ou Traefik, dentro do cluster.Probably the most common implementation is to deploy an edge router or reverse proxy, such as Nginx, HAProxy, or Traefik, inside the cluster.

Outras opções incluem:Other options include:

  • O Azure Application Gateway e/ou do Azure-gestão de API, que são ambos os serviços geridos que residem fora do cluster.Azure Application Gateway and/or Azure API-Management, which are both managed services that reside outside of the cluster. Um controlador de entradas de Gateway de aplicação está atualmente na versão beta.An Application Gateway Ingress Controller is currently in beta.

  • Proxies de funções do Azure.Azure Functions Proxies. Proxies podem modificar pedidos e respostas e encaminhar os pedidos com base no URL.Proxies can modify requests and responses and route requests based on URL.

O Kubernetes entrada tipo de recurso abstrai as definições de configuração para um servidor proxy.The Kubernetes Ingress resource type abstracts the configuration settings for a proxy server. Ele funciona em conjunto com um controlador de entrada, que fornece a implementação subjacente da entrada.It works in conjunction with an ingress controller, which provides the underlying implementation of the Ingress. Existem controladores de entrada para Nginx, HAProxy, Traefik e Gateway de aplicação (pré-visualização), entre outros.There are ingress controllers for Nginx, HAProxy, Traefik, and Application Gateway (preview), among others.

O controlador de entrada processa a configuração do servidor proxy.The ingress controller handles configuring the proxy server. Muitas vezes, estes necessitam de ficheiros de configuração complexa, o que podem ser difícil ajustar se não for um especialista, portanto, o controlador de entrada é uma boa abstração.Often these require complex configuration files, which can be hard to tune if you aren't an expert, so the ingress controller is a nice abstraction. Além disso, o controlador de entrada tem acesso à API do Kubernetes, para que possa tomar decisões inteligentes sobre o encaminhamento e o balanceamento de carga.In addition, the Ingress Controller has access to the Kubernetes API, so it can make intelligent decisions about routing and load balancing. Por exemplo, o controlador de entrada do Nginx ignora o proxy de rede de proxy do kube.For example, the Nginx ingress controller bypasses the kube-proxy network proxy.

Por outro lado, se tem de concluir o controle sobre as definições, poderá ignorar essa abstração e configurar o servidor proxy manualmente.On the other hand, if you need complete control over the settings, you may want to bypass this abstraction and configure the proxy server manually.

Um servidor proxy reverso é um possível afunilamento ou um ponto único de falha, por conseguinte, implementar, pelo menos, duas réplicas para elevada disponibilidade.A reverse proxy server is a potential bottleneck or single point of failure, so always deploy at least two replicas for high availability.

Armazenamento de dadosData storage

Numa arquitetura de microsserviços, os serviços não devem partilhar o armazenamento de dados.In a microservices architecture, services should not share data storage. Cada serviço deveria ter seus próprios dados privados num armazenamento lógico separado, para evitar dependências ocultas entre serviços.Each service should own its own private data in a separate logical storage, to avoid hidden dependencies among services. O motivo é evitar não intencional acoplamento entre serviços, o que pode acontecer quando serviços partilham os mesmos esquemas de dados subjacente.The reason is to avoid unintentional coupling between services, which can happen when services share the same underlying data schemas. Além disso, quando os serviços de gerir os seus próprios arquivos de dados, podem utilizar o arquivo de dados correto para as suas necessidades específicas.Also, when services manage their own data stores, they can use the right data store for their particular requirements. Para obter mais informações, consulte estruturar microsserviços: Considerações sobre dados.For more information, see Designing microservices: Data considerations.

Evite armazenar dados persistentes no armazenamento de local cluster, uma vez que vincula os dados para o nó.Avoid storing persistent data in local cluster storage, because that ties the data to the node. Em vez disso,Instead,

  • Utilizar um serviço externo, como a base de dados do Azure SQL ou Cosmos DB, ouUse an external service such as Azure SQL Database or Cosmos DB, or

  • Monte um volume persistente, uso de discos do Azure ou do Azure.Mount a persistent volume using Azure Disks or Azure Files. Utilize ficheiros do Azure, se o mesmo volume tem de ser partilhada por vários pods.Use Azure Files if the same volume needs to be shared by multiple pods.

Espaços de nomesNamespaces

Utilize espaços de nomes para organizar serviços dentro do cluster.Use namespaces to organize services within the cluster. Cada objeto num cluster do Kubernetes pertence a um espaço de nomes.Every object in a Kubernetes cluster belongs to a namespace. Por predefinição, quando cria um novo objeto, ele entra o default espaço de nomes.By default, when you create a new object, it goes into the default namespace. Mas é uma boa prática para criar espaços de nomes mais descritivos para ajudar a organizar os recursos do cluster.But it's a good practice to create namespaces that are more descriptive to help organize the resources in the cluster.

Em primeiro lugar, o espaços de nomes o pode ajudar a evitar conflitos de nomenclatura.First, namespaces help prevent naming collisions. Quando várias equipes implementar microsserviços no mesmo cluster, com possivelmente centenas de microsserviços, fica difícil de gerenciar se todas elas entram no mesmo espaço de nomes.When multiple teams deploy microservices into the same cluster, with possibly hundreds of microservices, it gets hard to manage if they all go into the same namespace. Além disso, espaços de nomes permitem-lhe:In addition, namespaces allow you to:

  • Aplica restrições de recursos para um espaço de nomes, para que o conjunto total de pods atribuídos a esse espaço de nomes não pode exceder a quota de recursos do espaço de nomes.Apply resource constraints to a namespace, so that the total set of pods assigned to that namespace cannot exceed the resource quota of the namespace.

  • Aplica políticas ao nível do espaço de nomes, incluindo as políticas de RBAC e segurança.Apply policies at the namespace level, including RBAC and security policies.

Para uma arquitetura de microsserviços, Considerando a organizar os microsserviços em contextos limitados e a criação de espaços de nomes para cada contexto vinculado.For a microservices architecture, considering organizing the microservices into bounded contexts, and creating namespaces for each bounded context. Por exemplo, todos os microsserviços relacionados com o contexto de "Preenchimento de pedidos" estagnação podem ir para o mesmo espaço de nomes.For example, all microservices related to the "Order Fulfillment" bounded context could go into the same namespace. Em alternativa, crie um espaço de nomes para cada equipe de desenvolvimento.Alternatively, create a namespace for each development team.

Coloque o serviço público no seu próprio espaço de nomes separado.Place utility services into their own separate namespace. Por exemplo, pode implementar o Elasticsearch ou Prometheus para monitorização de clusters ou Tiller para Helm.For example, you might deploy Elasticsearch or Prometheus for cluster monitoring, or Tiller for Helm.

Considerações de escalabilidadeScalability considerations

Kubernetes suporta Escalamento horizontal em dois níveis:Kubernetes supports scale-out at two levels:

  • Dimensione o número de pods alocada a uma implementação.Scale the number of pods allocated to a deployment.
  • Dimensione os nós do cluster, para aumentar os recursos de computação total disponíveis para o cluster.Scale the nodes in the cluster, to increase the total compute resources available to the cluster.

Embora pode aumentar horizontalmente pods e nós manualmente, recomendamos que utilize o dimensionamento automático, para minimizar a possibilidade de que os serviços vão estar recurso fica sem com uma carga elevada.Although you can scale out pods and nodes manually, we recommend using autoscaling, to minimize the chance that services will become resource starved under high load. Uma estratégia de dimensionamento automático deve levar pods e nós em conta.An autoscaling strategy must take both pods and nodes into account. Se apenas aumenta horizontalmente pods, eventualmente, irá atingir os limites de recursos de nós.If you just scale out the pods, eventually you will reach the resource limits of the nodes.

Dimensionar automaticamentePod autoscaling

O dimensionamento automático Horizontal de Pods (HPA) pode ser dimensionada pods com base na CPU observada, memória ou métricas personalizadas.The Horizontal Pod Autoscaler (HPA) scales pods based on observed CPU, memory, or custom metrics. Para configurar o dimensionamento horizontal de pods, especifique uma métrica de destino (por exemplo, 70% da CPU) e o número mínimo e máximo de réplicas.To configure horizontal pod scaling, you specify a target metric (for example, 70% of CPU), and the minimum and maximum number of replicas. Deve carregar seus serviços para derivar esses números de teste.You should load test your services to derive these numbers.

Um efeito colateral de dimensionamento automático é que os pods podem ser criados ou expulso com mais frequência, à medida que ocorrem eventos de aumento horizontal e a redução horizontal.A side-effect of autoscaling is that pods may be created or evicted more frequently, as scale-out and scale-in events happen. Para atenuar os efeitos disso:To mitigate the effects of this:

  • Sondas de preparação de utilização para permitir que saber quando está pronto para aceitar o tráfego de um novo pod de Kubernetes.Use readiness probes to let Kubernetes know when a new pod is ready to accept traffic.
  • Utilize os orçamentos de interrupção de pod para limitar o número de pods podem ser expulsas através de um serviço ao mesmo tempo.Use pod disruption budgets to limit how many pods can be evicted from a service at a time.

Dimensionamento automático de clusterCluster autoscaling

O dimensionamento automático de cluster dimensiona o número de nós.The cluster autoscaler scales the number of nodes. Se não não possível agendar pods devido a restrições de recursos, o dimensionamento automático do cluster irá aprovisionar mais nós.If pods can't be scheduled because of resource constraints, the cluster autoscaler will provision more nodes. (Nota: Integração entre o AKS e o dimensionamento automático de cluster está atualmente em pré-visualização.)(Note: Integration between AKS and the cluster autoscaler is currently in preview.)

Enquanto HPA analisa reais recursos consumidos ou outras métricas de pods de executar, o dimensionamento automático de cluster está a aprovisionar nós de pods que não estão agendados ainda.Whereas HPA looks at actual resources consumed or other metrics from running pods, the cluster autoscaler is provisioning nodes for pods that aren't scheduled yet. Por isso, ele aborda os recursos solicitados, conforme especificado na especificação de pod do Kubernetes para uma implementação.Therefore, it looks at the requested resources, as specified in the Kubernetes pod spec for a deployment. Use o teste de carga para ajustar esses valores.Use load testing to fine-tune these values.

Não é possível alterar o tamanho da VM depois de criar o cluster, para que deve fazer alguma capacidade inicial de planeamento escolher um tamanho VM adequado para os nós de agente quando criar o cluster.You can't change the VM size after you create the cluster, so you should do some initial capacity planning to choose an appropriate VM size for the agent nodes when you create the cluster.

Considerações de disponibilidadeAvailability considerations

Sondas do estado de funcionamentoHealth probes

Kubernetes define dois tipos de sonda de estado de funcionamento que pode expor um pod:Kubernetes defines two types of health probe that a pod can expose:

  • Sonda de preparação: Indica ao Kubernetes se o pod está pronto para aceitar pedidos.Readiness probe: Tells Kubernetes whether the pod is ready to accept requests.

  • A sonda de atividade: Indica ao Kubernetes se um pod deve ser removido e uma nova instância iniciada.Liveness probe: Tells Kubernetes whether a pod should be removed and a new instance started.

Ao pensar sondas, é útil para se lembrar de funcionamento de um serviço no Kubernetes.When thinking about probes, it's useful to recall how a service works in Kubernetes. Um serviço tem um Seletor de etiqueta que corresponda a um conjunto de pods (zero ou mais).A service has a label selector that matches a set of (zero or more) pods. Kubernetes carga distribui o tráfego para os pods que correspondam ao Seletor.Kubernetes load balances traffic to the pods that match the selector. Apenas os pods que foi iniciado com êxito e estão em bom estado recebem o tráfego.Only pods that started successfully and are healthy receive traffic. No caso de falha de um contentor, o Kubernetes interrompe o pod e agendas de uma substituição.If a container crashes, Kubernetes kills the pod and schedules a replacement.

Às vezes, um pod pode não estar pronto para receber tráfego, mesmo que o pod iniciada com êxito.Sometimes, a pod may not be ready to receive traffic, even though the pod started successfully. Por exemplo, podem ser tarefas de inicialização, onde o aplicativo em execução no contentor carrega coisas na memória ou lê dados de configuração.For example, there may be initialization tasks, where the application running in the container loads things into memory or reads configuration data. Para indicar que um pod está em bom estado, mas não está pronto para receber o tráfego, defina uma sonda de preparação.To indicate that a pod is healthy but not ready to receive traffic, define a readiness probe.

Sondas de liveness manipulam o caso em que um pod ainda está em execução, mas está danificado e deve ser reciclado.Liveness probes handle the case where a pod is still running, but is unhealthy and should be recycled. Por exemplo, suponha que o contentor estiver atendendo a solicitações HTTP, mas pára por algum motivo.For example, suppose that a container is serving HTTP requests but hangs for some reason. O contentor não entre em pane, mas estiver parado que serve todos os pedidos.The container doesn't crash, but it has stopped serving any requests. Se definir uma a sonda de HTTP, a sonda deixa de responder e que informa que o Kubernetes para reiniciar o pod.If you define an HTTP liveness probe, the probe will stop responding and that informs Kubernetes to restart the pod.

Aqui estão algumas considerações ao estruturar as sondas:Here are some considerations when designing probes:

  • Se o seu código tiver um tempo de inicialização longos, existe um perigo que a uma sonda de atividade reportará a falha antes da conclusão da inicialização.If your code has a long startup time, there is a danger that a liveness probe will report failure before the startup completes. Para evitar esta situação, utilize a definição de initialDelaySeconds, o que atrasa a sonda de iniciar.To prevent this, use the initialDelaySeconds setting, which delays the probe from starting.

  • A uma sonda de atividade não ajuda, a menos que reiniciar o pod provavelmente restaurá-lo para um bom estado de funcionamento.A liveness probe doesn't help unless restarting the pod is likely to restore it to a healthy state. Pode usar a uma sonda de atividade para mitigar contra vazamentos de memória ou deadlocks inesperados, mas não há nenhuma razão para reiniciar um pod que será imediatamente falhar novamente.You can use a liveness probe to mitigate against memory leaks or unexpected deadlocks, but there's no point in restarting a pod that's going to immediately fail again.

  • Às vezes, sondas de preparação são utilizadas para verificar os serviços dependentes.Sometimes readiness probes are used to check dependent services. Por exemplo, se um pod tem uma dependência num banco de dados, à sonda de atividade poderá verificar a ligação de base de dados.For example, if a pod has a dependency on a database, the liveness probe might check the database connection. No entanto, essa abordagem pode criar problemas inesperados.However, this approach can create unexpected problems. Um serviço externo poderão estar temporariamente indisponível por algum motivo.An external service might be temporarily unavailable for some reason. Isso fará com que a sonda de preparação para a falha para todos os pods no seu serviço, fazendo com que todos eles seja removido do balanceamento de carga e, portanto, criar a montante falhas em cascata.That will cause the readiness probe to fail for all the pods in your service, causing all of them to be removed from load balancing, and thus creating cascading failures upstream. Uma abordagem melhor é implementar o tratamento de repetição no seu serviço, para que o seu serviço pode recuperar corretamente de falhas transitórias.A better approach is to implement retry handling within your service, so that your service can recover correctly from transient failures.

Restrições de recursosResource constraints

Contenção de recursos pode afetar a disponibilidade de um serviço.Resource contention can affect the availability of a service. Defina restrições de recursos para contentores, para que um único contentor não pode sobrecarregar os recursos de cluster (memória e CPU).Define resource constraints for containers, so that a single container cannot overwhelm the cluster resources (memory and CPU). Para obter recursos fora do contentor, tais como threads ou de ligações de rede, considere utilizar o padrão de Bulkhead para isolar os recursos.For non-container resources, such as threads or network connections, consider using the Bulkhead Pattern to isolate resources.

Quotas de recursos de utilização para limitar o total de recursos permitido para um espaço de nomes.Use resource quotas to limit the total resources allowed for a namespace. Dessa forma, o front-end não é possível suprimir os serviços de back-end para recursos ou vice-versa.That way, the front end can't starve the backend services for resources or vice-versa.

Considerações de segurançaSecurity considerations

Controlo de acesso baseado em funções (RBAC)Role based access control (RBAC)

Kubernetes e o Azure tem mecanismos para controlo de acesso baseado em funções (RBAC):Kubernetes and Azure both have mechanisms for role-based access control (RBAC):

  • RBAC do Azure controla o acesso a recursos no Azure, incluindo a capacidade de criar novos recursos do Azure.Azure RBAC controls access to resources in Azure, including the ability to create new Azure resources. As permissões podem ser atribuídas a utilizadores, grupos ou principais de serviço.Permissions can be assigned to users, groups, or service principals. (É uma identidade de segurança utilizada por aplicações de um principal de serviço.)(A service principal is a security identity used by applications.)

  • RBAC de Kubernetes controla as permissões para a API do Kubernetes.Kubernetes RBAC controls permissions to the Kubernetes API. Por exemplo, criar os pods e listagem pods são ações que podem ser autorizadas (ou negadas) a um utilizador através do RBAC.For example, creating pods and listing pods are actions that can be authorized (or denied) to a user through RBAC. Para atribuir permissões de Kubernetes a utilizadores, crie funções e enlaces de função:To assign Kubernetes permissions to users, you create roles and role bindings:

    • Uma função é um conjunto de permissões que se aplicam num espaço de nomes.A Role is a set of permissions that apply within a namespace. As permissões são definidas como verbos (obter, atualizar, criar, eliminar) nos recursos (pods, implementações, etc.).Permissions are defined as verbs (get, update, create, delete) on resources (pods, deployments, etc.).

    • Um RoleBinding atribui a utilizadores ou grupos a uma função.A RoleBinding assigns users or groups to a Role.

    • Também é um objeto de ClusterRole, que é como uma função, mas se aplica a todo o cluster, em todos os espaços de nomes.There is also a ClusterRole object, which is like a Role but applies to the entire cluster, across all namespaces. Para atribuir utilizadores ou grupos a um ClusterRole, crie um ClusterRoleBinding.To assign users or groups to a ClusterRole, create a ClusterRoleBinding.

AKS integra-se esses dois mecanismos RBAC.AKS integrates these two RBAC mechanisms. Quando cria um cluster do AKS, pode configurar para utilizar o Azure AD para autenticação de utilizador.When you create an AKS cluster, you can configure it to use Azure AD for user authentication. Para obter detalhes sobre como configurar estas definições, consulte integrar o Azure Active Directory com o Azure Kubernetes Service.For details on how to set this up, see Integrate Azure Active Directory with Azure Kubernetes Service.

Assim que este é configurado, um usuário que deseja acessar a API do Kubernetes (por exemplo, através de kubectl) tem de iniciar sessão com as respetivas credenciais do Azure AD.Once this is configured, a user who wants to access the Kubernetes API (for example, through kubectl) must sign in using their Azure AD credentials.

Por predefinição, um utilizador não tem acesso ao cluster.By default, an Azure AD user has no access to the cluster. Para conceder acesso, o administrador de cluster cria RoleBindings que se referem a utilizadores do Azure AD ou grupos.To grant access, the cluster administrator creates RoleBindings that refer to Azure AD users or groups. Se um utilizador não tem permissões para uma determinada operação, ele falhará.If a user doesn't have permissions for a particular operation, it will fail.

Se utilizadores não têm acesso por padrão, como o administrador de cluster tem permissão para criar as associações de função em primeiro lugar?If users have no access by default, how does the cluster admin have permission to create the role bindings in the first place? Um cluster do AKS, na verdade, tem dois tipos de credenciais para chamar o servidor de API do Kubernetes: utilizador do cluster e o administrador de cluster. As credenciais de administrador de cluster concedem acesso total para o cluster.An AKS cluster actually has two types of credentials for calling the Kubernetes API server: cluster user and cluster admin. The cluster admin credentials grant full access to the cluster. O comando da CLI do Azure az aks get-credentials --admin transfere as credenciais de administrador de cluster e salva-os em seu arquivo kubeconfig.The Azure CLI command az aks get-credentials --admin downloads the cluster admin credentials and saves them into your kubeconfig file. O administrador de cluster pode utilizar este kubeconfig para criar funções e associações de função.The cluster administrator can use this kubeconfig to create roles and role bindings.

Uma vez que as credenciais de administrador de cluster são tão eficientes, utilize o RBAC do Azure para restringir o acesso aos mesmos:Because the cluster admin credentials are so powerful, use Azure RBAC to restrict access to them:

  • O "Azure Kubernetes Service Cluster função de administrador" tem permissão para transferir as credenciais de administrador de cluster.The "Azure Kubernetes Service Cluster Admin Role" has permission to download the cluster admin credentials. Apenas os administradores de cluster devem ser atribuídos a esta função.Only cluster administrators should be assigned to this role.

  • O "Azure Kubernetes Service Cluster função de utilizador" tem permissão para transferir as credenciais de utilizador do cluster.The "Azure Kubernetes Service Cluster User Role" has permission to download the cluster user credentials. Os utilizadores administradores não podem ser atribuídos a esta função.Non-admin users can be assigned to this role. Esta função não dá nenhuma permissão específica em recursos dentro do cluster do Kubernetes — apenas permite que um utilizador ligar ao servidor de API.This role does not give any particular permissions on Kubernetes resources inside the cluster — it just allows a user to connect to the API server.

Quando define as políticas RBAC (Kubernetes e do Azure), pense sobre as funções na sua organização:When you define your RBAC policies (both Kubernetes and Azure), think about the roles in your organization:

  • Quem pode criar ou eliminar um cluster do AKS e transferir as credenciais de administrador?Who can create or delete an AKS cluster and download the admin credentials?
  • Quem pode administrar um cluster?Who can administer a cluster?
  • Quem pode criar ou atualizar recursos dentro de um espaço de nomes?Who can create or update resources within a namespace?

É uma boa prática ao âmbito de RBAC do Kubernetes permissões por espaço de nomes com funções e RoleBindings, em vez de ClusterRoles e ClusterRoleBindings.It's a good practice to scope Kubernetes RBAC permissions by namespace, using Roles and RoleBindings, rather than ClusterRoles and ClusterRoleBindings.

Por fim, existe a questão das permissões que o cluster do AKS tem de criar e gerir recursos do Azure, como balanceadores de carga, funcionamento em rede ou armazenamento.Finally, there is the question of what permissions the AKS cluster has to create and manage Azure resources, such as load balancers, networking, or storage. Para se autenticar com APIs do Azure, o cluster utiliza um principal de serviço do Azure AD.To authenticate itself with Azure APIs, the cluster uses an Azure AD service principal. Se não especificar um principal de serviço ao criar o cluster, é criada uma automaticamente.If you don't specify a service principal when you create the cluster, one is created automatically. No entanto, é uma boa prática de segurança para criar o principal de serviço pela primeira vez e atribuir as permissões mínimas de RBAC a ele.However, it's a good security practice to create the service principal first and assign the minimal RBAC permissions to it. Para obter mais informações, consulte principais com o Azure Kubernetes Service de serviço.For more information, see Service principals with Azure Kubernetes Service.

Credenciais de gestão e a aplicação de segredosSecrets management and application credentials

Aplicações e serviços, muitas vezes, precisam de credenciais que permitem que os mesmos se liguem a serviços externos, como o armazenamento do Azure ou a base de dados SQL.Applications and services often need credentials that allow them to connect to external services such as Azure Storage or SQL Database. O desafio é manter estas credenciais seguros e não houve uma fuga-los.The challenge is to keep these credentials safe and not leak them.

Para obter recursos do Azure, uma opção é utilizar identidades geridas.For Azure resources, one option is to use managed identities. A idéia de uma identidade gerida é que uma aplicação ou serviço tem uma identidade armazenada no Azure AD e utiliza esta identidade para autenticar com um serviço do Azure.The idea of a managed identity is that an application or service has an identity stored in Azure AD, and uses this identity to authenticate with an Azure service. A aplicação ou serviço tem um Principal de serviço criada para o mesmo no Azure AD e autentica a utilização de tokens de OAuth 2.0.The application or service has a Service Principal created for it in Azure AD, and authenticates using OAuth 2.0 tokens. O processo de execução chama um endereço de localhost para obter o token.The executing process calls a localhost address to get the token. Dessa forma, não precisa de armazenar quaisquer palavras-passe ou cadeias de ligação.That way, you don't need to store any passwords or connection strings. Pode utilizar identidades geridas no AKS ao atribuir identidades a pods individuais, utilizando o identidade do pod do aad projeto.You can use managed identities in AKS by assigning identities to individual pods, using the aad-pod-identity project.

Atualmente, nem todos os serviços do Azure suportam a autenticação através de identidades geridas.Currently, not all Azure services support authentication using managed identities. Para obter uma lista, consulte que o suporte do Azure AD a autenticação dos serviços Azure.For a list, see Azure services that support Azure AD authentication.

Mesmo com identidades geridas, provavelmente precisará armazenar algumas credenciais ou outros segredos da aplicação, para serviços do Azure que não oferecem suporte a identidades geridas, os serviços de terceiros, chaves de API e assim por diante.Even with managed identities, you'll probably need to store some credentials or other application secrets, whether for Azure services that don't support managed identities, third-party services, API keys, and so on. Aqui estão algumas opções para armazenar segredos de forma segura:Here are some options for storing secrets securely:

  • Azure Key Vault.Azure Key Vault. No AKS, pode montar um ou mais segredos do Key Vault como um volume.In AKS, you can mount one or more secrets from Key Vault as a volume. O volume lê os segredos do Key Vault.The volume reads the secrets from Key Vault. O pod, em seguida, pode ler os segredos, tal como um volume normal.The pod can then read the secrets just like a regular volume. Para obter mais informações, consulte a Kubernetes-Cofre de chaves-FlexVolume projeto no GitHub.For more information, see the Kubernetes-KeyVault-FlexVolume project on GitHub.

    O pod autentica-se automaticamente com uma identidade de pod (descrita anteriormente) ou ao utilizar um Principal de serviço do Azure AD, juntamente com um segredo do cliente.The pod authenticates itself by using either a pod identity (described above) or by using an Azure AD Service Principal along with a client secret. É recomendado utilizar identidades de pod porque o segredo do cliente não é necessária nesse caso.Using pod identities is recommended because the client secret isn't needed in that case.

  • HashiCorp cofre.HashiCorp Vault. Aplicações do Kubernetes, podem autenticar com o Cofre HashiCorp com identidades do Azure AD gerido.Kubernetes applications can authenticate with HashiCorp Vault using Azure AD managed identities. Ver HashiCorp cofre participa como palestrante em Azure Active Directory.See HashiCorp Vault speaks Azure Active Directory. Pode implementar o próprio cofre para o Kubernetes, mas ele tem recomendo executá-lo num cluster dedicado separado do seu cluster do aplicativo.You can deploy Vault itself to Kubernetes, but it's recommend to run it in a separate dedicated cluster from your application cluster.

  • Segredos do Kubernetes.Kubernetes secrets. Outra opção é simplesmente usar os segredos de Kubernetes.Another option is simply to use Kubernetes secrets. Esta opção é a mais fácil de configurar, mas tem alguns desafios.This option is the easiest to configure but has some challenges. Segredos são armazenados num etcd, que é um arquivo de chave-valor distribuído.Secrets are stored in etcd, which is a distributed key-value store. AKS encripta etcd Inativos.AKS encrypts etcd at rest. Microsoft gerencia as chaves de encriptação.Microsoft manages the encryption keys.

Utilizar um sistema como HashiCorp cofre ou o Azure Key Vault fornece várias vantagens, como:Using a system like HashiCorp Vault or Azure Key Vault provides several advantages, such as:

  • Controle centralizado de segredos.Centralized control of secrets.
  • Garantir que todos os segredos são encriptados em inatividade.Ensuring that all secrets are encrypted at rest.
  • Gestão de chaves centralizada.Centralized key management.
  • Controlo de acesso de segredos.Access control of secrets.
  • AuditoriaAuditing

Segurança de pod e um contentorPod and container security

Esta lista certamente não é exaustiva, mas aqui estão algumas práticas recomendadas para proteger os seus pods e contentores:This list is certainly not exhaustive, but here are some recommended practices for securing your pods and containers:

Não, contentores são executados no modo privilegiado.Don't run containers in privileged mode. Modo privilegiado oferece um acesso de contentor para todos os dispositivos no anfitrião.Privileged mode gives a container access to all devices on the host. Pode definir a política de segurança de Pod para não permitir contêineres de em execução no modo privilegiado.You can set Pod Security Policy to disallow containers from running in privileged mode.

Sempre que possível, evite processos em execução como raiz no interior de contentores.When possible, avoid running processes as root inside containers. Contentores não fornecem isolamento completo de um ponto de vista de segurança, portanto, é melhor executar um processo de contentor como um utilizador sem privilégios.Containers do not provide complete isolation from a security standpoint, so it's better to run a container process as a non-privileged user.

Store imagens num registo privado fidedigno, como o Azure Container Registry ou o Docker Registry fidedigno.Store images in a trusted private registry, such as Azure Container Registry or Docker Trusted Registry. Utilize um webhook de admissão de validação no Kubernetes para garantir que o pods apenas podem solicitar imagens do registo fidedigno.Use a validating admission webhook in Kubernetes to ensure that pods can only pull images from the trusted registry.

Analise imagens de vulnerabilidades conhecidas, através de uma solução de análise como Twistlock e ciano, que estão disponíveis através do Azure Marketplace.Scan images for known vulnerabilities, using a scanning solution such as Twistlock and Aqua, which are available through the Azure Marketplace.

Automatize a aplicação de patches de imagem com o ACR tarefas, uma funcionalidade do Azure Container Registry.Automate image patching using ACR Tasks, a feature of Azure Container Registry. Uma imagem de contentor baseia-das camadas.A container image is built up from layers. As camadas de bases incluem a imagem do SO e imagens de estrutura de aplicativo, como ASP.NET Core ou node. js.The base layers include the OS image and application framework images, such as ASP.NET Core or Node.js. As imagens de base são normalmente criadas a montante de desenvolvedores de aplicativos e são mantidas por outros maintainers de projeto.The base images are typically created upstream from the application developers, and are maintained by other project maintainers. Quando essas imagens são todos os patches a montante, é importante atualizar, testar e voltar a implementar suas próprias imagens, para que não deixe quaisquer vulnerabilidades de segurança conhecidos.When these images are patched upstream, it's important to update, test, and redeploy your own images, so that you don't leave any known security vulnerabilities. Tarefas de ACR pode ajudar a automatizar esse processo.ACR Tasks can help to automate this process.

Considerações de implementação (CI/CD)Deployment (CI/CD) considerations

Aqui estão alguns objetivos de um processo de CI/CD robusto para uma arquitetura de microsserviços:Here are some goals of a robust CI/CD process for a microservices architecture:

  • Cada equipe pode criar e implementar os serviços que ele é proprietário de forma independente, sem afetar ou interromper outras equipes.Each team can build and deploy the services that it owns independently, without affecting or disrupting other teams.

  • Antes de uma nova versão de um serviço for implementada para produção, é implementada para ambientes de dev/teste/controle de qualidade para a validação.Before a new version of a service is deployed to production, it gets deployed to dev/test/QA environments for validation. Limites de qualidade são impostas em cada estágio.Quality gates are enforced at each stage.

  • Uma nova versão de um serviço pode ser implantada lado a lado com a versão anterior.A new version of a service can be deployed side-by-side with the previous version.

  • Políticas de controlo de acesso suficientes estão em vigor.Sufficient access control policies are in place.

  • Pode confiar as imagens de contentor que são implementadas em produção.You can trust the container images that are deployed to production.

Isolamento de ambientesIsolation of environments

Terá vários ambientes para implementar serviços, incluindo ambientes de desenvolvimento, testes automatizados de evidências, testes de integração, teste de carga e, finalmente, produção.You will have multiple environments where you deploy services, including environments for development, smoke testing, integration testing, load testing, and finally production. Estes ambientes têm algum nível de isolamento.These environments need some level of isolation. No Kubernetes, tem uma opção entre isolamento físico e isolamento lógico.In Kubernetes, you have a choice between physical isolation and logical isolation. Isolamento físico significa implementar clusters separados.Physical isolation means deploying to separate clusters. Isolamento lógico faz uso de espaços de nomes e as políticas, conforme descrito anteriormente.Logical isolation makes use of namespaces and policies, as described earlier.

Nossa recomendação é criar um cluster de produção dedicado, juntamente com um cluster separado dos seus ambientes de programador/teste.Our recommendation is to create a dedicated production cluster along with a separate cluster for your dev/test environments. Utilize isolação lógica para separar ambientes dentro do cluster de desenvolvimento/teste.Use logical isolation to separate environments within the dev/test cluster. Serviços implementados no cluster de desenvolvimento/teste nunca devem ter acesso aos arquivos de dados que contêm dados de negócio.Services deployed to the dev/test cluster should never have access to data stores that hold business data.

HelmHelm

Considere utilizar o Helm para gerir a criação e implementação de serviços.Consider using Helm to manage building and deploying services. Alguns dos recursos do Helm que ajudam a com CI/CD incluem:Some of the features of Helm that help with CI/CD include:

  • Organizar todos os objetos de Kubernetes para um microsserviço particular num único gráfico do Helm.Organizing all of the Kubernetes objects for a particular microservice into a single Helm chart.
  • Implantando o gráfico como um comando helm único, em vez de uma série de comandos do kubectl.Deploying the chart as a single helm command, rather than a series of kubectl commands.
  • Controlo de atualizações e revisões, usando um controle de versão semântico, juntamente com a capacidade de reverter para uma versão anterior.Tracking updates and revisions, using semantic versioning, along with the ability to roll back to a previous version.
  • O uso de modelos para evitar a duplicação de informações, como etiquetas e seletores, em muitos ficheiros.The use of templates to avoid duplicating information, such as labels and selectors, across many files.
  • Gerir as dependências entre gráficos.Managing dependencies between charts.
  • Publicação de um repositório Helm, como o Azure Container Registry, gráficos e integrá-las com o pipeline de compilação.Publishing charts to a Helm repository, such as Azure Container Registry, and integrating them with the build pipeline.

Para obter mais informações sobre como utilizar o registo de contentor como um repositório Helm, consulte utilização do Azure Container Registry como repositório Helm para seus gráficos de aplicativo.For more information about using Container Registry as a Helm repository, see Use Azure Container Registry as a Helm repository for your application charts.

Fluxo de trabalho de CI/CDCI/CD workflow

Antes de criar um fluxo de trabalho de CI/CD, deve saber como a base de código será estruturada e gerenciada.Before creating a CI/CD workflow, you must know how the code base will be structured and managed.

  • As equipas funcionam em repositórios separados ou num monorepo (único repositório)?Do teams work in separate respositories or in a monorepo (single respository)?
  • O que é a sua estratégia de ramificação?What is your branching strategy?
  • Quem pode emitir o código de produção?Who can push code to production? Existe uma função de Gestor de versão?Is there a release manager role?

A abordagem de monorepo tem vindo a ganhar favor, mas há vantagens e desvantagens para ambos.The monorepo approach has been gaining favor but there are advantages and disadvantages to both.

  MonorepoMonorepo Vários repositóriosMultiple repos
VantagensAdvantages Compartilhamento de códigoCode sharing
Mais fácil padronizar o código e as ferramentasEasier to standardize code and tooling
Mais fácil para refatorar o códigoEasier to refactor code
Capacidade de deteção - única vista do códigoDiscoverability - single view of the code
Propriedade clara por equipeClear ownership per team
Potencialmente menos conflitos de intercalaçãoPotentially fewer merge conflicts
Ajuda a impor a separação dos microsserviçosHelps to enforce decoupling of microservices
DesafiosChallenges Alterações ao código compartilhado podem afetar múltiplos microsserviçosChanges to shared code can affect multiple microservices
Maior possibilidade de conflitos de intercalaçãoGreater potential for merge conflicts
As ferramentas tem de dimensionar para uma base de códigos grandesTooling must scale to a large code base
Controlo de acessoAccess control
Processo de implantação mais complexoMore complex deployment process
Mais difícil de compartilhar códigoHarder to share code
Mais difícil de impor padrões de codificaçãoHarder to enforce coding standards
Gestão de dependênciasDependency management
Diffuse detectabilidade de base, fraco de códigoDiffuse code base, poor discoverability
Falta de infraestrutura partilhadaLack of shared infrastructure

Nesta seção, Apresentaremos um fluxo de trabalho CI/CD possível, com base nas seguintes suposições:In this section, we present a possible CI/CD workflow, based on the following assumptions:

  • O repositório de código é monorepo, com pastas organizados por microsserviços.The code repository is monorepo, with folders organized by microservice.
  • Estratégia de ramificação da equipe se baseia desenvolvimento baseado em ramal.The team's branching strategy is based on trunk-based development.
  • As utilizações de equipe Pipelines do Azure para executar o processo de CI/CD.The team uses Azure Pipelines to run the CI/CD process.
  • As utilizações de equipe espaços de nomes no Azure Container Registry para isolar as imagens que são aprovadas para produção a partir de imagens que ainda estão a ser testada.The team uses namespaces in Azure Container Registry to isolate images that are approved for production from images that are still being tested.

Neste exemplo, um desenvolvedor está trabalhando num microsserviço chamado serviço de entrega.In this example, a developer is working on a microservice called Delivery Service. (O nome tem origem a implementação de referência descrita aqui.) Ao desenvolver um novo recurso, o desenvolvedor verifica o código numa ramificação recursos.(The name comes from the reference implementation described here.) While developing a new feature, the developer checks code into a feature branch.

Fluxo de trabalho de CI/CD

Emitir consolidações para este tiggers ramo uma compilação CI para os microsserviços.Pushing commits to this branch tiggers a CI build for the microservice. Por convenção, ramificações recursos são nomeadas feature/*.By convention, feature branches are named feature/*. O criar o ficheiro de definição inclui um acionador que filtra o nome do ramo e o caminho de origem.The build definition file includes a trigger that filters by the branch name and the source path. Com essa abordagem, cada equipe pode ter seu próprio pipeline de compilação.Using this approach, each team can have its own build pipeline.

trigger:
  batch: true
  branches:
    include:
    - master
    - feature/*

    exclude:
    - feature/experimental/*

  paths:
     include:
     - /src/shipping/delivery/

Neste ponto no fluxo de trabalho, a compilação CI executa alguma verificação de código mínimo:At this point in the workflow, the CI build runs some minimal code verification:

  1. Compilar códigoBuild code
  2. Executar testes de unidadeRun unit tests

A ideia aqui é manter os tempos de compilação curtos para que o desenvolvedor possa obter comentários rápidos.The idea here is to keep the build times short so the developer can get quick feedback. Quando o recurso está pronto para intercalar no principal, o desenvolvedor abre um pp.When the feature is ready to merge into master, the developer opens a PR. Isto aciona outro compilação CI que executa algumas verificações adicionais:This triggers another CI build that performs some additional checks:

  1. Compilar códigoBuild code
  2. Executar testes de unidadeRun unit tests
  3. Criar a imagem de contentor do tempo de execuçãoBuild the runtime container image
  4. Executar análises de vulnerabilidade na imagemRun vulnerability scans on the image

Fluxo de trabalho de CI/CD

Nota

Nos repositórios do Azure, pode definir políticas para proteger os ramos.In Azure Repos, you can define policies to protect branches. Por exemplo, a política pode exigir uma compilação CI com êxito, mais uma aprovação de um aprovador para mesclar no principal.For example, the policy could require a successful CI build plus a sign-off from an approver in order to merge into master.

Em algum momento, a equipe está pronta para implantar uma nova versão do serviço de entrega.At some point, the team is ready to deploy a new version of the Delivery service. Para fazer isso, o gerente de versão cria um ramo a partir do mestre com este padrão de nomenclatura: release/<microservice name>/<semver>.To do so, the release manager creates a branch from master with this naming pattern: release/<microservice name>/<semver>. Por exemplo, release/delivery/v1.0.2.For example, release/delivery/v1.0.2. Isto aciona uma compilação CI completa, que executa todos os passos anteriores e ainda:This triggers a full CI build that runs all the previous steps plus:

  1. Envie a imagem do Docker para o Azure Container Registry.Push the Docker image to Azure Container Registry. A imagem é marcada com o número de versão obtido a partir do nome do ramo.The image is tagged with the version number taken from the branch name.
  2. Executar helm package para empacotar o gráfico HelmRun helm package to package the Helm chart
  3. Enviar o pacote do Helm para Container Registry através da execução az acr helm push.Push the Helm package to Container Registry by running az acr helm push.

Partindo do princípio de que esta compilação for concluída com êxito, aciona um processo de implantação usando uma Pipelines do Azure pipeline de lançamento.Assuming this build succeeds, it triggers a deployment process using an Azure Pipelines release pipeline. Este pipelineThis pipeline

  1. Executar helm upgrade para implementar o gráfico Helm para um ambiente de controle de qualidade.Run helm upgrade to deploy the Helm chart to a QA environment.
  2. Inicia um aprovador, antes do pacote de passa para produção.An approver signs off before the package moves to production. Ver controlo de implementação de versão com as aprovações.See Release deployment control using approvals.
  3. Novamente, etiqueta a imagem do Docker para o espaço de nomes de produção no Azure Container Registry.Re-tag the Docker image for the production namespace in Azure Container Registry. Por exemplo, se a etiqueta atual é myrepo.azurecr.io/delivery:v1.0.2, a marca de produção é reponame.azurecr.io/prod/delivery:v1.0.2.For example, if the current tag is myrepo.azurecr.io/delivery:v1.0.2, the production tag is reponame.azurecr.io/prod/delivery:v1.0.2.
  4. Executar helm upgrade para implementar o gráfico Helm para o ambiente de produção.Run helm upgrade to deploy the Helm chart to the production environment.

Fluxo de trabalho de CI/CD

É importante lembrar-se de que, mesmo num monorepo, estas tarefas podem ser confinadas para microsserviços individuais, para que as equipes podem implementar com grande velocidade.It's important to remember that even in a monorepo, these tasks can be scoped to individual microservices, so that teams can deploy with high velocity. Existem alguns passos manuais no processo de: Aprovar pedidos pull, criar ramos de lançamento e aprovar as implementações para o cluster de produção.There are some manual steps in the process: Approving PRs, creating release branches, and approving deployments into the production cluster. Essas etapas são manuais pela política — eles poderiam ser completamente automatizados se a organização prefere.These steps are manual by policy — they could be completely automated if the organization prefers.