SRE - DevOps

Gerenciando Tráfego e Políticas de Segurança com o Istio Service Mesh

O Istio é um service mesh de código aberto que oferece uma maneira eficiente e flexível de gerenciar tráfego, segurança e observabilidade para aplicações baseadas em microserviços. Neste artigo, exploraremos alguns dos principais recursos do Istio, como Gateways, VirtualServices, DestinationRules e trafficPolicy.        

   Istio Gateway  

   O recurso Gateway no Istio é usado para gerenciar e configurar a exposição de serviços na borda do mesh de serviço. Ele permite controlar o tráfego de entrada no cluster, configurando rotas e protocolos para comunicação entre os serviços internos e os clientes externos.  

     

  Os Gateways no Istio são uma abstração construída sobre os proxies Envoy que são implantados como proxies de borda (ingress). Eles são usados para controlar o tráfego de entrada e saída do mesh de serviço e fornecer funcionalidades como roteamento, balanceamento de carga, autenticação, autorização e terminação de TLS/SSL.  

     

   Os Gateways são úteis em cenários onde você deseja:  

  1. Expor um ou mais serviços para acesso externo.
  2. Personalizar o roteamento de tráfego, balanceamento de carga e políticas de segurança para tráfego de entrada e saída.
  3. Aplicar políticas de segurança, como autenticação e autorização, em nível de borda.
  4. Terminar conexões TLS/SSL na borda do mesh de serviço e evitar a necessidade de gerenciar certificados e terminação TLS em cada serviço.

   Aqui está um exemplo básico de como configurar um Gateway e um VirtualService no Istio para expor um serviço para acesso externo:  

   
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
 name: my-gateway
spec:
 selector:
   istio: ingressgateway # Use o Gateway de entrada padrão do Istio
 servers:
 - port:
     number: 80
     name: http
     protocol: HTTP
   hosts:
   - "*"

---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: my-service
spec:
 hosts:
 - "*"
 gateways:
 - my-gateway
 http:
 - match:
   - uri:
       prefix: /my-service
   route:
   - destination:
       host: my-service.default.svc.cluster.local
       port:
         number: 8080      

   Neste exemplo, criamos um Gateway chamado my-gateway que expõe o serviço my-service para acesso externo. O tráfego externo é roteado através do Gateway e do VirtualService associado, que direciona o tráfego para o serviço my-service no cluster.  

     

   Istio VirtualService  

   O recurso VirtualService no Istio permite configurar rotas e políticas de tráfego para serviços no mesh. Ele é usado em conjunto com o Gateway para controlar o tráfego de entrada e é especialmente útil para dividir o tráfego entre diferentes versões de um serviço ou implementar regras de roteamento avançadas.  

     

   Para implementar uma política de retry usando o Istio, você pode usar o recurso de VirtualService. O VirtualService permite configurar o tráfego e definir regras de roteamento e retry para seus serviços. Vamos ver um exemplo de como configurar um retry com o Istio.  

     

   Suponha que você tenha um serviço chamado my-service e queira implementar uma política de retry para evitar falhas temporárias. Primeiro, crie um arquivo YAML chamado my-service-virtualservice.yaml com o seguinte conteúdo:  

   
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: my-service
spec:
 hosts:
 - my-service
 http:
 - route:
   - destination:
       host: my-service
   retries:
     attempts: 3
     perTryTimeout: 2s
     retryOn: 5xx,connect-failure      

   Neste arquivo, definimos um VirtualService para o serviço my-service. A política de retry é configurada na seção retries. Aqui, configuramos o Istio para fazer até 3 tentativas (attempts: 3), com um tempo limite de 2 segundos para cada tentativa (perTryTimeout: 2s). O Istio fará retry nas requisições que falharem com um erro 5xx ou em caso de falha de conexão (retryOn: 5xx,connect-failure).  

     

   Aplique a configuração do VirtualService usando o comando kubectl:  

   
kubectl apply -f my-service-virtualservice.yaml      

   Depois de aplicar a configuração, o Istio começará a aplicar a política de retry para as requisições destinadas ao serviço my-service.  

     

   Observe que o Istio oferece várias opções para personalizar o comportamento de retry, como retryOn, attempts, perTryTimeout, e outras. Além disso, você pode combinar retry com outras funcionalidades do Istio, como circuit breaking e timeouts, para criar políticas de gerenciamento de tráfego mais avançadas e resilientes.  

     

   Trace e Requisições  

   Quando você utiliza o Istio com o recurso Gateway para expor um serviço, o tráfego de entrada segue uma ordem específica antes de chegar ao serviço destino. Vamos considerar o exemplo anterior para explicar a ordem de entrada da requisição.  

  1. Cliente externo: A requisição é iniciada por um cliente externo, como um navegador web, aplicativo móvel ou outro serviço fora do cluster.
  2. Gateway de entrada (Ingress Gateway): A requisição atinge o Gateway de entrada do Istio, que está configurado para lidar com o tráfego externo. O Gateway é baseado no proxy Envoy e é responsável por lidar com a terminação TLS/SSL, autenticação e outras políticas de segurança, se configuradas.
  3. VirtualService: Depois de passar pelo Gateway, a requisição é roteada de acordo com as regras definidas no VirtualService associado. O VirtualService pode ter regras adicionais de roteamento, como divisão de tráfego, redirecionamento, reescrita de URI e outras políticas.
  4. DestinationRule: Se houver uma DestinationRule associada ao serviço, ela será aplicada agora. A DestinationRule permite configurar opções de balanceamento de carga, circuit breaking, pool de conexões e outros detalhes relacionados ao tráfego de saída para o serviço destino.
  5. Serviço destino: Finalmente, a requisição chega ao serviço destino, onde a lógica de negócio é executada.
  6. Resposta: A resposta gerada pelo serviço destino segue o caminho inverso, passando pelo proxy Envoy do serviço destino, DestinationRule (se aplicável), VirtualService, Gateway de entrada e, finalmente, retorna ao cliente externo.

   Ao utilizar o Istio, é possível configurar o recurso de rastreamento (tracing) para obter informações detalhadas sobre a jornada das requisições através do mesh de serviço. O rastreamento pode ajudá-lo a identificar gargalos, latências e problemas de desempenho nos serviços.  

   Para habilitar o rastreamento no Istio, é necessário implantar e configurar um sistema de rastreamento compatível, como Jaeger, Zipkin ou Lightstep. O Istio já possui integração com esses sistemas e pode ser configurado para enviar informações de rastreamento para eles.  

     

   Istio DestinationRule e trafficPolicy  

   O recurso DestinationRule no Istio permite configurar opções de balanceamento de carga, políticas de conexão e configurações de TLS para tráfego de saída de um serviço no mesh. A trafficPolicy é uma seção dentro do DestinationRule que permite configurar essas políticas de tráfego, como balanceamento de carga, políticas de conexão e detecção de outliers.  

     

   DestinationRules  

   DestinationRules no Istio são usadas para configurar opções de balanceamento de carga, políticas de conexão e configurações de TLS para tráfego de saída de um serviço no mesh. Aqui está um exemplo de DestinationRule que demonstra algumas das possíveis configurações:  

   
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
 name: my-service-rule
spec:
 host: my-service.default.svc.cluster.local
 trafficPolicy:
   loadBalancer:
     simple: ROUND_ROBIN
   connectionPool:
     http:
       http1MaxPendingRequests: 1024
       maxRequestsPerConnection: 10
     tcp:
       maxConnections: 1024
   outlierDetection:
     consecutiveErrors: 5
     interval: 30s
     baseEjectionTime: 180s
     maxEjectionPercent: 10
 subsets:
 - name: v1
   labels:
     version: v1
 - name: v2
   labels:
     version: v2      

   Neste exemplo, aplicamos uma DestinationRule para o serviço my-service. As configurações aplicadas são as seguintes:      

  • host: O serviço alvo para o qual a DestinationRule se aplica. Neste caso, é o serviço my-service no namespace default.
  • trafficPolicy:
  • loadBalancer: Configura a política de balanceamento de carga para o tráfego de saída. Neste exemplo, estamos usando o algoritmo de balanceamento de carga ROUND_ROBIN.
  • connectionPool: Configura o pool de conexões para tráfego HTTP e TCP. Neste exemplo, definimos o número máximo de conexões pendentes para HTTP/1 (http1MaxPendingRequests) e o número máximo de requisições por conexão (maxRequestsPerConnection). Para tráfego TCP, definimos o número máximo de conexões (maxConnections).
  • outlierDetection: Configura a detecção de outliers, que permite o Istio detectar instâncias de serviço com falha e remover temporariamente do pool de conexões. Neste exemplo, configuramos a detecção de outliers com 5 erros consecutivos, um intervalo de 30 segundos entre verificações, um tempo base de expulsão de 180 segundos e um percentual máximo de expulsão de 10%.
  • subsets: Define os subconjuntos de instâncias de serviço com base em rótulos. Isso é útil para dividir o tráfego entre diferentes versões de um serviço. Neste exemplo, criamos dois subconjuntos, um para a versão v1 e outro para a versão v2 do serviço my-service.

   Você pode aplicar essa DestinationRule no seu cluster usando o comando kubectl:  

   
kubectl apply -f my-service-destinationrule.yaml      

   Depois de aplicar a DestinationRule, o Istio começará a aplicar as políticas de tráfego e conexão para o serviço my-service.  

     

   Seções importante dentro do DestinationRule  

              Balanceamento de carga  

   A configuração de balanceamento de carga na trafficPolicy permite escolher entre diferentes algoritmos de balanceamento de carga, como ROUND_ROBIN, LEAST_CONN e RANDOM. Você também pode configurar o balanceamento de carga baseado em pesos usando a opção consistentHash.  

     

               Políticas de conexão  

   A seção connectionPool na trafficPolicy permite configurar o pool de conexões para tráfego HTTP e TCP. Você pode ajustar várias opções, como número máximo de conexões pendentes, número máximo de requisições por conexão para tráfego HTTP e número máximo de conexões para tráfego TCP.  

     

               TrafficPolicy  

   A trafficPolicy é uma seção dentro do Istio DestinationRule que permite configurar políticas de tráfego para o tráfego de saída de um serviço no mesh. Essas políticas são aplicadas a todas as instâncias de um serviço ou a subconjuntos específicos de instâncias, com base em rótulos. A trafficPolicy oferece várias opções de configuração para controlar o comportamento do tráfego, como balanceamento de carga, políticas de conexão e detecção de outliers.  

     

   Aqui estão algumas das principais opções disponíveis na trafficPolicy:  

  1. loadBalancer: Permite configurar o algoritmo de balanceamento de carga para o tráfego de saída do serviço. O Istio suporta vários algoritmos de balanceamento de carga, como ROUND_ROBIN (padrão), LEAST_CONN (menor número de conexões) e RANDOM (aleatório). Você também pode configurar o balanceamento de carga baseado em pesos usando a opção consistentHash.
  2. connectionPool: Permite configurar o pool de conexões para tráfego HTTP e TCP. Você pode ajustar várias opções para controlar o comportamento das conexões, como número máximo de conexões pendentes (http1MaxPendingRequests), número máximo de requisições por conexão (maxRequestsPerConnection) para tráfego HTTP, e número máximo de conexões (maxConnections) para tráfego TCP.
  3. outlierDetection: Permite configurar a detecção de outliers, que é um mecanismo para identificar instâncias de serviço com falha e removê-las temporariamente do pool de conexões. Você pode ajustar várias opções, como o número de erros consecutivos necessários para marcar uma instância como um outlier (consecutiveErrors), o intervalo entre as verificações de outlier (interval), o tempo base de expulsão (baseEjectionTime) e o percentual máximo de instâncias que podem ser expulsas (maxEjectionPercent).
  4. tls: Permite configurar a política de TLS/SSL para o tráfego de saída do serviço. Você pode escolher entre diferentes modos de TLS, como ISTIO_MUTUAL (mútuo entre proxies do Istio), MUTUAL (mútuo entre cliente e serviço), SIMPLE (somente criptografia, sem autenticação mútua) e DISABLE (desativar TLS).

 

     

   Você pode aplicar essas configurações de trafficPolicy globalmente para todas as instâncias de um serviço ou personalizá-las para subconjuntos específicos de instâncias, com base em rótulos. Essa flexibilidade permite controlar o comportamento do tráfego de saída do serviço de maneira granular, melhorando a resiliência, desempenho e segurança da sua aplicação.  

     

           Detecção de outliers  

   A seção outlierDetection na trafficPolicy permite configurar a detecção de outliers, que é um mecanismo para identificar instâncias de serviço com falha e removê-las temporariamente do pool de conexões. Você pode ajustar várias opções, como o número de erros consecutivos, o intervalo entre as verificações de outlier, o tempo base de expulsão e o percentual máximo de instâncias que podem ser expulsas.  

     

   Conclusão  

   O Istio oferece uma solução robusta e flexível para gerenciar tráfego, segurança e observabilidade em aplicações baseadas em microserviços. Ao utilizar recursos como Gateways, VirtualServices, DestinationRules e trafficPolicy, os desenvolvedores podem controlar o tráfego de entrada e saída do mesh de serviço, implementar políticas de segurança e balanceamento de carga, e otimizar a resiliência e desempenho de suas aplicações.  

     

   Além disso, o Istio simplifica a configuração e o gerenciamento de aplicações complexas, permitindo que os desenvolvedores se concentrem na lógica do negócio e na melhoria contínua de seus sistemas. A plataforma também oferece recursos avançados de observabilidade, como telemetria, rastreamento e monitoramento, para facilitar a análise e a solução de problemas em ambientes de produção.  

     

   Com o Istio, as equipes podem obter maior visibilidade e controle sobre seus serviços e infraestrutura de rede, garantindo uma experiência de usuário mais confiável e segura. Ao adotar o Istio como parte de sua estratégia de gerenciamento de microserviços, você pode se beneficiar de uma plataforma poderosa e extensível que evolui com as necessidades do seu negócio e ajuda a acelerar o desenvolvimento e a entrega de aplicações.  

     

   Extras:  

Integração com sistemas de gerenciamento de identidade e autorização  

     

   O Istio fornece integração nativa com sistemas de gerenciamento de identidade e autorização, como o OpenID Connect (OIDC) e o OAuth2. Essas integrações permitem que os desenvolvedores implementem políticas de autenticação e autorização granulares para seus serviços e APIs, garantindo que apenas usuários e clientes autorizados possam acessar seus recursos.  

     

Suporte para múltiplos clusters e ambientes híbridos  

   O Istio suporta implantações em múltiplos clusters e ambientes híbridos, incluindo clusters do Kubernetes e ambientes de nuvem privada e pública. Isso permite que os desenvolvedores gerenciem e observem tráfego entre clusters e ambientes de forma consistente e unificada, facilitando a adoção de estratégias de implantação multi-cloud e edge.