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.
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:
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.
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.
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.
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.
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 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:
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.
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.
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.
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:
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.
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.
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.
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.
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.