🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Implementación de Kubernetes multi-cluster con Istio

Actualizado el 21 de mayo de 2026

La adopción de Kubernetes multi-cluster ha pasado de ser una aspiración arquitectónica a una necesidad operativa para empresas que gestionan cargas de trabajo a escala global, buscan alta disponibilidad o necesitan cumplir con estrictas regulaciones de residencia de datos. Sin embargo, gestionar múltiples clústeres de Kubernetes de forma aislada introduce complejidades en la conectividad, la seguridad y la observabilidad. Aquí es donde Istio service mesh se convierte en la pieza central para unificar la malla de servicios a través de diferentes clústeres, proporcionando una capa de abstracción que simplifica el networking avanzado y refuerza la seguridad Kubernetes.

En este artículo, exploraremos en profundidad cómo implementar una arquitectura multi-cluster utilizando Istio, cubriendo desde los modelos de despliegue hasta la configuración de la malla, pasando por estrategias de failover y gestión del tráfico. Abordaremos tanto el enfoque de malla compartida (VPN o red plana) como el modelo de malla federada (Istio Mesh Federation), analizando sus ventajas, desventajas y casos de uso ideales.

¿Por qué Kubernetes Multi-Cluster con Istio?

Gestionar un solo clúster de Kubernetes es un desafío en sí mismo. Cuando añadimos múltiples clústeres, la complejidad se multiplica. Los problemas típicos incluyen:

  • Descubrimiento de servicios entre clústeres: ¿Cómo sabe un servicio en el clúster A que existe un servicio en el clúster B?
  • Balanceo de carga global: Necesitamos enrutar tráfico al clúster más cercano o al que tenga menor latencia.
  • Seguridad consistente: Las políticas de mTLS, autorización y autenticación deben aplicarse de manera uniforme a través de los límites del clúster.
  • Observabilidad unificada: Las trazas, métricas y logs deben correlacionarse independientemente de dónde se ejecute el pod.

Istio resuelve estos problemas proporcionando un plano de control que puede extenderse más allá de un solo clúster. Con Istio, los sidecar proxies (Envoy) en todos los clústeres se configuran para descubrir servicios en otros clústeres, aplicar políticas de tráfico y seguridad, y reportar telemetría a un backend centralizado (como Prometheus, Jaeger o Grafana).

Modelos de Despliegue Multi-Cluster en Istio

Istio ofrece varios modelos para implementar una malla multi-cluster. La elección depende de la topología de red, los requisitos de latencia y la madurez operativa del equipo.

1. Malla Compartida (Red Plana / VPN)

En este modelo, todos los clústeres están conectados a través de una red privada (VPN, VPC Peering, o una red superpuesta como Calico o Cilium). Los pods pueden comunicarse directamente entre clústeres a través de las IPs de pod, sin necesidad de un gateway especial.

  • Plano de control: Un único plano de control (Istiod) gestiona todos los clústeres. Esto simplifica la configuración pero crea un punto único de fallo.
  • Plano de datos: Los sidecars Envoy se comunican directamente entre sí. La latencia es baja y el rendimiento es alto.
  • Requisito: Las CIDR de los pods y servicios no deben solaparse entre clústeres.

[WARNING] Este modelo es ideal para entornos on-premise o nubes híbridas con conectividad de baja latencia. Sin embargo, el solapamiento de IPs es un problema común. Si dos clústeres usan la misma CIDR de pods (por ejemplo, 10.0.0.0/16), el tráfico se enrutará incorrectamente.

2. Malla Federada (Istio Mesh Federation)

Este modelo es más flexible y escalable. Cada clúster tiene su propio plano de control (Istiod), y los planos de control se federan para intercambiar información de descubrimiento de servicios y certificados.

  • Plano de control: Cada clúster tiene su propio Istiod. Se utiliza un Mesh Federation para sincronizar los ServiceEntries y los certificados raíz.
  • Plano de datos: El tráfico entre clústeres se enruta a través de gateways de ingreso/egreso dedicados (generalmente usando Istio Ingress Gateway y Egress Gateway). Esto permite que el tráfico fluya a través de direcciones IP públicas o privadas, incluso si las redes no están directamente conectadas.
  • Ventaja: No hay requisito de red plana. Los clústeres pueden estar en diferentes regiones de nubes públicas, o incluso en proveedores distintos.

[INFO] La federación de mallas es la opción recomendada para la mayoría de los casos de producción, especialmente cuando se busca alta disponibilidad y aislamiento de fallos.

3. Modelo Primario-Remoto

Una variante del modelo compartido. Existe un clúster primario que aloja el plano de control de Istio, y uno o más clústeres remotos que solo ejecutan el plano de datos (sidecars Envoy) y se conectan al plano de control primario a través de una VPN o conexión directa.

  • Ventaja: Menor sobrecarga operativa en los clústeres remotos, ya que no necesitan ejecutar Istiod.
  • Desventaja: Dependencia del clúster primario para el descubrimiento de servicios y la gestión de certificados.

Implementación Paso a Paso: Malla Federada

A continuación, describimos los pasos para implementar una malla federada entre dos clústeres de Kubernetes (cluster-1 y cluster-2).

Requisitos Previos

  • Dos clústeres Kubernetes (versión 1.25+).
  • Istio 1.20+ instalado en cada clúster.
  • kubectl configurado para ambos clústeres.
  • Acceso a los contextos de los clústeres (kubectx recomendado).
  • Certificados raíz de CA compartidos (opcional pero recomendado para mTLS).

Paso 1: Configurar la CA Raíz Compartida

Para habilitar mTLS entre clústeres, ambos deben confiar en la misma autoridad certificadora. Generamos un certificado raíz y lo distribuimos.

# Generar certificado raíz
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \
  -subj "/O=Example Inc./CN=example.com" \
  -keyout root-key.pem -out root-cert.pem

Luego, en cada clúster, configuramos Istio para usar este certificado raíz.

# cluster-1
kubectl create namespace istio-system --context=cluster-1
kubectl create secret generic cacerts -n istio-system --context=cluster-1 \
  --from-file=ca-cert.pem=root-cert.pem \
  --from-file=ca-key.pem=root-key.pem \
  --from-file=root-cert.pem=root-cert.pem \
  --from-file=cert-chain.pem=root-cert.pem

# cluster-2 (similar)
kubectl create namespace istio-system --context=cluster-2
kubectl create secret generic cacerts -n istio-system --context=cluster-2 \
  --from-file=ca-cert.pem=root-cert.pem \
  --from-file=ca-key.pem=root-key.pem \
  --from-file=root-cert.pem=root-cert.pem \
  --from-file=cert-chain.pem=root-cert.pem

Paso 2: Instalar Istio con Configuración Multi-Cluster

Utilizamos la herramienta istioctl para instalar Istio en cada clúster con la configuración adecuada.

cluster-1 (primario):

# config-cluster1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: default
  meshConfig:
    accessLogFile: /dev/stdout
    enableTracing: true
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster-1
      network: network-1
istioctl install --context=cluster-1 -f config-cluster1.yaml

cluster-2 (primario también, para federación):

# config-cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: default
  meshConfig:
    accessLogFile: /dev/stdout
    enableTracing: true
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster-2
      network: network-2
istioctl install --context=cluster-2 -f config-cluster2.yaml

Paso 3: Exponer Servicios a Través de Gateways

En el modelo federado, necesitamos exponer los servicios de cada clúster a través de un gateway de entrada.

cluster-1: Crear un Ingress Gateway para la malla:

# gateway-cluster1.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: cross-network-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 15443
        name: tls
        protocol: TLS
      tls:
        mode: AUTO_PASSTHROUGH
      hosts:
        - "*.local"
kubectl apply --context=cluster-1 -f gateway-cluster1.yaml

cluster-2: Similar, pero con su propio gateway.

Paso 4: Configurar ServiceEntries para el Descubrimiento

Creamos un ServiceEntry en cada clúster para que los servicios del otro clúster sean descubribles.

cluster-1: ServiceEntry para servicios de cluster-2:

# se-cluster2.yaml
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: cluster-2-services
spec:
  hosts:
    - "*.cluster-2.local"
  location: MESH_INTERNAL
  ports:
    - number: 80
      name: http
      protocol: HTTP
    - number: 443
      name: https
      protocol: TLS
  resolution: STATIC
  endpoints:
    - address: <IP_PUBLICA_GATEWAY_CLUSTER2>
      ports:
        http: 15443
        https: 15443

Repetimos el proceso inverso en cluster-2.

Paso 5: Verificar la Conectividad

Desplegamos una aplicación de prueba (por ejemplo, sleep en cluster-1 y httpbin en cluster-2) y probamos la comunicación.

# cluster-1
kubectl exec -it deploy/sleep -- curl httpbin.cluster-2.local:8000/headers

Si todo funciona correctamente, veremos las cabeceras de la solicitud, incluyendo las trazas de Istio.

Seguridad en Mallas Multi-Cluster

La seguridad Kubernetes en un entorno multi-cluster se vuelve crítica. Istio proporciona varias capas de seguridad:

mTLS entre Clústeres

Con la CA raíz compartida, Istio puede establecer conexiones mTLS entre sidecars de diferentes clústeres. Esto asegura que:

  • El tráfico está cifrado en tránsito.
  • Cada workload tiene una identidad verificable (SPIFFE).

Políticas de Autorización

Las políticas AuthorizationPolicy pueden aplicarse a servicios en cualquier clúster. Por ejemplo, podemos permitir que solo el servicio frontend en cluster-1 acceda al servicio backend en cluster-2.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: backend-policy
  namespace: default
spec:
  selector:
    matchLabels:
      app: backend
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/default/sa/frontend"]

Gestión de Secretos

Los secretos de TLS para los gateways deben gestionarse cuidadosamente. Se recomienda usar herramientas como cert-manager para la renovación automática de certificados.

Networking Avanzado: Estrategias de Enrutamiento

Una vez que la malla multi-cluster está operativa, podemos aprovechar el networking avanzado de Istio para implementar:

Failover y Locality-Aware Routing

Podemos definir pesos de tráfico para enrutar solicitudes a clústeres cercanos, con failover automático si un clúster falla.

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: backend-dr
spec:
  host: backend.default.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      localityLbSetting:
        enabled: true
        failover:
          - from: region1
            to: region2
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 60s

Canary Deployments Multi-Cluster

Podemos desplegar una nueva versión de un servicio en un clúster secundario y enrutar un pequeño porcentaje de tráfico hacia allí.

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: backend-vs
spec:
  hosts:
    - backend
  http:
    - match:
        - headers:
            version:
              exact: v2
      route:
        - destination:
            host: backend.cluster-2.local
    - route:
        - destination:
            host: backend
          weight: 90
        - destination:
            host: backend.cluster-2.local
          weight: 10

Observabilidad Unificada

La telemetría es uno de los mayores beneficios de Istio. En un entorno multi-cluster, podemos centralizar las métricas y trazas.

  • Prometheus: Configurar un Prometheus global que recolecte métricas de todos los clústeres.
  • Jaeger: Usar un backend de Jaeger centralizado para trazas distribuidas.
  • Grafana: Dashboards que muestren la salud de la malla a través de clústeres.

[TIP] Utiliza Thanos o Cortex para almacenar métricas de Prometheus a largo plazo y consultarlas de forma global.

Desafíos Comunes y Soluciones

DesafíoSolución
Solapamiento de CIDR de podsUsar redes superpuestas (CNI como Cilium con ENI) o migrar a modelo federado con gateways.
Latencia entre clústeresImplementar locality-aware routing y reducir el número de saltos de red.
Sincronización de certificadosUsar cert-manager con un issuer centralizado (Vault, ACME).
Complejidad operativaAutomatizar con GitOps (ArgoCD, Flux) y plantillas de Helm.

Conclusión

La implementación de Kubernetes multi-cluster con Istio no es trivial, pero los beneficios en términos de resiliencia, escalabilidad y seguridad son inmensos. Al adoptar un modelo de malla federada, las organizaciones pueden construir una infraestructura de orquestación contenedores que trascienda los límites físicos de los clústeres, ofreciendo una experiencia unificada para desarrolladores y operadores.

El camino comienza con una planificación cuidadosa de la topología de red y la gestión de identidades. Una vez establecida la base, Istio permite aplicar políticas de tráfico y seguridad de forma declarativa, transformando un conjunto de clústeres aislados en una sola malla de servicios coherente y gobernable.

Para equipos que ya están invirtiendo en Kubernetes, dar el salto a una malla multi-cluster con Istio es el siguiente paso lógico hacia una plataforma cloud-native madura y preparada para el futuro.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel