Arquitetura de microsserviços no AKS (Serviço de Kubernetes do Azure)Microservices architecture on Azure Kubernetes Service (AKS)

Essa arquitetura de referência mostra um aplicativo de microserviços implantado no AKS (serviço kubernetes do Azure).This reference architecture shows a microservices application deployed to Azure Kubernetes Service (AKS). Ele descreve uma configuração básica de AKS que pode ser o ponto de partida para a maioria das implantações.It describes a basic AKS configuration that can be the starting point for most deployments. Este artigo pressupõe conhecimentos básicos de Kubernetes.This article assumes basic knowledge of Kubernetes. O artigo se concentra principalmente na infraestrutura e nas considerações de DevOps na 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ção sobre como criar microserviços, consulte criando microserviços no Azure.For guidance on how to design microservices, see Building microservices on Azure.

Logotipo do GitHub uma implementação de referência dessa arquitetura está disponível no GitHub.GitHub logo A reference implementation of this architecture is available on GitHub.

Arquitetura de referência do AKS

Baixe um Arquivo Visio dessa arquitetura.Download a Visio file of this architecture.

ArquiteturaArchitecture

A arquitetura consiste nos componentes a seguir.The architecture consists of the following components.

AKs ( serviço kubernetes do Azure ).Azure Kubernetes Service (AKS). O AKS é um serviço do Azure que implanta um cluster do Kubernetes gerenciado.AKS is an Azure service that deploys a managed Kubernetes cluster.

Cluster kubernetes.Kubernetes cluster. AKS é responsável por implantar o cluster kubernetes e gerenciar o servidor de API kubernetes.AKS is responsible for deploying the Kubernetes cluster and for managing the Kubernetes API server. Você só pode gerenciar os nós de agente.You only manage the agent nodes.

Rede virtual.Virtual network. Por padrão, o AKS cria uma rede virtual para ter onde implantar os nós de agente.By default, AKS creates a virtual network to deploy the agent nodes into. Para cenários mais avançados, você pode criar a rede virtual primeiro, que permite controlar, por exemplo, como as sub-redes são configuradas, a conectividade local e o 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 rede avançada no AKS (Serviço de Kubernetes do Azure).For more information, see Configure advanced networking in Azure Kubernetes Service (AKS).

Entrada.Ingress. Uma entrada expõe as 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 seção Gateway de API abaixo.For more information, see the section API Gateway below.

Azure Load Balancer.Azure Load Balancer. Um Azure Load Balancer é criado quando o controlador de entrada NGINX é implantado.An Azure Load Balancer is created when the NGINX ingress controller is deployed. O balanceador de carga roteia o tráfego da Internet para a entrada.The load balancer routes internet traffic to the ingress.

Armazenamentos de dados externos.External data stores. Microsserviços são normalmente sem estado e gravam o estado em armazenamentos de dados externos, como o Banco de Dados SQL do Azure ou o Cosmos DB.Microservices are typically stateless and write state to external data stores, such as Azure SQL Database or Cosmos DB.

Azure Active Directory.Azure Active Directory. O AKS usa uma identidade do Azure AD (Azure Active Directory) para criar e gerenciar outros recursos do Azure, como os 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 autenticação de usuário em aplicativos cliente.Azure AD is also recommended for user authentication in client applications.

Registro de contêiner do Azure.Azure Container Registry. Use o Registro de Contêiner para armazenar imagens privadas do Docker, que são implantadas no cluster.Use Container Registry to store private Docker images, which are deployed to the cluster. O AKS pode fazer a autenticação com o Registro de Contêiner usando sua identidade do Azure AD.AKS can authenticate with Container Registry using its Azure AD identity. Observe que o AKS não exige o Registro de Contêiner do Azure.Note that AKS does not require Azure Container Registry. Você pode usar outros registros de contêiner, como o Hub do Docker.You can use other container registries, such as Docker Hub.

Azure Pipelines.Azure Pipelines. O Azure Pipelines faz parte dos serviços de DevOps do Azure e executa compilações, testes e implantações automatizadas.Pipelines is part of Azure DevOps Services and runs automated builds, tests, and deployments. Você também pode usar soluções de CI/CD de terceiros, como o Jenkins.You can also use third-party CI/CD solutions such as Jenkins.

Helm.Helm. O Helm funciona como um gerenciador de pacotes para o Kubernetes — e é uma maneira de agrupar objetos Kubernetes em uma única unidade que você pode publicar, implantar, atualizar e controlar a versão.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.

Azure Monitor.Azure Monitor. O Azure Monitor coleta e armazena métricas e logs, inclusive a métrica de plataforma para os serviços do Azure na telemetria do aplicativo e da solução.Azure Monitor collects and stores metrics and logs, including platform metrics for the Azure services in the solution and application telemetry. Use esses dados para monitorar o aplicativo, configurar alertas e painéis e executar 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 coletar métricas de controladores, nós e contêineres, bem como logs de contêiner e de nó.Azure Monitor integrates with AKS to collect metrics from controllers, nodes, and containers, as well as container and node logs.

Considerações sobre o designDesign considerations

Essa arquitetura de referência se concentra em arquiteturas de microsserviços, embora muitas das práticas recomendadas serão aplicáveis 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

Um microsserviço é uma unidade flexível, com implantação independente do código.A microservice is a loosely coupled, independently deployable unit of code. Os microserviços normalmente se comunicam por meio de APIs bem definidas e são detectáveis por meio de alguma forma de descoberta de serviço.Microservices typically communicate through well-defined APIs and are discoverable through some form of service discovery. O serviço sempre deve estar acessível mesmo quando o pods se movimentar.The service should always be reachable even when the pods move around. O objeto de serviço kubernetes é uma maneira natural de modelar os microserviços no kubernetes.The Kubernetes Service object is a natural way to model microservices in Kubernetes.

Gateway de APIAPI gateway

Gateways de API são um padrão de design de microsserviços geral.API gateways are a general microservices design pattern. Um Gateway de API fica entre clientes externos e os microserviços.An API gateway sits between external clients and the microservices. Ele atua como um proxy reverso, encaminhando as solicitações de clientes para os microsserviços.It acts as a reverse proxy, routing requests from clients to microservices. Ele também pode executar várias tarefas detalhadas, como autenticação, terminação de SSL e a limitação de taxa.It may also perform various cross-cutting tasks such as authentication, SSL termination, and rate limiting. Para obter mais informações, consulteFor more information, see

No kubernetes, a funcionalidade de um gateway de API é manipulada principalmente pelo recurso de entrada e pelo controlador de entrada.In Kubernetes, the functionality of an API gateway is mostly handled by the Ingress resource and the Ingress controller. As considerações são descritas na seção entrada .The considerations are described in the Ingress section.

Armazenamento de dadosData storage

Em uma arquitetura de microsserviços, os serviços não devem compartilhar o armazenamento de dados.In a microservices architecture, services should not share data storage. Cada serviço deve possuir seus próprios dados privados em um 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 disso é evitar o acoplamento não intencional entre serviços, o que poderá ocorrer se os serviços compartilharem os mesmos esquemas de dados subjacentes.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 gerenciam seus próprios armazenamentos de dados, eles podem usar o armazenamento de dados adequado para 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 projetando microservices: considerações de dados.For more information, see Designing microservices: Data considerations.

Evite armazenar dados persistentes no armazenamento de cluster local, pois isso vincula os dados ao nó.Avoid storing persistent data in local cluster storage, because that ties the data to the node. Em vez disso:Instead,

  • Use um serviço externo, como o Banco de Dados SQL do Azure ou Cosmos DB ouUse an external service such as Azure SQL Database or Cosmos DB, or

  • Monte um volume persistente usando Discos do Azure ou Arquivos do Azure.Mount a persistent volume using Azure Disks or Azure Files. Use os Arquivos do Azure quando o mesmo volume precisar ser compartilhado por vários pods.Use Azure Files if the same volume needs to be shared by multiple pods.

Objeto de serviçoService object

O objeto de serviço kubernetes fornece um conjunto de recursos que correspondem aos requisitos de microserviços para descoberta de serviço:The Kubernetes Service object provides a set of capabilities that match the microservices requirements for service discoverability:

  • Endereço IP.IP address. O objeto Service fornece um endereço IP interno estático para um grupo de pods (ReplicaSet).The Service object provides a static internal IP address for a group of pods (ReplicaSet). À medida que os pods são criados ou movidos, o serviço fica sempre acessível nesse 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. A carga do tráfego enviado para o endereço IP do serviço é balanceada nos pods.Traffic sent to the service's IP address is load balanced to the pods.

  • Descoberta de serviço.Service discovery. Os serviços recebem entradas DNS internas do serviço 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 usando o nome DNS.That means the API gateway can call a backend service using the DNS name. O mesmo mecanismo pode ser usado para comunicação entre serviços.The same mechanism can be used for service-to-service communication. As entradas DNS são organizadas por namespace e, portanto, se seus namespaces correspondem aos contextos limitados, o nome DNS para um serviço será mapeado 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 a seguir mostra a relação conceitual entre serviços e pods.The following diagram shows the conceptual relation between services and pods. O mapeamento real para portas e endereços IP do ponto de extremidade é feito pelo kube-proxy, 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

EntradaIngress

No kubernetes, o controlador de entrada pode implementar o padrão de gateway de API.In Kubernetes, the Ingress controller might implement the API gateway pattern. Nesse caso, o controlador de entrada e de entrada funciona em conjunto para fornecer estes recursos:In that case, Ingress and Ingress controller work in conjunction to provide these features:

  • Encaminhe solicitações de cliente para os serviços de back-end corretos.Route client requests to the right backend services. Isso cria um ponto de extremidade único para os clientes e ajuda a separar clientes de serviços.This provides a single endpoint for clients, and helps to decouple clients from services.

  • Agregue várias solicitações em uma única solicitação, para reduzir a invisibilidade entre o cliente e o back-end.Aggregate multiple requests into a single request, to reduce chattiness between the client and the backend.

  • Descarregue a funcionalidade dos serviços de back-end, como terminação SSL, autenticação, restrições de IP ou limitação de taxa de cliente (limitação).Offload functionality from the backend services, such as SSL termination, authentication, IP restrictions, or client rate limiting (throttling).

A entrada abstrai as definições de configuração para um servidor proxy.Ingress abstracts the configuration settings for a proxy server. Você também precisa de um controlador de entrada, que fornece a implementação subjacente da entrada.You also need an Ingress controller, which provides the underlying implementation of the Ingress. Há controladores de entrada para Nginx, HAProxy, Traefik e gateway de Aplicativo Azure, entre outros.There are Ingress controllers for Nginx, HAProxy, Traefik, and Azure Application Gateway, among others.

O recurso de entrada pode ser atendido por diferentes tecnologias.The Ingress resource can be fulfilled by different technologies. Para trabalhar juntos, eles precisam ser implantados como controlador de entrada dentro do cluster.To work together, they need to be deployed as the Ingress controller inside the cluster. Ele funciona como o roteador de borda ou o proxy reverso.It operates as the edge router or reverse proxy. Um servidor proxy reverso é um possível gargalo ou um ponto único de falha, portanto, sempre implante pelo menos duas réplicas para alta disponibilidade.A reverse proxy server is a potential bottleneck or single point of failure, so always deploy at least two replicas for high availability.

Geralmente, a configuração do servidor proxy requer arquivos complexos, o que pode ser difícil de ajustar se você não for um especialista.Often, configuring the proxy server requires complex files, which can be hard to tune if you aren't an expert. Portanto, o controlador de entrada fornece uma boa abstração.So, the Ingress controller provides a nice abstraction. O controlador de entrada também tem acesso à API kubernetes, para que possa tomar decisões inteligentes sobre roteamento e balanceamento de carga.The Ingress controller also has access to the Kubernetes API, so it can make intelligent decisions about routing and load balancing. Por exemplo, o controlador de entrada Nginx ignora o proxy de rede do kube-proxy.For example, the Nginx ingress controller bypasses the kube-proxy network proxy.

Por outro lado, se você precisa de controle total sobre as configurações, talvez queira 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. Para obter mais informações, consulte implantando Nginx ou HAProxy em kubernetes.For more information, see Deploying Nginx or HAProxy to Kubernetes.

Para AKS, você também pode usar Aplicativo Azure gateway, usando o controlador de entrada do gateway de aplicativo.For AKS, you can also use Azure Application Gateway, using the Application Gateway Ingress Controller. Essa opção requer que a rede CNI seja habilitada quando você configura o cluster AKs, pois o gateway de aplicativo é implantado em uma sub-rede da rede virtual AKs.This option requires CNI networking to be enabled when you configure the AKS cluster, because Application Gateway is deployed into a subnet of the AKS virtual network. Aplicativo Azure gateway pode executar roteamento de camada 7 e terminação SSL.Azure Application Gateway can perform layer-7 routing and SSL termination. Ele também tem suporte interno para WAF (firewall do aplicativo Web).It also has built-in support for web application firewall (WAF).

Para obter informações sobre os serviços de balanceamento de carga no Azure, consulte visão geral das opções de balanceamento de carga no Azure.For information about load-balancing services in Azure, see Overview of load-balancing options in Azure.

Criptografia TLS/SSLTLS/SSL encryption

Em implementações comuns, o controlador de entrada é usado para terminação SSL.In common implementations, the Ingress controller is used for SSL termination. Assim, como parte da implantação do controlador de entrada, você precisa criar um certificado TLS.So, as part of deploying the Ingress controller, you need to create a TLS certificate. Use somente certificados autoassinados para fins de desenvolvimento/teste.Only use self-signed certificates for dev/test purposes. Para obter mais informações, consulte criar um controlador de entrada HTTPS e usar seus próprios certificados TLS no serviço de kubernetes do Azure (AKs).For more information, see Create an HTTPS ingress controller and use your own TLS certificates on Azure Kubernetes Service (AKS).

Para cargas de trabalho de produção, obtenha certificados assinados de autoridades de certificação confiáveis (CA).For production workloads, get signed certificates from trusted certificate authorities (CA). Para obter informações sobre como gerar e configurar os certificados criptografados , consulte criar um controlador de entrada com um endereço IP público estático no serviço de kubernetes do Azure (AKs).For information about generating and configuring Let's Encrypt certificates, see Create an ingress controller with a static public IP address in Azure Kubernetes Service (AKS).

Talvez você também precise girar seus certificados de acordo com as políticas da organização.You may also need to rotate your certificates as per the organization's policies. Para obter informações, consulte Rotate Certificates in Azure kubernetes Service (AKs).For information, see, Rotate certificates in Azure Kubernetes Service (AKS).

NamespacesNamespaces

Use namespaces para organizar os serviços dentro do cluster.Use namespaces to organize services within the cluster. Todos os objetos em um cluster do Kubernetes pertencem a um namespace.Every object in a Kubernetes cluster belongs to a namespace. Por padrão, quando você cria um novo objeto, ele vai para o namespace default.By default, when you create a new object, it goes into the default namespace. Porém, é uma boa prática criar namespaces que sejam mais descritivos para ajudar a organizar os recursos no cluster.But it's a good practice to create namespaces that are more descriptive to help organize the resources in the cluster.

Primeiro, os namespaces ajudam a evitar conflitos de nomenclatura.First, namespaces help prevent naming collisions. Quando várias equipes implantam microsserviços no mesmo cluster, com possivelmente centenas de microsserviços, fica difícil administrar se todos vão para o mesmo namespace.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, os namespaces permitem a você:In addition, namespaces allow you to:

  • Aplicar restrições de recursos a um namespace, para que o conjunto total de pods atribuído ao namespace não ultrapasse a cota de recursos do namespace.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.

  • Aplicar políticas no nível do namespace, incluindo políticas de RBAC e segurança.Apply policies at the namespace level, including RBAC and security policies.

Para uma arquitetura de microsserviços, considere organizar os microsserviços em contextos limitados e criar namespaces para cada contexto limitado.For a microservices architecture, considering organizing the microservices into bounded contexts, and creating namespaces for each bounded context. Por exemplo, todos os microsserviços relativos ao contexto limitado "Preenchimento de pedidos" poderiam ir para o mesmo namespace.For example, all microservices related to the "Order Fulfillment" bounded context could go into the same namespace. Outra alternativa é criar um namespace para cada equipe de desenvolvimento.Alternatively, create a namespace for each development team.

Posicione os serviços essenciais em seu próprio namespace separado.Place utility services into their own separate namespace. Por exemplo, você pode implantar Elasticsearch ou Prometheus para monitoramento de cluster, ou Tiller para o Helm.For example, you might deploy Elasticsearch or Prometheus for cluster monitoring, or Tiller for Helm.

Dimensionamento automáticoAutoscaling

O Kubernetes dá suporte à expansão em dois níveis:Kubernetes supports scale-out at two levels:

  • Dimensionar o número de pods alocado a uma implantação.Scale the number of pods allocated to a deployment.
  • Dimensionar os nós no 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 você possa escalar horizontalmente os pods e nós manualmente, recomendamos usar o dimensionamento automático para minimizar a possibilidade de os serviços ficarem sem recursos quando a carga é alta.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 precisa levar em consideração pods e nós.An autoscaling strategy must take both pods and nodes into account. Se você simplesmente escalar os pods horizontalmente, acabará atingindo os limites de recursos dos nós.If you just scale out the pods, eventually you will reach the resource limits of the nodes.

Dimensionamento automático de podsPod autoscaling

O HPA (Dimensionador Automático de Pod Horizontal) dimensiona os pods com base em métricas personalizadas, memória ou CPU observadas.The Horizontal Pod Autoscaler (HPA) scales pods based on observed CPU, memory, or custom metrics. Para configurar o dimensionamento horizontal de pods, você pode especificar 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. Você deve fazer um teste de carga nos serviços para obter esses números.You should load test your services to derive these numbers.

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

  • Use investigações de preparação para que o Kubernetes saiba quando um novo pod está pronto para aceitar tráfego.Use readiness probes to let Kubernetes know when a new pod is ready to accept traffic.
  • Use os orçamentos de interrupção de pod para limitar quantos pods podem ser removidos de um serviço de cada vez.Use pod disruption budgets to limit how many pods can be evicted from a service at a time.

Dimensionamento automático do clusterCluster autoscaling

O dimensionador automático de cluster dimensiona o número de nós.The cluster autoscaler scales the number of nodes. Se pods não puderem ser agendados devido a restrições de recursos, o dimensionador automático de cluster provisionará mais nós.If pods can't be scheduled because of resource constraints, the cluster autoscaler will provision more nodes.

Enquanto o HPA examina os recursos reais consumidos ou outras métricas dos pods em execução, o dimensionador automático de cluster está provisionando nós para pods que ainda não estão agendados.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. Portanto, ele examina os recursos solicitados, conforme especificado nas especificações de pod do Kubernetes para uma determinada implantaçã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 mudar o tamanho da VM depois de criar um cluster, ou seja, é necessário fazer um planejamento da capacidade inicial para escolher um tamanho de VM adequado para os nós de agente ao 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.

Investigações de integridadeHealth probes

O Kubernetes define dois tipos de investigação de integridade que um pod pode expor:Kubernetes defines two types of health probe that a pod can expose:

  • Investigação de preparação: informa kubernetes se o Pod está pronto para aceitar solicitações.Readiness probe: Tells Kubernetes whether the pod is ready to accept requests.

  • Investigação de tempo de vida: informa ao kubernetes se um pod deve ser removido e uma nova instância foi iniciada.Liveness probe: Tells Kubernetes whether a pod should be removed and a new instance started.

Ao pensar sobre os testes, é útil se lembrar de como funciona 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 rótulo que corresponde a um conjunto de pods (zero ou mais).A service has a label selector that matches a set of (zero or more) pods. O Kubernetes balanceia a carga de tráfego para os pods que correspondem ao seletor.Kubernetes load balances traffic to the pods that match the selector. Somente os pods que foram iniciados com êxito e estão íntegros recebem tráfego.Only pods that started successfully and are healthy receive traffic. Em caso de falha de um contêiner, o Kubernetes elimina o pod e agenda 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 tenha sido iniciado com êxito.Sometimes, a pod may not be ready to receive traffic, even though the pod started successfully. Por exemplo, pode haver tarefas de inicialização em que o aplicativo em execução no contêiner carregue coisas na memória ou leia 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á íntegro, mas não está pronto para receber tráfego, defina uma investigação de preparação.To indicate that a pod is healthy but not ready to receive traffic, define a readiness probe.

As investigações de atividade lidam com pods ainda em execução, mas que não estão íntegros e devem ser reciclados.Liveness probes handle the case where a pod is still running, but is unhealthy and should be recycled. Por exemplo, suponha que um contêiner esteja atendendo a solicitações HTTP, mas pare de responder por algum motivo.For example, suppose that a container is serving HTTP requests but hangs for some reason. O contêiner não falha, mas ele para de atender às solicitações.The container doesn't crash, but it has stopped serving any requests. Se você definir uma investigação de atividade de HTTP, a investigação vai parar de responder e informa ao 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 para a criação de testes:Here are some considerations when designing probes:

  • Se o código tem um longo tempo de inicialização, há o risco de uma investigação de atividade relatar 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 isso, use a configuração initialDelaySeconds, que atrasa o início da investigação.To prevent this, use the initialDelaySeconds setting, which delays the probe from starting.

  • A investigação de atividade só ajuda se a reinicialização do pod tiver chance de restaurá-lo para um estado íntegro.A liveness probe doesn't help unless restarting the pod is likely to restore it to a healthy state. Você pode usar uma investigação de atividade para reduzir vazamentos de memória ou deadlocks inesperados, mas não há nenhuma razão para reiniciar um pod que vai falhar novamente de imediato.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, as investigações de preparação são usadas para verificar serviços dependentes.Sometimes readiness probes are used to check dependent services. Por exemplo, se um pod tiver uma dependência em um banco de dados, a investigação poderá verificar a conexão do banco de dados.For example, if a pod has a dependency on a database, the 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 pode estar temporariamente indisponível por algum motivo.An external service might be temporarily unavailable for some reason. Isso fará com que a investigação de preparação falhe em todos os pods do serviço, fazendo com que todos sejam removidos do balanceamento de carga e criando falhas em cascata upstream.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 serviço, para que seu serviço possa se 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

A 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 contêineres, para que um mesmo contêiner não possa 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 recursos que não são de contêiner, como threads ou conexões de rede, considere o uso do Padrão de Bulkhead para isolar recursos.For non-container resources, such as threads or network connections, consider using the Bulkhead Pattern to isolate resources.

Use cotas de recursos para limitar o total de recursos permitido para um namespace.Use resource quotas to limit the total resources allowed for a namespace. Dessa forma, o front-end não pode enfraquecer os serviços de back-end por causa de recursos ou vice-versa.That way, the front end can't starve the backend services for resources or vice-versa.

RBAC (Controle de Acesso Baseado em Função)Role based access control (RBAC)

O Kubernetes e o Azure têm mecanismos de RBAC (controle de acesso baseado em função):Kubernetes and Azure both have mechanisms for role-based access control (RBAC):

  • O RBAC do Azure controla o acesso aos 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 usuários, grupos ou entidades de serviço.Permissions can be assigned to users, groups, or service principals. (Uma entidade de serviço é uma identidade de segurança usada pelos aplicativos.)(A service principal is a security identity used by applications.)

  • O RBAC do Kubernetes controla permissões para a API do Kubernetes.Kubernetes RBAC controls permissions to the Kubernetes API. Por exemplo, a criação e a listagem de pods são ações que podem ser autorizadas (ou negadas) a um usuário por meio de 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 aos usuários, você cria funções e associações de função:To assign Kubernetes permissions to users, you create roles and role bindings:

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

    • Um RoleBinding atribui usuários ou grupos a um Role.A RoleBinding assigns users or groups to a Role.

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

O AKS integra esses dois mecanismos de RBAC.AKS integrates these two RBAC mechanisms. Quando você cria um cluster do AKS, é possível configurá-lo para usar o Azure AD na autenticação de usuários.When you create an AKS cluster, you can configure it to use Azure AD for user authentication. Para obter detalhes sobre como configurar isso, confira Integrar o Azure Active Directory com o Serviço de Kubernetes do Azure.For details on how to set this up, see Integrate Azure Active Directory with Azure Kubernetes Service.

Depois que isso é configurado, um usuário que deseja acessar a API do Kubernetes (por exemplo, por kubectl) deve entrar usando suas 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 padrão, um usuário do Azure AD 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 grupos ou usuários do Azure AD.To grant access, the cluster administrator creates RoleBindings that refer to Azure AD users or groups. Se um usuário não tiver permissões para determinada operação, ela falhará.If a user doesn't have permissions for a particular operation, it will fail.

Se os usuários não têm acesso por padrão, como o administrador de cluster tem permissão para criar as associações de função, para começar?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 AKS realmente tem dois tipos de credenciais para chamar o servidor de API kubernetes: usuário de cluster e administrador de cluster. As credenciais de administrador do cluster concedem acesso completo ao 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 baixa as credenciais de administrador de cluster e as salva 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 usar esse kubeconfig para criar funções e associações de função.The cluster administrator can use this kubeconfig to create roles and role bindings.

Como as credenciais de administrador de cluster têm muito poder, use o RBAC do Azure para restringir o acesso a elas:Because the cluster admin credentials are so powerful, use Azure RBAC to restrict access to them:

  • A "Função de administrador de cluster do Serviço de Kubernetes do Azure" tem permissão para baixar as credenciais de administrador de cluster.The "Azure Kubernetes Service Cluster Admin Role" has permission to download the cluster admin credentials. Somente os administradores de cluster devem receber essa função.Only cluster administrators should be assigned to this role.

  • A "Função de usuário de cluster do Serviço de Kubernetes do Azure" tem permissão para baixar as credenciais de usuário de cluster.The "Azure Kubernetes Service Cluster User Role" has permission to download the cluster user credentials. Os usuários não administradores não podem receber essa função.Non-admin users can be assigned to this role. Essa função não fornece nenhuma permissão específica em recursos do Kubernetes dentro do cluster — ela apenas permite que um usuário se conecte 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 você definir as políticas de RBAC (Kubernetes e Azure), pense sobre as funções em sua organização:When you define your RBAC policies (both Kubernetes and Azure), think about the roles in your organization:

  • Quem pode criar ou excluir um cluster do AKS e baixar 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 namespace?Who can create or update resources within a namespace?

É uma boa prática criar o escopo das permissões de RBAC do Kubernetes por namespace, usando Roles 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, convém saber quais permissões o cluster do AKS tem para criar e gerenciar recursos do Azure, como armazenamento, rede ou balanceadores de carga.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 as APIs do Azure, o cluster usa uma entidade de serviço do Azure AD.To authenticate itself with Azure APIs, the cluster uses an Azure AD service principal. Se você não especificar uma entidade de serviço ao criar o cluster, uma será criada 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 primeiro criar a entidade de serviço e atribuir as permissões mínimas de RBAC a ela.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, confira Entidades de serviço com o Serviço de Kubernetes do Azure.For more information, see Service principals with Azure Kubernetes Service.

Credenciais de aplicativo e gerenciamento de segredosSecrets management and application credentials

Aplicativos e serviços geralmente precisam de credenciais que permitam a eles se conectar a serviços externos, como o Armazenamento do Azure ou o Banco 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 essas credenciais seguras e não divulgá-las.The challenge is to keep these credentials safe and not leak them.

Para recursos do Azure, uma opção é usar identidades gerenciadas.For Azure resources, one option is to use managed identities. A ideia de uma identidade gerenciada é que um aplicativo ou serviço tenha uma identidade armazenada no Azure AD e use essa identidade para se autenticar em 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. O aplicativo ou serviço tem uma entidade de serviço criada para ele no Azure AD e é autenticado usando tokens 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 do localhost para obter o token.The executing process calls a localhost address to get the token. Dessa forma, você não precisa armazenar senhas ou cadeias de conexão.That way, you don't need to store any passwords or connection strings. Você pode usar identidades gerenciadas no AKS atribuindo identidades a pods individuais, usando o projeto aad-pod-identity.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 dão suporte à autenticação usando identidades gerenciadas.Currently, not all Azure services support authentication using managed identities. Para obter uma lista, consulte Serviços do Azure que dão suporte à autenticação do Azure AD.For a list, see Azure services that support Azure AD authentication.

Mesmo com identidades gerenciadas, você provavelmente precisará armazenar algumas credenciais ou outros segredos do aplicativo, seja para serviços do Azure que não dão suporte a identidades gerenciadas, serviços de terceiros, chaves de API ou outros.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 com segurança:Here are some options for storing secrets securely:

  • Azure Key Vault.Azure Key Vault. No AKS, você 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 como um volume normal.The pod can then read the secrets just like a regular volume. Para obter mais informações, consulte o projeto segredos-Store-CSI-driver-Provider-Azure no github.For more information, see the secrets-store-csi-driver-provider-azure project on GitHub.

    O pod se autentica usando uma identidade de pod (descrita acima) ou usando uma entidade 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. O uso de identidades de pod é recomendado porque o segredo do cliente não é necessário nesse caso.Using pod identities is recommended because the client secret isn't needed in that case.

  • HashiCorp Vault.HashiCorp Vault. Os aplicativos do Kubernetes podem se autenticar com o HashiCorp Vault usando identidades gerenciadas do Azure AD.Kubernetes applications can authenticate with HashiCorp Vault using Azure AD managed identities. Confira O HashiCorp Vault é compatível com o Azure Active Directory.See HashiCorp Vault speaks Azure Active Directory. Você pode implantar o cofre em kubernetes, considere executá-lo em um cluster dedicado separado de seu cluster de aplicativos.You can deploy Vault itself to Kubernetes, consider running it in a separate dedicated cluster from your application cluster.

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

Usar um sistema como HashiCorp Vault ou o Azure Key Vault oferece 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.
  • Garantia de que todos os segredos sejam criptografados em repouso.Ensuring that all secrets are encrypted at rest.
  • Gerenciamento centralizado de chaves.Centralized key management.
  • Controle de acesso de segredos.Access control of secrets.
  • AuditoriaAuditing

Segurança de contêiner e OrchestratorContainer and Orchestrator security

Estas são as práticas recomendadas para proteger seus pods e contêineres:These are recommended practices for securing your pods and containers:

  • Monitoramento de ameaças – Monitorar ameaças usando o Azure defender para registros de contêiner e o Azure defender para kubernetes (ou recursos de terceiros).Threat Monitoring – Monitor for threats using Azure Defender for container registries and Azure Defender for Kubernetes (or 3rd party capabilities). Se você estiver hospedando contêineres em uma VM, use o Azure defender para servidores ou um recurso de terceiros.If you are hosting containers on a VM, use Azure Defender for servers or a 3rd party capability. Além disso, você pode integrar logs da solução de monitoramento de contêineres em Azure monitor para o Azure Sentinel ou um Siem existenteAdditionally, you can integrate logs from Container Monitoring solution in Azure Monitor to Azure Sentinel or an existing SIEM

  • Monitoramento de vulnerabilidades- Monitore continuamente imagens e execute contêineres para vulnerabilidades conhecidas usando a central de segurança do Azure ou uma solução de terceiros disponível por meio do Azure Marketplace.Vulnerability monitoring - Continuously monitor images and running containers for known vulnerabilities using Azure Security Center or a 3rd party solution available through the Azure Marketplace.

  • Automatize a aplicação de patch de imagem usando tarefas ACR, um recurso do registro de contêiner do Azure.Automate image patching using ACR Tasks, a feature of Azure Container Registry. Uma imagem de contêiner baseia-se em camadas.A container image is built up from layers. As camadas de base incluem a imagem do sistema operacional e as imagens da 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 upstream a partir dos desenvolvedores de aplicativos e são mantidas por outros mantenedores do projeto.The base images are typically created upstream from the application developers, and are maintained by other project maintainers. Quando essas imagens são corrigidas no upstream,'s é importante atualizar, testar e reimplantar suas próprias imagens, de modo que você não'deixar nenhuma vulnerabilidade de segurança conhecida.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. As Tarefas do ACR podem ajudar a automatizar esse processo.ACR Tasks can help to automate this process.

  • Armazene imagens em um registro privado confiável , como registro de contêiner do Azure ou registro confiável do Docker.Store images in a trusted private registry such as Azure Container Registry or Docker Trusted Registry. Use um webhook de admissão de validação no Kubernetes para fazer com que os pods possam efetuar pull somente de imagens do registro confiável.Use a validating admission webhook in Kubernetes to ensure that pods can only pull images from the trusted registry.

  • Aplicar princípio de privilégio mínimoApply Least Privilege principle

    • Não execute contêineres no modo privilegiado.Don't run containers in privileged mode. O modo privilegiado concede acesso ao contêiner para todos os dispositivos no host.Privileged mode gives a container access to all devices on the host.
    • Quando possível, evite executar processos como raiz dentro de contêineres.When possible, avoid running processes as root inside containers. Os contêineres não fornecem isolamento completo do ponto de vista da segurança, de modo que's melhor executar um processo de contêiner como um usuário 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.

Considerações de DevOpsDevOps considerations

Essa arquitetura de referência fornece um modelo de Azure Resource Manager para provisionar os recursos de nuvem e suas dependências.This reference architecture provides an Azure Resource Manager template for provisioning the cloud resources, and its dependencies. Com o uso de modelos de Azure Resource Manager , você pode usar Azure DevOps Services para provisionar ambientes diferentes em minutos, por exemplo, para replicar cenários de produção.With the use of Azure Resource Manager templates you can use Azure DevOps Services to provision different environments in minutes, for example to replicate production scenarios. Isso permite que você economize custos e provisione o ambiente de teste de carga somente quando necessário.This allows you save cost and provision load testing environment only when needed.

Considere seguir os critérios de isolamento de carga de trabalho para estruturar seu modelo de ARM, uma carga de trabalho normalmente é definida como uma unidade arbitrária de funcionalidade; Você poderia, para o exbordo, ter um modelo separado para o cluster e, em seguida, outros para os serviços dependentes.Consider following the workload isolation criteria to structure your ARM template, a workload is typically defined as an arbitrary unit of functionality; you could, for exmaple, have a separate template for the cluster and then other for the dependant services. O isolamento de carga de trabalho permite que o DevOps execute a integração contínua e a entrega contínua (CI/CD), já que cada carga de trabalho é associada e gerenciada por sua equipe de DevOps correspondente.Workload isolation enables DevOps to perform continuous integration and continuous delivery (CI/CD), since every workload is associated and managed by its corresponding DevOps team.

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

Aqui estão algumas metas 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 implantar os serviços que ela possui independentemente, 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 ser implantada na produção, ela é implantada em ambientes de desenvolvimento/teste/garantia de qualidade para validação.Before a new version of a service is deployed to production, it gets deployed to dev/test/QA environments for validation. Há restrições de qualidade 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.
  • Há políticas de controle de acesso suficientes em vigor.Sufficient access control policies are in place.
  • Para cargas de trabalho em contêineres, você pode confiar nas imagens de contêiner que são implantadas na produção.For containerized workloads, you can trust the container images that are deployed to production.

Para saber mais sobre os desafios, consulte CI/CD para arquiteturas de microserviços.To learn more about the challenges, see CI/CD for microservices architectures.

Para obter recomendações específicas e práticas recomendadas, consulte CI/CD para microservices no kubernetes.For specific recommendations and best practices, see CI/CD for microservices on Kubernetes.

Considerações de custoCost considerations

Use a Calculadora de Preços do Azure para estimar os custos.Use the Azure pricing calculator to estimate costs. Outras considerações são descritas na seção de custo no Microsoft Azure Well-Architected Framework.Other considerations are described in the Cost section in Microsoft Azure Well-Architected Framework.

Aqui estão alguns pontos a serem considerados para alguns dos serviços usados nesta arquitetura.Here are some points to consider for some of the services used in this architecture.

AKS (Serviço de Kubernetes do Azure)Azure Kubernetes Service (AKS)

Não há custos associados para AKS em implantação, gerenciamento e operações do cluster kubernetes.There are no costs associated for AKS in deployment, management, and operations of the Kubernetes cluster. Você paga apenas por instâncias de máquinas virtuais, armazenamento e recursos de rede consumidos pelo cluster do Kubernetes.You only pay for the virtual machines instances, storage, and networking resources consumed by your Kubernetes cluster.

Para estimar o custo dos recursos necessários, consulte a calculadora de serviços de contêiner.To estimate the cost of the required resources please see the Container Services calculator.

Azure Load BalancerAzure Load balancer

Você é cobrado apenas pelo número de regras de balanceamento de carga e de saída configuradas.You are charged only for the number of configured load-balancing and outbound rules. As regras de NAT de entrada são gratuitas.Inbound NAT rules are free. Não há cobrança por hora para o Standard Load Balancer quando nenhuma regra é configurada.There is no hourly charge for the Standard Load Balancer when no rules are configured.

Confira Azure Load Balancer preços para obter mais informações.See Azure Load Balancer Pricing for more information.

Azure DevOps ServicesAzure DevOps Services

Essa arquitetura de referência usa apenas Azure Pipelines.This reference architecture only uses Azure Pipelines. O Azure oferece o pipeline do Azure como um serviço individual.Azure offers the Azure Pipeline as an individual Service. Você tem permissão para um trabalho gratuito hospedado pela Microsoft com 1.800 minutos por mês para CI/CD e 1 trabalho auto-hospedado com minutos ilimitados por mês, trabalhos extras têm encargos.You are allowed a free Microsoft-hosted job with 1,800 minutes per month for CI/CD and 1 self-hosted job with unlimited minutes per month, extra jobs have charges. Para obter mais informações, consulte preços de Azure DevOps Services.For more information, see Azure DevOps Services Pricing.

Azure MonitorAzure Monitor

Para Azure Monitor Log Analytics, você será cobrado pela ingestão e retenção de dados.For Azure Monitor Log Analytics, you are charged for data ingestion and retention. Para obter mais informações, consulte preços de Azure monitor para obter mais informações.For more information, see Azure Monitor Pricing for more information.

Implantar a soluçãoDeploy the solution

Para implantar a implementação de referência para essa arquitetura, siga as etapas no repositório GitHub.To deploy the reference implementation for this architecture, follow the steps in the GitHub repo.

Próximas etapasNext steps