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

Esta arquitetura de referência mostra uma aplicação de microserviços implantada para o Serviço Azure Kubernetes (AKS).This reference architecture shows a microservices application deployed to Azure Kubernetes Service (AKS). Descreve uma configuração básica do AKS que pode ser o ponto de partida para a maioria das implementações.It describes a basic AKS configuration that can be the starting point for most deployments. Este artigo assume o conhecimento básico de Kubernetes.This article assumes basic knowledge of Kubernetes. O artigo centra-se principalmente na infraestrutura e considerações de DevOps sobre a gestão de uma arquitetura de microserviços na AKS.The article focuses mainly on the infrastructure and DevOps considerations of running a microservices architecture on AKS. Para obter orientações sobre como conceber microserviços, consulte a Construção de microserviços no Azure.For guidance on how to design microservices, see Building microservices on Azure.

logótipo GitHub Uma implementação de referência desta arquitetura está disponível no GitHub.GitHub logo A reference implementation of this architecture is available on GitHub.

Arquitetura de referência AKS

Transfira um ficheiro do Visio desta arquitetura.Download a Visio file of this architecture.

ArquiteturaArchitecture

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

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

Aglomerado kubernetes.Kubernetes cluster. A AKS é responsável pela implantação do cluster Kubernetes e pela gestão dos mestres Kubernetes.AKS is responsible for deploying the Kubernetes cluster and for managing the Kubernetes masters. Só gere os nódoas de agente.You only manage the agent nodes.

Rede virtual.Virtual network. Por padrão, a AKS cria uma rede virtual para implantar os nós do agente.By default, AKS creates a virtual network to deploy the agent nodes into. Para cenários mais avançados, pode criar a rede virtual primeiro, o que permite controlar coisas como a configuração das subredes, a conectividade no local e a endereçação 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 mais informações, consulte a Configuração avançada em rede no Serviço Azure Kubernetes (AKS).For more information, see Configure advanced networking in Azure Kubernetes Service (AKS).

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

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

Lojas de dados externas.External data stores. Os microserviços são tipicamente apátridas e escrevem estado para lojas de dados externas, como a Base de Dados Azure SQL ou cosmos DB.Microservices are typically stateless and write state to external data stores, such as Azure SQL Database or Cosmos DB.

Diretório Azure Ative.Azure Active Directory. A AKS utiliza uma identidade Azure Ative Directory (Azure AD) para criar e gerir outros recursos Azure, como os equilibradores de carga Azure.AKS uses an Azure Active Directory (Azure AD) identity to create and manage other Azure resources such as Azure load balancers. A Azure AD também é recomendada para autenticação do utilizador em aplicações de clientes.Azure AD is also recommended for user authentication in client applications.

Registo de contentores azure.Azure Container Registry. Utilize o Registo de Contentores para armazenar imagens privadas do Docker, que são implantadas para o cluster.Use Container Registry to store private Docker images, which are deployed to the cluster. A AKS pode autenticar com o Registo de Contentores utilizando a sua identidade Azure AD.AKS can authenticate with Container Registry using its Azure AD identity. Note que a AKS não requer registo de contentores Azure.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.

Gasodutos Azure.Azure Pipelines. Pipelines faz parte da Azure DevOps Services e executa construções automatizadas, testes e implementações.Pipelines is part of Azure DevOps Services and runs automated builds, tests, and deployments. Também pode utilizar soluções CI/CD de terceiros, como jenkins.You can also use third-party CI/CD solutions such as Jenkins.

Leme.Helm. Helm é como gestor de pacotes para kubernetes — uma forma de embalar objetos Kubernetes numa única unidade que você 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.

Monitor Azure.Azure Monitor. O Azure Monitor recolhe e armazena métricas e registos, incluindo métricas de plataforma para os serviços Azure na solução e telemetria de aplicações.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 de causas 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 a AKS para recolher métricas de controladores, nós e contentores, bem como troncos de contentores e troncos de nós mestres.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á focada em arquiteturas de microserviços, embora muitas das práticas recomendadas se apliquem a outras cargas de trabalho em 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 Kubernetes é uma forma natural de modelar microserviços em Kubernetes.The Kubernetes Service object is a natural way to model microservices in Kubernetes. Um microserviço é uma unidade de código vagamente acoplada e independentemente implantável.A microservice is a loosely coupled, independently deployable unit of code. Os microserviços normalmente comunicam através de APIs bem definidos, e são descobriveis através 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 objeto de serviço Kubernetes fornece um conjunto de capacidades que correspondem 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 interno estático para um grupo de cápsulas (ReplicaSet).The Service object provides a static internal IP address for a group of pods (ReplicaSet). À medida que as cápsulas são criadas ou movidas, 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 é de carga equilibrada para as cápsulas.Traffic sent to the service's IP address is load balanced to the pods.

  • Descoberta de serviço.Service discovery. Os serviços são atribuídos entradas internas de DNS pelo serviço Kubernetes DNS.Services are assigned internal DNS entries by the Kubernetes DNS service. Isto significa que o portal DaPI pode chamar um serviço de backend usando o nome DNS.That means the API gateway can call a backend service using the DNS name. O mesmo mecanismo pode ser utilizado para a comunicação serviço-a-serviço.The same mechanism can be used for service-to-service communication. As entradas dNS são organizadas por espaço de nome, por isso, se os seus espaços de nome corresponderem a contextos limitados, então o nome DNS para um serviço irá mapear naturalmente para o domínio da aplicação.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 pods.The following diagram shows the conceptual relation between services and pods. O mapeamento real para endereços IP e portas de ponto final é feito por kube-proxy, o proxy da rede Kubernetes.The actual mapping to endpoint IP addresses and ports is done by kube-proxy, the Kubernetes network proxy.

Serviços e casulos

API GatewayAPI Gateway

Um portal da API é uma porta de entrada que se situa entre clientes externos e os microserviços.An API gateway is a gateway that sits between external clients and the microservices. Atua como um representante inverso, encaminhando pedidos de clientes para microserviços.It acts as a reverse proxy, routing requests from clients to microservices. Pode também executar várias tarefas transversais, tais como autenticação, rescisão de SSL e limitação de taxas.It may also perform various cross-cutting tasks such as authentication, SSL termination, and rate limiting.

A funcionalidade fornecida por um gateway pode ser agrunada da seguinte forma:Functionality provided by a gateway can be grouped as follows:

  • Gateway Routing: Encaminhamento de clientes de encaminhamento para os serviços de backend direito.Gateway Routing: Routing client requests to the right backend services. Isto fornece um único ponto final 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.

  • Agregação gateway: Agregação de múltiplos pedidos num único pedido, para reduzir a conversação entre o cliente e o backend.Gateway Aggregation: Aggregation of multiple requests into a single request, to reduce chattiness between the client and the backend.

  • Descarga gateway.Gateway Offloading. Um gateway pode descarregar funcionalidade sacar dos serviços backend, tais como rescisão sl, autenticação, whitelisting IP ou limitação da taxa de cliente (estrangulamento).A gateway can offload functionality from the backend services, such as SSL termination, authentication, IP whitelisting, or client rate limiting (throttling).

Os gateways API são um padrão geral de design de microserviços.API gateways are a general microservices design pattern. Podem ser implementadas utilizando uma série de tecnologias diferentes.They can be implemented using a number of different technologies. Provavelmente a implementação mais comum é implementar um router de borda ou procuração inversa, como 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. Um servidor proxy invertido é um potencial estrangulamento ou ponto único de falha, por isso implemente sempre 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.

Para AKS, também pode utilizar o Portal de Aplicações Azure, utilizando o controlador de entrada de entrada de gateway de aplicação.For AKS, you can also use Azure Application Gateway, using the Application Gateway Ingress Controller. Esta opção requer que a rede CNI seja ativada quando configura o cluster AKS, porque o Gateway de aplicação é implantado numa subnet 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. Para obter mais informações sobre serviços de equilíbrio de carga em Azure, consulte a visão geral das opções de equilíbrio de carga em Azure.For more information about load-balancing services in Azure, see Overview of load-balancing options in Azure.

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

O controlador de entrada trata da configuração do servidor proxy.The ingress controller handles configuring the proxy server. Muitas vezes estes requerem ficheiros de configuração complexos, que podem ser difíceis de sintonizar se você não é um especialista, por isso o controlador de ingresso é 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 Ingress tem acesso à API Kubernetes, para que possa tomar decisões inteligentes sobre o encaminhamento e o equilíbrio 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 ingresso Nginx contorna o proxy da rede kube-proxy.For example, the Nginx ingress controller bypasses the kube-proxy network proxy.

Por outro lado, se necessitar de controlo total sobre as definições, poderá querer contornar esta abstração e configurar manualmente o servidor proxy.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.

Armazenamento de dadosData storage

Numa arquitetura de microserviç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 deve possuir os 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. A razão é evitar o acoplamento não intencional entre serviços, o que pode acontecer quando os serviços partilham 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 gerem as suas próprias lojas de dados, podem utilizar a loja de dados certa para os seus requisitos específicos.Also, when services manage their own data stores, they can use the right data store for their particular requirements. Para mais informações, consulte Design de microserviços: Consideraçõesde dados .For more information, see Designing microservices: Data considerations.

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

  • Utilize um serviço externo, como o Azure SQL Database ou cosmos DB, ouUse an external service such as Azure SQL Database or Cosmos DB, or

  • Monte um volume persistente utilizando discos Azure ou Ficheiros Azure.Mount a persistent volume using Azure Disks or Azure Files. Utilize ficheiros Azure se o mesmo volume tiver de ser partilhado por várias cápsulas.Use Azure Files if the same volume needs to be shared by multiple pods.

Espaços de nomesNamespaces

Utilize espaços de nome para organizar serviços dentro do cluster.Use namespaces to organize services within the cluster. Todos os objetos de um aglomerado de Kubernetes pertencem a um espaço de nome.Every object in a Kubernetes cluster belongs to a namespace. Por padrão, quando se cria um novo objeto, ele vai para o espaço de default nome.By default, when you create a new object, it goes into the default namespace. Mas é uma boa prática criar espaços de nome sucuvilhe 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, espaços de nome ajudam a evitar o nome de colisões.First, namespaces help prevent naming collisions. Quando várias equipas implantam microserviços no mesmo cluster, com possivelmente centenas de microserviços, torna-se difícil de gerir se todas elas forem para o mesmo espaço de nome.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 nome supor:In addition, namespaces allow you to:

  • Aplique restrições de recursos num espaço de nome, de modo que o conjunto total de cápsulas atribuídas a esse espaço de nome não possa exceder a quota de recursos do espaço de nome.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 ao nível do espaço de nome, incluindo RBAC e políticas de segurança.Apply policies at the namespace level, including RBAC and security policies.

Para uma arquitetura de microserviços, considerar organizar os microserviços em contextos limitados, e criar espaços de nome 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 microserviços relacionados com o contexto limitado da "Ordem de cumprir" podem ir para o mesmo espaço de nome.For example, all microservices related to the "Order Fulfillment" bounded context could go into the same namespace. Em alternativa, crie um espaço de nome para cada equipa de desenvolvimento.Alternatively, create a namespace for each development team.

Coloque os serviços de utilidade no seu próprio espaço de nome separado.Place utility services into their own separate namespace. Por exemplo, pode implementar 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 a escala a dois níveis:Kubernetes supports scale-out at two levels:

  • Escala o número de cápsulas atribuídas a uma implantação.Scale the number of pods allocated to a deployment.
  • Dimensione os nós no cluster, para aumentar os recursos totais de computação disponíveis para o cluster.Scale the nodes in the cluster, to increase the total compute resources available to the cluster.

Embora possa escalar as cápsulas e os nós manualmente, recomendamos a utilização de autoscalcificação, para minimizar a possibilidade de os serviços ficarem esfomeados sob alta carga.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 autoscalcificação deve ter em conta tanto as cápsulas como os nós.An autoscaling strategy must take both pods and nodes into account. Se apenas escalonar as cápsulas, eventualmente atingirá os limites de recursos dos nós.If you just scale out the pods, eventually you will reach the resource limits of the nodes.

Autoscalcificação de podPod autoscaling

O Autoscaler horizontal pod (HPA) escala cápsulas com base em CPU, memória ou métricas personalizadas observadas.The Horizontal Pod Autoscaler (HPA) scales pods based on observed CPU, memory, or custom metrics. Para configurar a escala horizontal da cápsula, especifice uma métrica-alvo (por exemplo, 70% do 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 os seus serviços para obter estes números.You should load test your services to derive these numbers.

Um efeito colateral da autoscalcificação é que as cápsulas podem ser criadas ou despejadas com mais frequência, à medida que os eventos de escala e escala ocorrem.A side-effect of autoscaling is that pods may be created or evicted more frequently, as scale-out and scale-in events happen. Para mitigar os efeitos disto:To mitigate the effects of this:

  • Utilize sondas de prontidão para informar kubernetes quando uma nova cápsula está pronta para aceitar o tráfego.Use readiness probes to let Kubernetes know when a new pod is ready to accept traffic.
  • Utilize orçamentos de disrupção de cápsulas para limitar quantas cápsulas podem ser despejadas 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.

Autoscalcificação clusterCluster autoscaling

O autoescalador de cluster escala o número de nós.The cluster autoscaler scales the number of nodes. Se as cápsulas não puderem ser programadas devido a restrições de recursos, o autoscaler do cluster fornecerá mais nós.If pods can't be scheduled because of resource constraints, the cluster autoscaler will provision more nodes.

Enquanto a HPA olha para os recursos reais consumidos ou outras métricas de executar cápsulas, o autoscaler cluster está a fornecer nós para cápsulas que ainda não estão programadas.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, analisa os recursos solicitados, conforme especificado na especificação do casulo Kubernetes para uma implantação.Therefore, it looks at the requested resources, as specified in the Kubernetes pod spec for a deployment. Utilize testes de carga para afinar estes valores.Use load testing to fine-tune these values.

Não pode alterar o tamanho do VM depois de criar o cluster, por isso deve fazer algum plano inicial de capacidade para escolher um tamanho VM apropriado para os nós do 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 saúde que uma cápsula pode expor:Kubernetes defines two types of health probe that a pod can expose:

  • Sonda de prontidão: Diz à Kubernetes se a cápsula está pronta para aceitar pedidos.Readiness probe: Tells Kubernetes whether the pod is ready to accept requests.

  • Sonda de vivacidade: Diz a Kubernetes se uma cápsula deve ser removida e um novo caso iniciado.Liveness probe: Tells Kubernetes whether a pod should be removed and a new instance started.

Quando se pensa em sondas, é útil recordar como funciona um serviço em Kubernetes.When thinking about probes, it's useful to recall how a service works in Kubernetes. Um serviço tem um seletor de etiquetas que corresponde a um conjunto de cápsulas (zero ou mais).A service has a label selector that matches a set of (zero or more) pods. A carga kubernetes equilibra o tráfego para as cápsulas que combinam com o seletor.Kubernetes load balances traffic to the pods that match the selector. Apenas as cápsulas que começaram com sucesso e são saudáveis recebem tráfego.Only pods that started successfully and are healthy receive traffic. Se um contentor se despenhar, kubernetes mata a cápsula e marca uma substituição.If a container crashes, Kubernetes kills the pod and schedules a replacement.

Por vezes, uma cápsula pode não estar pronta para receber tráfego, mesmo que a cápsula tenha começado com sucesso.Sometimes, a pod may not be ready to receive traffic, even though the pod started successfully. Por exemplo, pode haver tarefas de inicialização, onde a aplicação que corre no recipiente 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 uma cápsula é saudável, mas não está pronta para receber tráfego, defina uma sonda de prontidão.To indicate that a pod is healthy but not ready to receive traffic, define a readiness probe.

As sondas de vivacidade tratam do caso em que uma cápsula ainda está em funcionamento, mas não é saudável e deve ser reciclada.Liveness probes handle the case where a pod is still running, but is unhealthy and should be recycled. Por exemplo, suponha que um recipiente está a servir pedidos http, mas pendurado por alguma razão.For example, suppose that a container is serving HTTP requests but hangs for some reason. O contentor não se despenha, mas deixou de fazer pedidos.The container doesn't crash, but it has stopped serving any requests. Se definir uma sonda de vivacidade HTTP, a sonda deixará de responder e informa kubernetes para reiniciar a cápsula.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 conceber sondas:Here are some considerations when designing probes:

  • Se o seu código tiver um longo tempo de arranque, existe o perigo de uma sonda de vivacidade reportar falhas antes de a startup estar concluída.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 isto, utilize a definição inicial DeDelaySeconds, que atrasa a utilização da sonda.To prevent this, use the initialDelaySeconds setting, which delays the probe from starting.

  • Uma sonda de vivacidade não ajuda a menos que reiniciar a cápsula seja suscetível de restaurá-la para um estado saudável.A liveness probe doesn't help unless restarting the pod is likely to restore it to a healthy state. Podes usar uma sonda de vivacidade para atenuar fugas de memória ou impasses inesperados, mas não faz sentido reiniciar uma cápsula que vai falhar imediatamente outra vez.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 sondas de prontidão são usadas para verificar os serviços dependentes.Sometimes readiness probes are used to check dependent services. Por exemplo, se uma cápsula tiver uma dependência de uma base de dados, a sonda pode verificar a ligação da base de dados.For example, if a pod has a dependency on a database, the probe might check the database connection. No entanto, esta abordagem pode criar problemas inesperados.However, this approach can create unexpected problems. Um serviço externo pode estar temporariamente indisponível por alguma razão.An external service might be temporarily unavailable for some reason. Isso fará com que a sonda de prontidão falhe para todas as cápsulas do seu serviço, fazendo com que todas elas sejam removidas do equilíbrio de carga, criando assim falhas em cascata a montante.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 melhor abordagem é implementar o manuseamento de novo dentro do seu serviço, para que o seu serviço possa 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 as restrições de recursos para os recipientes, de modo a que um único recipiente 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 não contentores, tais como fios ou ligações de rede, considere utilizar o Padrão das Anteparas para isolar os recursos.For non-container resources, such as threads or network connections, consider using the Bulkhead Pattern to isolate resources.

Utilize quotas de recursos para limitar os recursos totais permitidos para um espaço-nome.Use resource quotas to limit the total resources allowed for a namespace. Assim, a parte da frente não pode passar fome nos serviços de backend por 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 Azure têm mecanismos para o controlo de acesso baseado em funções (RBAC):Kubernetes and Azure both have mechanisms for role-based access control (RBAC):

  • O Azure RBAC controla o acesso aos recursos em Azure, incluindo a capacidade de criar novos recursos 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 diretores de serviço.Permissions can be assigned to users, groups, or service principals. (Um diretor de serviço é uma identidade de segurança utilizada por aplicações.)(A service principal is a security identity used by applications.)

  • Kubernetes RBAC controla permissões à API Kubernetes.Kubernetes RBAC controls permissions to the Kubernetes API. Por exemplo, criar cápsulas e listar cápsulas 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 à Kubernetes aos utilizadores, cria funções e encadernações de papéis:To assign Kubernetes permissions to users, you create roles and role bindings:

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

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

    • Há também um objeto ClusterRole, que é como um Papel mas se aplica a todo o cluster, em todos os espaços de nome.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.

A AKS integra estes dois mecanismos RBAC.AKS integrates these two RBAC mechanisms. Quando criar um cluster AKS, pode configurá-lo para utilizar a AD Azure para autenticação do utilizador.When you create an AKS cluster, you can configure it to use Azure AD for user authentication. Para mais detalhes sobre como configurar isto, consulte Integrate Azure Ative Directory com o Serviço Azure Kubernetes.For details on how to set this up, see Integrate Azure Active Directory with Azure Kubernetes Service.

Uma vez configurado, um utilizador que pretenda aceder à API Kubernetes (por exemplo, através do kubectl) deve assinar usando as suas credenciais De AD Azure.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 da AD Azure não tem acesso ao cluster.By default, an Azure AD user has no access to the cluster. Para conceder acesso, o administrador do cluster cria RoleBindings que se referem a utilizadores ou grupos de Anúncios Azure.To grant access, the cluster administrator creates RoleBindings that refer to Azure AD users or groups. Se um utilizador não tiver permissões para uma determinada operação, falhará.If a user doesn't have permissions for a particular operation, it will fail.

Se os utilizadores não têm acesso por defeito, como é que o administrador do cluster tem permissão para criar as encadernações de funções 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 AKS tem na verdade dois tipos de credenciais para chamar o servidor Kubernetes API: utilizador de cluster e administração de cluster. As credenciais de administrador do cluster concedem acesso total 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 Azure CLI az aks get-credentials --admin descarrega as credenciais de administração do cluster e guarda-as no seu ficheiro kubeconfig.The Azure CLI command az aks get-credentials --admin downloads the cluster admin credentials and saves them into your kubeconfig file. O administrador do cluster pode usar este kubeconfig para criar papéis e encadernações de papéis.The cluster administrator can use this kubeconfig to create roles and role bindings.

Como as credenciais de administração do cluster são tão poderosas, use o Azure RBAC para restringir o acesso às mesmas:Because the cluster admin credentials are so powerful, use Azure RBAC to restrict access to them:

  • O "Azure Kubernetes Service Cluster Admin Role" tem permissão para descarregar as credenciais de administração do cluster.The "Azure Kubernetes Service Cluster Admin Role" has permission to download the cluster admin credentials. Só os administradores de cluster devem ser designados para este papel.Only cluster administrators should be assigned to this role.

  • A "Função de Utilizador do Cluster de Serviço Sikubernetes" tem permissão para descarregar as credenciais de utilizador do cluster.The "Azure Kubernetes Service Cluster User Role" has permission to download the cluster user credentials. Os utilizadores não administrativos 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 nos recursos da Kubernetes dentro do cluster — apenas permite que um utilizador se conectem ao servidor 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 definir as suas políticas rBAC (tanto Kubernetes como Azure), pense nos papéis da sua organização:When you define your RBAC policies (both Kubernetes and Azure), think about the roles in your organization:

  • Quem pode criar ou apagar um cluster AKS e descarregar as credenciais de administração?Who can create or delete an AKS cluster and download the admin credentials?
  • Quem pode administrar um aglomerado?Who can administer a cluster?
  • Quem pode criar ou atualizar recursos dentro de um espaço de nome?Who can create or update resources within a namespace?

É uma boa prática analisar as permissões Kubernetes RBAC por espaço de nome, usando Papéis 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 último, coloca-se a questão das permissões que o cluster AKS tem para criar e gerir recursos Azure, tais como equilibradores de carga, networking 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 autenticar-se com APIs Azure, o cluster utiliza um diretor de serviço Azure AD.To authenticate itself with Azure APIs, the cluster uses an Azure AD service principal. Se não especificar um diretor de serviço quando criar o cluster, um é criado 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 criar primeiro o diretor de serviço e atribuir-lhe as permissões RBAC mínimas.However, it's a good security practice to create the service principal first and assign the minimal RBAC permissions to it. Para mais informações, consulte os principais de serviço com o Serviço Azure Kubernetes.For more information, see Service principals with Azure Kubernetes Service.

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

Aplicações e serviços muitas vezes precisam de credenciais que lhes permitam ligar-se a serviços externos, como o Armazenamento 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 seguras e não divulgá-las.The challenge is to keep these credentials safe and not leak them.

Para os recursos azure, uma opção é usar identidades geridas.For Azure resources, one option is to use managed identities. A ideia de uma identidade gerida é que uma aplicação ou serviço tem uma identidade armazenada em Azure AD, e usa esta identidade para autenticar com um serviço 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 Diretor de Serviço criado para o mesmo em Azure AD, e autentica usando fichas 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 hospedeiro local para obter o símbolo.The executing process calls a localhost address to get the token. Assim, não é preciso armazenar senhas ou cordas de ligação.That way, you don't need to store any passwords or connection strings. Pode utilizar identidades geridas no AKS atribuindo identidades a cápsulas individuais, utilizando o projeto de identidade aad-pod.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 Azure suportam a autenticação usando identidades geridas.Currently, not all Azure services support authentication using managed identities. Para obter uma lista, consulte os serviços azure que suportam a autenticação Azure AD.For a list, see Azure services that support Azure AD authentication.

Mesmo com identidades geridas, provavelmente terá de armazenar algumas credenciais ou outros segredos de aplicação, seja para serviços Azure que não suportam identidades geridas, serviços de terceiros, chaves 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:

  • Cofre de Chaves Azure.Azure Key Vault. No AKS, podes montar um ou mais segredos do Key Vault como volume.In AKS, you can mount one or more secrets from Key Vault as a volume. O volume lê os segredos do Cofre chave.The volume reads the secrets from Key Vault. A cápsula pode então ler os segredos como um volume regular.The pod can then read the secrets just like a regular volume. Para mais informações, consulte o projeto Kubernetes-KeyVault-FlexVolume no GitHub.For more information, see the Kubernetes-KeyVault-FlexVolume project on GitHub.

    O casulo autentica-se utilizando uma identidade de casulo (descrito acima) ou utilizando um Diretor de Serviço AD Azure juntamente com um segredo de 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.

  • Cofre HashiCorp.HashiCorp Vault. As aplicações Kubernetes podem autenticar com o Cofre HashiCorp usando identidades geridas pela Azure AD.Kubernetes applications can authenticate with HashiCorp Vault using Azure AD managed identities. See HashiCorp Vault fala Azure Ative Directory.See HashiCorp Vault speaks Azure Active Directory. Pode supor o Próprio Vault para kubernetes, mas recomenda-se executá-lo num cluster dedicado separado do seu cluster de aplicações.You can deploy Vault itself to Kubernetes, but it's recommend to run it in a separate dedicated cluster from your application cluster.

  • Segredos de 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. Os segredos são armazenados em etcd, que é uma loja de valor-chave distribuída.Secrets are stored in etcd, which is a distributed key-value store. AKS encripta etc em repouso.AKS encrypts etcd at rest. A Microsoft gere as chaves de encriptação.Microsoft manages the encryption keys.

A utilização de um sistema como o HashiCorp Vault ou o Azure Key Vault oferece várias vantagens, tais como:Using a system like HashiCorp Vault or Azure Key Vault provides several advantages, such as:

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

Segurança da cápsula e do contentorPod and container security

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

Não faça contentores em modo privilegiado.Don't run containers in privileged mode. O modo privilegiado dá acesso a um recipiente a todos os dispositivos do hospedeiro.Privileged mode gives a container access to all devices on the host. Pode definir a Política de Segurança do Pod para proibir os contentores de funcionarem em modo privilegiado.You can set Pod Security Policy to disallow containers from running in privileged mode.

Quando possível, evite processos de funcionamento como raiz dentro dos recipientes.When possible, avoid running processes as root inside containers. Os contentores não proporcionam um isolamento completo do ponto de vista da segurança, por isso é melhor executar um processo de contentor como um utilizador não privilegiado.Containers do not provide complete isolation from a security standpoint, so it's better to run a container process as a non-privileged user.

Guarde as imagens num registo privado de confiança, como o Registo de Contentores Azure ou o Registo De Confiança de Docker.Store images in a trusted private registry, such as Azure Container Registry or Docker Trusted Registry. Utilize um webhook de admissão validador em Kubernetes para garantir que as cápsulas só podem retirar imagens do registo de confiança.Use a validating admission webhook in Kubernetes to ensure that pods can only pull images from the trusted registry.

Digitalize imagens e recipientes de execução para vulnerabilidades conhecidas, utilizando uma solução de digitalização como twistlock e Aqua, que estão disponíveis através do Azure Marketplace.Scan images and running containers for known vulnerabilities, using a scanning solution such as Twistlock and Aqua, which are available through the Azure Marketplace.

Automatizar a correção de imagem utilizando tarefas ACR, uma característica do Registo de Contentores Azure.Automate image patching using ACR Tasks, a feature of Azure Container Registry. Uma imagem de recipiente é construída a partir de camadas.A container image is built up from layers. As camadas base incluem as imagens de imagem e estrutura de aplicação do SO, tais 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 base são tipicamente criadas a montante a partir dos desenvolvedores de aplicações, e são mantidas por outros gestores de projetos.The base images are typically created upstream from the application developers, and are maintained by other project maintainers. Quando estas imagens são corrigidas a montante, é importante atualizar, testar e redistribuir as suas próprias imagens, para que não deixe vulnerabilidades de segurança conhecidas.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 ACR podem ajudar a automatizar este processo.ACR Tasks can help to automate this process.

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

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

  • Cada equipa pode construir e implementar os serviços que detém de forma independente, sem afetar ou perturbar outras equipas.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 para a produção, é implantado em ambientes de v/teste/QA para validação.Before a new version of a service is deployed to production, it gets deployed to dev/test/QA environments for validation. Os portões de qualidade são aplicados em cada fase.Quality gates are enforced at each stage.
  • Uma nova versão de um serviço pode ser implementada lado a lado com a versão anterior.A new version of a service can be deployed side by side with the previous version.
  • Existem políticas suficientes de controlo do acesso.Sufficient access control policies are in place.
  • Para cargas de trabalho contentorizadas, pode confiar nas imagens de contentores que são implantadas para a 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 recomendações específicas e boas práticas, consulte CI/CD para microserviços em Kubernetes.For specific recommendations and best practices, see CI/CD for microservices on Kubernetes.

Considerações de custosCost considerations

Utilize a calculadora de preços Azure para estimar os custos.Use the Azure pricing calculator to estimate costs. Outras considerações são descritas na secção Custos do Framework de Arquitetura do Azure.Other considerations are described in the Cost section in Azure Architecture Framework.

Eis alguns pontos a ter em conta para alguns dos serviços utilizados nesta arquitetura.Here are some points to consider for some of the services used in this architecture.

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

Não existem custos associados à AKS na implantação, gestão e operações do cluster Kubernetes.There are no costs associated for AKS in deployment, management, and operations of the Kubernetes cluster. Você só paga pelas máquinas virtuais, casos, armazenamento e recursos de rede consumidos pelo seu cluster 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 dos Serviços de Contentores.To estimate the cost of the required resources please see the Container Services calculator.

Equilibrador de carga AzureAzure Load balancer

É cobrado apenas pelo número de regras configuradas de equilíbrio de carga e saída.You are charged only for the number of configured load-balancing and outbound rules. As regras da NAT de entrada são gratuitas.Inbound NAT rules are free. Não existe qualquer carga horária para o Balancer de Carga Padrão quando não existem regras configuradas.There is no hourly charge for the Standard Load Balancer when no rules are configured.

Consulte [Preço do Equilíbrio de Carga Azure][az-lb-pricing] para obter mais informações.See [Azure Load Balancer Pricing][az-lb-pricing] for more information.

Gateway de Aplicação do AzureAzure Application Gateway

Nesta arquitetura de referência, o Azure Application Gateway é usado como recurso Ingress.In this reference architecture, Azure Application Gateway is used as the Ingress resource. O gateway encaminha o tráfego para serviços dentro do cluster.The gateway routes traffic to services inside the cluster. É-lhe cobrado pelo tempo em que o portal está aprovisionado e disponível e a quantidade de dados tratados pelo portal.You are charged for the time that the gateway is provisioned and available and the amount of data processed by the gateway. Para mais informações, consulte os preços do Gateway de aplicação.For more information, see Application Gateway pricing.

Serviços de DevOps do AzureAzure DevOps Services

Esta arquitetura de referência utiliza apenas pipelines Azure.This reference architecture only uses Azure Pipelines. O Azure oferece o Pipeline Azure como um serviço individual.Azure offers the Azure Pipeline as an individual Service. É-lhe permitido um emprego gratuito hospedado na Microsoft com 1.800 minutos por mês para CI/CD e 1 trabalho auto-hospedado com minutos ilimitados por mês, trabalhos extra têm taxas.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 mais informações, consulte o Preço dos Serviços Azure DevOps.For more information, see Azure DevOps Services Pricing.

Azure MonitorAzure Monitor

Para o Azure Monitor Log Analytics, é-lhe cobrado a 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 do Monitor Do Azure][az-monitor-pricing] para obter mais informações.For more information, see [Azure Monitor Pricing][az-monitor-pricing] for more information.

Implementar a soluçãoDeploy the solution

Para implementar a implementação de referência para esta arquitetura, siga os passos no repo GitHub.To deploy the reference implementation for this architecture, follow the steps in the GitHub repo.

Passos seguintesNext steps