mesh

Introduccion a Service Mesh - Control de Comunicacion con Istio/Linkerd

15 min de lectura | 2024.12.29

Que es Service Mesh

Service mesh es una capa de infraestructura que gestiona la comunicacion entre microservicios. Separa la complejidad de la comunicacion entre servicios de la aplicacion y la controla de manera consistente.

Por que es necesario: A medida que aumentan los microservicios, se vuelve dificil asegurar la observabilidad, seguridad y confiabilidad de la comunicacion entre servicios. Service mesh resuelve estos problemas de manera unificada.

Desafios sin Service Mesh

flowchart LR
    A["Servicio A"] --> B["Servicio B"]

Implementacion necesaria en cada servicio:

  • Logica de reintentos
  • Circuit breaker
  • Timeout
  • Gestion de certificados TLS
  • Recoleccion de metricas
  • Trazado

Patron Sidecar

Se despliega un proxy (sidecar) en cada Pod de servicio, y toda la comunicacion pasa a traves de el.

flowchart LR
    subgraph Pod
        App["Application<br/>(App)"]
        Sidecar["Sidecar<br/>(Envoy)"]
        App <-->|localhost| Sidecar
    end
    Sidecar <-->|"Toda la comunicacion pasa por aqui"| External["Externo"]

Arquitectura de Service Mesh

flowchart TB
    subgraph ControlPlane["Control Plane"]
        Config["Config<br/>Management"]
        Telemetry["Telemetry<br/>Collection"]
        Policy["Policy<br/>Enforcement"]
    end

    subgraph DataPlane["Data Plane"]
        SA["Service A<br/>+ Sidecar"]
        SB["Service B<br/>+ Sidecar"]
        SC["Service C<br/>+ Sidecar"]
        SA <--> SB <--> SC
    end

    ControlPlane -->|"Distribucion de configuracion"| DataPlane

Funciones Principales

1. Gestion de Trafico

# Istio VirtualService - Despliegue Canary
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: my-service
spec:
  hosts:
    - my-service
  http:
    - route:
        - destination:
            host: my-service
            subset: v1
          weight: 90
        - destination:
            host: my-service
            subset: v2
          weight: 10

2. Circuit Breaker

# Istio DestinationRule
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: my-service
spec:
  host: my-service
  trafficPolicy:
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 30s

3. Reintentos y Timeout

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
spec:
  http:
    - route:
        - destination:
            host: my-service
      timeout: 10s
      retries:
        attempts: 3
        perTryTimeout: 3s
        retryOn: 5xx

4. mTLS (TLS Mutuo)

Encripta automaticamente la comunicacion entre servicios.

flowchart LR
    A["Servicio A<br/>Certificado"] -->|mTLS| B["Servicio B<br/>Certificado"]
    AutoManage["Gestion automatica"] -.-> A
    AutoManage -.-> B
# Istio PeerAuthentication
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT

5. Observabilidad

TipoContenido
MetricasNumero de solicitudes, latencia (p50, p90, p99), tasa de errores
TrazadoRelaciones de llamadas entre servicios, tiempo de procesamiento en cada servicio
LogsRecoleccion automatica de logs de acceso

Principales Service Meshes

HerramientaCaracteristicas
IstioRico en funciones, basado en Envoy, curva de aprendizaje alta
LinkerdLigero, hecho en Rust, simple
Consul ConnectHashiCorp, integracion con service discovery
AWS App MeshIntegracion con AWS, basado en Envoy

Istio vs Linkerd

AspectoIstioLinkerd
FuncionalidadRicaSuficiente
Consumo de recursosAltoBajo
ComplejidadAltaBaja
ComunidadGrandeMedia
CNCFGraduadoGraduado

Casos de Uso

Release Canary

DiaTrafico a v2
Dia 11%
Dia 210%
Dia 350%
Dia 4100%

Test A/B

# Enrutamiento por header
http:
  - match:
      - headers:
          x-user-group:
            exact: beta
    route:
      - destination:
          host: my-service
          subset: v2
  - route:
      - destination:
          host: my-service
          subset: v1

Inyeccion de Fallas

# Inyectar retraso intencionalmente para pruebas
http:
  - fault:
      delay:
        percentage:
          value: 10
        fixedDelay: 5s
    route:
      - destination:
          host: my-service

Decidir la Adopcion

Casos Adecuados

  • Muchos microservicios (10+)
  • Patrones de comunicacion complejos
  • Necesidad de seguridad zero trust
  • Necesidad de control de trafico avanzado
  • Uso de Kubernetes

Casos No Adecuados

  • Pocos servicios (menos de 5)
  • Arquitectura monolitica
  • Patrones de comunicacion simples
  • Recursos del equipo de operaciones limitados

Resumen

Service mesh es una infraestructura para separar la complejidad de la comunicacion entre microservicios de la aplicacion y gestionarla de manera unificada. Proporciona control de trafico, seguridad y observabilidad, pero tambien conlleva complejidad y sobrecarga de recursos. Considere el numero de servicios y la capacidad operativa antes de decidir la adopcion.

← Volver a la lista