Pular para o conteúdo principal

Service Mesh: Por que Kubernetes não é suficiente para Microserviços

Publicado em 5 de janeiro de 202635 min de leitura
Imagem de tecnologia relacionada ao artigo service-mesh-istio-linkerd-sidecar-mtls

Service Mesh: Por que Kubernetes não é suficiente para Microserviços

Imagem de tecnologia relacionada ao artigo service-mesh-istio-linkerd-sidecar-mtls
O tráfego de microserviços exige controle e visibilidade na camada de aplicação.

Se você roda 3 ou 4 microsserviços no Kubernetes, a vida é bela. O Service do K8s resolve o DNS e o Ingress lida com o tráfego externo.

Mas o que acontece quando você tem 50, 100 ou 500 microsserviços?

  • Como você sabe quem está chamando quem? (Observabilidade)
  • Como você garante que o Serviço A só fale com o Serviço B e não com o C? (Segurança/mTLS)
  • Como você faz um deploy Canary (enviar 1% do tráfego para a versão nova) baseado em headers HTTP ou ID de usuário? (Traffic Splitting)

O Kubernetes nativo não resolve isso. Ele opera na Camada 4 (TCP/IP). Ele sabe conectar IPs, mas não entende o contexto da sua aplicação.

Para resolver isso, inventamos uma camada extra de infraestrutura: o Service Mesh.

1. O Padrão Sidecar (Data Plane)

Imagem de tecnologia relacionada ao artigo service-mesh-istio-linkerd-sidecar-mtls
O proxy Sidecar intercepta e gerencia o tráfego de cada Pod.

Imagine que, em vez de o seu microsserviço (Java/Node/Go) falar diretamente com a rede, ele falasse com um "assistente" que mora no mesmo container que ele. Esse assistente é o Sidecar Proxy.

Em um Service Mesh (como Istio), todo o tráfego que entra ou sai do seu pod passa primeiro por esse proxy (geralmente o Envoy).

Se o Serviço A quer chamar o Serviço B:

  1. O código do Serviço A faz um request para http://servico-b.
  2. O proxy do A intercepta o pedido.
  3. O proxy decide: "Ah, vou balancear a carga para a instância B-3, que está mais rápida, e vou encriptar essa conexão".
  4. O proxy do A fala com o proxy do B.
  5. O proxy do B desencripta e entrega para o código do Serviço B.

A Mágica: Os desenvolvedores dos serviços A e B não escreveram uma única linha de código para lidar com criptografia, retries ou balanceamento. Tudo foi delegado para a infraestrutura.

2. mTLS (Mutual TLS): Zero Trust por Padrão

Service Mesh: Por que Kubernetes não é suficiente para Microserviços

Em uma rede tradicional, se um hacker invade um container, ele geralmente pode "escutar" o tráfego de toda a rede interna (sniffing).

O Service Mesh implementa mTLS (Mutual TLS) automaticamente. Isso significa que o Proxy A e o Proxy B trocam certificados criptográficos a cada conexão. Eles provam quem são.

  • O tráfego é encriptado.
  • A identidade é verificada.

Se um serviço não tiver o certificado correto (gerado e rotacionado automaticamente pelo Mesh), a conexão é recusada. Você ganha uma rede Zero Trust "de graça".

3. Observabilidade: Quem matou o request?

Sem um Mesh, debugar latência é um inferno. "O serviço A chamou o B, que demorou 2 segundos". Mas onde demorou? Na rede? No banco do B?

Como o proxy vê todo o tráfego, ele gera métricas (Prometheus) e traces (Jaeger) automaticamente. Você ganha dashboards que mostram:

  • Taxa de sucesso/erro (HTTP 200 vs 500) de cada conexão.
  • Latência P99 entre serviços.
  • Mapa topológico de dependências em tempo real (quem chama quem).

Kubernetes Nativo vs Service Mesh

FeatureKubernetes (Padrão)Service Mesh (Istio/Linkerd)
SegurançaNetwork Policies (IP base)mTLS (Identidade base)
RoteamentoRound Robin SimplesCanary, A/B, Mirroring, Retries Inteligentes
VisibilidadeLogs de PodMétricas L7 (HTTP), Tracing Distribuído
ResiliênciaHealth Checks básicosCircuit Breakers, Timeouts globais

4. Istio vs Linkerd: Davi e Golias

Istio

O gigante criado por Google e IBM. Usa o Envoy (C++) como proxy.

  • Prós: Feature-set gigantesco. Faz tudo o que você imaginar. Padrão da indústria enterprise.
  • Contras: Complexo de configurar. O "Control Plane" pode ser pesado. Curva de aprendizado íngreme.

Linkerd

O desafiante focado em simplicidade. Usa um proxy proprietário ultra-leve escrito em Rust.

  • Prós: Instala em 5 minutos. Muito leve (consumo de CPU/RAM minúsculo). Focado apenas no essencial (mTLS, Métricas, Load Balancing).
  • Contras: Menos features exóticas de roteamento que o Istio.

Cilium (eBPF)

A nova fronteira. O Cilium tenta fazer Service Mesh sem sidecars, usando eBPF diretamente no Kernel do Linux para interceptar pacotes. É muito mais performático, mas ainda está amadurecendo para funcionalidades de Camada 7 (HTTP).

5. Quando NÃO usar?

Service Mesh tem um custo: Complexidade e Latência. Cada request passa por dois proxies extras. Isso adiciona 2-5ms de latência. Além disso, debugar o próprio Service Mesh quando ele quebra exige engenheiros experientes.

Regra de Ouro: Se você não sente a dor de gerenciar seus microserviços, você não precisa de um Service Mesh. Espere até ter 20+ serviços ou requisitos estritos de mTLS.

Conclusão

Service Mesh é a evolução natural da Cloud Native. Ele desacopla a lógica de negócio da lógica de rede. Para o desenvolvedor, é o nirvana: "Eu só faço um GET, e a rede se vira para ser segura e resiliente". Para o operador, é o controle total: "Eu posso redirecionar tráfego, injetar falhas e bloquear acessos sem redeployar nenhum código".


Glossário Técnico

  • Sidecar: Um container auxiliar que roda no mesmo Pod da aplicação principal.
  • Data Plane: A parte do Mesh que toca os dados (os proxies Envoy/Linkerd).
  • Control Plane: A parte do Mesh que configura os proxies (Istiod).
  • Ingress Gateway: O "porteiro" que controla o tráfego que entra no cluster vindo da internet.
  • Traffic Splitting: Dividir tráfego percentualmente (ex: 90% v1, 10% v2) para deploys seguros.

Referências

  1. Istio. Architecture Documentation. A bíblia do Istio.
  2. Linkerd. Philosophy. Por que simplicidade importa.
  3. William Morgan (Buoyant). What's a Service Mesh? And why do I need one?.
  4. Google Cloud. Service Mesh: A detailed guide.
Imagem de tecnologia relacionada ao artigo service-mesh-istio-linkerd-sidecar-mtls