Saltar al contenido principal
Infrastructure

Evolución del Service Mesh: Istio Ambient Mesh, Linkerd y las Arquitecturas Sin Sidecars

7 min lectura
LD
Lucio Durán
Engineering Manager & AI Solutions Architect
También disponible en: English, Italiano

Por Qué los Sidecars Siempre Fueron un Compromiso

El patrón sidecar — inyectar un contenedor proxy Envoy en cada pod — resolvió el problema de "cómo interceptamos el tráfico" elegantemente. Pero creó un nuevo conjunto de problemas que se componen a escala:

Overhead de recursos. Cada pod recibe un contenedor Envoy consumiendo 50-100MB de memoria y una tajada significativa de CPU. A 500 pods, son 25-50GB de memoria solo para proxies.

Acoplamiento de ciclo de vida. El sidecar y el contenedor de la aplicación comparten un pod. Si Envoy se cae, el pod reinicia. Si la aplicación necesita drenar conexiones, Envoy necesita saberlo.

Complejidad de inyección. Mutating webhook que modifica specs de pods en admission time. Cada deployment, cada StatefulSet, cada Job se modifica.

Me pasé un fin de semana debuggeando por qué un batch Job se colgaba después de completar. El contenedor de la aplicación terminó y salió con 0, pero el sidecar Envoy mantenía el pod vivo porque no recibió SIGTERM a través del lifecycle hook del sidecar.

Arquitectura de Istio Ambient Mesh

Ambient mesh divide el data plane en dos capas:

Capa 4: ztunnel (DaemonSet por Nodo)

ztunnel es un proxy L4 construido a propósito, escrito en Rust. Una instancia por nodo. Maneja:

  • Terminación y originación de mTLS entre todos los pods del nodo
  • Routing de tráfico a nivel TCP basado en VIPs de servicio
  • Políticas de autorización L4
  • Recolección de telemetría
┌─── Nodo 1 ────────────────────┐ ┌─── Nodo 2 ────────────────────┐
│ │ │ │
│ ┌─────────┐ │ │ ┌─────────┐ │
│ │ Pod A │──────┐ │ │ ┌──────│ Pod B │ │
│ └─────────┘ │ │ │ │ └─────────┘ │
│ ▼ │ │ ▲ │
│ ┌──────────────────────────┐ │ │ ┌──────────────────────────┐ │
│ │ ztunnel (DaemonSet) │◄──────────► ztunnel (DaemonSet) │ │
│ │ L4: mTLS + routing TCP │ │ │ │ L4: mTLS + routing TCP │ │
│ └──────────────────────────┘ │ │ └──────────────────────────┘ │
│ │ │ │
└────────────────────────────────┘ └────────────────────────────────┘
 Túnel HBONE (HTTP/2 + mTLS)

Capa 7: Waypoint Proxies (Por Namespace/Workload)

Para traffic management a nivel HTTP — routing basado en headers, retries, inyección de faults, políticas de autorización L7 — se despliegan waypoint proxies:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
 name: waypoint
 namespace: mi-app
 labels:
 istio.io/waypoint-for: service
spec:
 gatewayClassName: istio-waypoint
 listeners:
 - name: mesh
 port: 15008
 protocol: HBONE

La parte elegante: servicios que solo necesitan mTLS y políticas L4 pagan cero overhead de L7. El procesamiento L7 se habilita de forma granular.

Mediciones de Overhead de Latencia

Se midieron las tres configuraciones en el mismo cluster EKS (nodos m6i.xlarge, us-east-1):

Resultados: Latencia HTTP/1.1 Cross-Node (microsegundos)

| Configuración | p50 | p75 | p90 | p99 | p99.9 | |---------------|-----|-----|-----|-----|-------| | Sin mesh (baseline) | 245 | 312 | 425 | 890 | 2,100 | | Istio sidecar (Envoy) | 612 | 785 | 1,050 | 2,340 | 5,800 | | Istio ambient (ztunnel solo, L4) | 298 | 378 | 510 | 1,050 | 2,600 | | Istio ambient (ztunnel + waypoint) | 580 | 745 | 990 | 2,180 | 5,200 | | Linkerd (linkerd2-proxy) | 395 | 498 | 665 | 1,420 | 3,400 |

ztunnel solo L4 agrega ~53 microsegundos en p50. Esto es el overhead de mTLS más redirect de iptables más encapsulación HBONE. Notablemente bajo para lo que está haciendo.

Ambient con waypoint es comparable al modo sidecar. Cuando se necesita procesamiento L7, se está pasando por un Envoy de todas formas.

Linkerd queda en el medio. Su proxy basado en Rust es más rápido que Envoy para proxying simple, pero sigue siendo un sidecar.

Overhead de Memoria (Por Pod / Por Nodo)

| Configuración | Memoria Por Pod | Total para 500 Pods | |---------------|----------------|---------------------| | Istio sidecar | ~70MB | ~35GB | | Istio ambient (ztunnel) | 0 (por nodo: ~120MB) | ~600MB (5 nodos) | | Istio ambient (+ waypoint) | 0 (+ ~200MB por waypoint) | ~1.6GB | | Linkerd | ~25MB | ~12.5GB |

La historia de recurse es es donde ambient mesh realmente gana. Pasar de 35GB de memoria de proxy en el cluster a 600MB es una reducción masiva. Eso es dinero real en tu factura de cloud.

mTLS Sin Sidecars: Detalles a Nivel de Protocolo

El túnel HBONE (HTTP-Based Overlay Network Encapsulation) es el mecanismo de transporte entre ztunnels:

1. ztunnel en Nodo 1 abre conexión TCP a ztunnel en Nodo 2 (puerto 15008)

2. Handshake TLS 1.3 con autenticación mutua:
 - Cert cliente: spiffe://cluster.local/ns/mi-app/sa/pod-a-sa
 - Cert servidor: spiffe://cluster.local/ns/mi-app/sa/pod-b-sa

3. Sobre la conexión mTLS, request HTTP/2 CONNECT:
 CONNECT 10.0.2.8:8080 HTTP/2

4. ztunnel destino valida políticas de autorización contra
 la identidad fuente autenticada

5. Si está permitido, abre conexión local al pod destino
 y proxea bytes bidireccionalmente

Linkerd: La Alternativa Subestimada

Linkerd merece consideración como alternativa más simple. Hace menos que Istio, y esa es su fortaleza:

# Instalación de Linkerd — comparar con la de Istio
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -

# Meshear un namespace
kubectl annotate namespace mi-app linkerd.io/inject=enabled

# Listo. Reiniciar los pods y quedan incluidos en la malla.

El mTLS de Linkerd viene habilitado por defecto. Sin configuración. Sin resources Gateway. Sin waypoint proxies.

Estrategia de Migración: Sidecar a Ambient

El playbook que usé para migrar un cluster de producción de 200 servicios:

# Fase 1: Instalar componentes ambient junto a sidecars existentes
istioctl install --set profile=ambient

# Fase 2: Migrar un namespace de bajo riesgo
kubectl label namespace canary-app istio.io/dataplane-mode=ambient
kubectl label namespace canary-app istio-injection-
kubectl rollout restart deployment -n canary-app

# Fase 3: Verificar flujos de tráfico
kubectl logs -n istio-system -l app=ztunnel --tail=100
istioctl x describe pod <nombre-pod> -n canary-app

El punto crítico: las políticas de autorización que referencian labels app en pods fuente no funcionan en ambient mode. ztunnel identifica fuentes por identidad SPIFFE (service account), no por labels de pod.

# ANTES (modo sidecar — usa labels de pod, no anda en ambient)
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
spec:
 rules:
 - from:
 - source:
 matchLabels:
 app: frontend # ← Esto se rompe en ambient

# DESPUÉS (compatible con ambient — usa identidad de service account)
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
spec:
 rules:
 - from:
 - source:
 principals:
 - "cluster.local/ns/mi-app/sa/frontend-sa"

Cuándo Usar Qué

Después de ejecutar los tres en producción en distintas empresas:

Istio ambient mesh: Clusters grandes (200+ servicios), equipos que necesitan políticas L7 granulares, requerimientos multi-cluster.

Istio modo sidecar: Workloads legacy que necesitan customización de Envoy por pod. Esto es modo mantenimiento — deploys nuevos deberían usar ambient.

Linkerd: Clusters pequeños a medianos (menos de 200 servicios), equipos que valoran simplicidad operacional, entornos donde cada megabyte de memoria importa.

Sin mesh: Si el único requerimiento es mTLS entre servicios, considerar mTLS a nivel de aplicación con un cert manager. Un service mesh agrega complejidad operacional que solo se justifica cuando se necesita traffic management, observabilidad o enforcement de políticas más allá de lo que el framework de aplicación provee.

La competencia entre service meshes se ha consolidado. Istio prevaleció en funcionalidades, Linkerd en simplicidad, y ambient mesh es el paso evolutivo que hace obsoletos a los sidecars para la mayoría de los workloads.

service-meshistiolinkerdambient-meshztunnelkubernetesmtlssidecar

Herramientas mencionadas en este artículo

AWSProbá AWS
DigitalOceanProbá DigitalOcean
Divulgación: Algunos enlaces en este artículo son enlaces de afiliado. Si te registrás a través de ellos, puedo recibir una comisión sin costo adicional para vos. Solo recomiendo herramientas que uso y en las que confío personalmente.
Compartir
Seguime