Skip to content

Integración con AWS ​

Este documento explica cómo integrar Istio con servicios de AWS en un entorno de Amazon EKS.

Índice ​

  1. Integración con AWS Load Balancer
  2. Comparación entre Istio y otras soluciones
  3. Optimización específica para EKS
  4. Prácticas recomendadas

Integración con AWS Load Balancer ​

Istio Ingress Gateway puede integrarse con AWS Load Balancer para manejar tráfico externo.

Integración con Network Load Balancer (NLB) ​

NLB es un balanceador de carga de capa 4 (TCP/UDP), adecuado cuando se requiere alto rendimiento y baja latencia.

Arquitectura de NLB ​

Configuración de NLB ​

1. Instalar AWS Load Balancer Controller

bash
# Create IAM policy
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json

# IRSA setup
eksctl create iamserviceaccount \
  --cluster=my-cluster \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

# Install controller with Helm
helm repo add eks https://aws.github.io/eks-charts
helm repo update

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=my-cluster \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller

2. Configuración de Istio Ingress Gateway con NLB

yaml
# istio-ingress-nlb.yaml
apiVersion: v1
kind: Service
metadata:
  name: istio-ingressgateway
  namespace: istio-system
  annotations:
    # NLB configuration
    service.beta.kubernetes.io/aws-load-balancer-type: "external"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"

    # TLS configuration
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:region:account:certificate/cert-id"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"

    # Health check configuration
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: "http"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "15021"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: "/healthz/ready"

    # Additional configuration
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
spec:
  type: LoadBalancer
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  ports:
  - name: status-port
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    port: 443
    protocol: TCP
    targetPort: 8443

3. Configuración del recurso Gateway

yaml
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: my-tls-secret
    hosts:
    - "myapp.example.com"
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "myapp.example.com"
    tls:
      httpsRedirect: true

Ventajas de NLB ​

  • Alto rendimiento: Maneja millones de solicitudes por segundo
  • Baja latencia: Opera en la capa 4 para obtener respuestas rápidas
  • IP estática: Es posible asignar Elastic IP
  • Compatibilidad de protocolos: TCP, UDP, TLS
  • Rentable: Más económico que ALB

Casos de uso de NLB ​

  • WebSocket, gRPC y otras conexiones de larga duración
  • Manejo de millones de solicitudes por segundo
  • Cuando se requiere una IP estática
  • Cuando la terminación TLS debe realizarse en Istio

Integración con Application Load Balancer (ALB) ​

ALB es un balanceador de carga de capa 7 (HTTP/HTTPS), adecuado cuando se necesitan características avanzadas de enrutamiento.

Arquitectura de ALB ​

Configuración de ALB ​

1. Crear ALB con el recurso Ingress

yaml
# istio-ingress-alb.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: istio-ingress
  namespace: istio-system
  annotations:
    # ALB configuration
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/ssl-redirect: '443'

    # ACM certificate
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:region:account:certificate/cert-id

    # Health check
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/healthcheck-port: '15021'
    alb.ingress.kubernetes.io/healthcheck-path: /healthz/ready
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: '15'
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: '5'
    alb.ingress.kubernetes.io/success-codes: '200'
    alb.ingress.kubernetes.io/healthy-threshold-count: '2'
    alb.ingress.kubernetes.io/unhealthy-threshold-count: '2'

    # Additional configuration
    alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=60
    alb.ingress.kubernetes.io/target-group-attributes: deregistration_delay.timeout_seconds=30
spec:
  ingressClassName: alb
  rules:
  - host: "myapp.example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: istio-ingressgateway
            port:
              number: 80

2. Enrutamiento basado en rutas

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: istio-ingress-path-based
  namespace: istio-system
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
  - host: "api.example.com"
    http:
      paths:
      - path: /v1
        pathType: Prefix
        backend:
          service:
            name: istio-ingressgateway
            port:
              number: 80
  - host: "admin.example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: istio-ingressgateway
            port:
              number: 80

Ventajas de ALB ​

  • Enrutamiento avanzado: Enrutamiento basado en rutas, Header y Query String
  • Integración con WAF: Seguridad mejorada con AWS WAF
  • Integración de autenticación: Integración con Cognito y OIDC
  • Integración con ACM: Gestión automática de certificados
  • Optimizado para contenedores: Optimizado para ECS y EKS

Casos de uso de ALB ​

  • Tráfico solo HTTP/HTTPS
  • Cuando se necesita enrutamiento basado en rutas
  • Cuando se requiere seguridad de WAF
  • Cuando se manejan varios dominios con un único balanceador de carga

Comparación entre NLB y ALB ​

PropiedadNLBALB
Capa OSICapa 4 (TCP/UDP)Capa 7 (HTTP/HTTPS)
RendimientoMillones de solicitudes por segundoDecenas de miles de solicitudes por segundo
LatenciaMuy bajaBaja
IP estáticaCompatible (Elastic IP)No compatible
Terminación TLSSe transmite como TCP (gestionada en Istio)Puede gestionarse en ALB
EnrutamientoBasado en IP/puertoBasado en ruta, Host y Header
Integración con WAFNo disponibleDisponible
CostoMenorRelativamente mayor
WebSocketCompatibilidad nativaCompatible
gRPCCompatibilidad nativaRequiere HTTP/2
Uso recomendadoAlto rendimiento, WebSocket, gRPCEnrutamiento HTTP, WAF, autenticación

Comparación entre Istio y otras soluciones ​

Istio frente a VPC Lattice ​

VPC Lattice es el servicio administrado de redes de aplicaciones de AWS.

Comparación de arquitectura ​

Comparación de características ​

PropiedadIstioVPC Lattice
AdministraciónAutogestionadoAdministrado por AWS (Fully-managed)
SidecarObligatorio (Sidecar o Ambient)No obligatorio
Sobrecarga de recursosAlta (Envoy por Pod)Baja (sin sidecar)
ComplejidadAltaBaja
Curva de aprendizajePronunciadaSuave
Gestión de tráficoMuy avanzada (control detallado)Básica (características suficientes)
mTLSAutomático, control detalladoCompatible
ObservabilidadMétricas y trazas completasMétricas básicas
Inyección de fallosCompatibleNo compatible
Circuit BreakerControl detalladoFuncionalidad básica
Rate LimitingLocal + GlobalFuncionalidad básica
Multi-clusterGran compatibilidadConectividad entre VPC
Cross-accountComplejoSimple (compatibilidad nativa)
CostoCosto de cómputo (EC2)Costo por uso del servicio
Vendor Lock-inNinguno (open source)Dependencia de AWS
Solo KubernetesSíNo (EC2, Lambda, etc.)

Cuándo elegir Istio ​

Istio es adecuado cuando:

  1. Se necesita control detallado del tráfico
    • Despliegue canary, pruebas A/B, Traffic Mirroring
    • Reglas de enrutamiento complejas (basadas en Header, Cookie, etc.)
    • Inyección de fallos para Chaos Engineering
  2. Se tienen requisitos de seguridad estrictos
    • Cifrado mTLS automático entre servicios
    • Políticas de autorización detalladas
    • Validación de JWT, RBAC
  3. Se necesita observabilidad avanzada
    • Métricas detalladas (latencia P50/P95/P99)
    • Trazabilidad distribuida (Jaeger, Zipkin)
    • Visualización de la topología de servicios (Kiali)
  4. Service Mesh Multi-cluster
    • Comunicación entre varios clústeres EKS
    • Failover entre clústeres
    • Balanceo de carga global
  5. Independencia del proveedor
    • Posibilidad de migrar a otras nubes o entornos on-premises
    • Uso de estándares de Kubernetes

Ejemplo: gestión avanzada del tráfico de Istio

yaml
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  # Header-based routing
  - match:
    - headers:
        user-agent:
          regex: ".*Mobile.*"
    route:
    - destination:
        host: reviews
        subset: mobile-v2
  # Canary deployment (10%)
  - match:
    - headers:
        x-canary:
          exact: "true"
    route:
    - destination:
        host: reviews
        subset: v3
      weight: 10
    - destination:
        host: reviews
        subset: v2
      weight: 90
  # Traffic Mirroring
  - route:
    - destination:
        host: reviews
        subset: v2
    mirror:
      host: reviews
      subset: v3
    mirrorPercentage:
      value: 100

Cuándo elegir VPC Lattice ​

VPC Lattice es adecuado cuando:

  1. Conectividad de servicios sencilla
    • Solo se necesita balanceo de carga y enrutamiento básicos
    • Es importante una implementación rápida
  2. Baja sobrecarga operativa
    • Se prefieren servicios administrados por AWS
    • No hay carga de administrar sidecars
  3. Comunicación entre VPC/cuentas
    • Conexión de servicios entre varias cuentas de AWS
    • Comunicación sin VPC peering
  4. Entornos mixtos
    • Entornos mixtos de EKS + EC2 + Lambda
    • Uso de diversos tipos de cómputo además de Kubernetes
  5. Optimización de costos
    • Reducción de los costos de recursos de sidecar
    • Servicios a pequeña escala

Uso conjunto de Istio y VPC Lattice ​

Las dos soluciones no son mutuamente excluyentes y pueden utilizarse juntas:

Casos de uso:

  • Dentro del clúster: Istio para la gestión detallada del tráfico y la seguridad
  • Entre clústeres/entre cuentas: VPC Lattice para conectividad sencilla
  • Entornos mixtos: Usar VPC Lattice para conectar clústeres de Istio con Lambda/EC2

Istio frente a Cilium (basado en eBPF) ​

Cilium es una solución de redes y seguridad para Kubernetes que usa eBPF.

Comparación de arquitectura ​

PropiedadIstioCilium
Stack tecnológicoEnvoy Proxy (sidecar)eBPF (nivel de kernel)
Propósito principalService MeshCNI + Service Mesh
RedesOpera sobre Kubernetes CNIProporciona CNI
RendimientoBuenoExcelente (nivel de kernel)
Uso de recursosAlto (sidecar)Bajo (nivel de kernel)
Características L7Muy potentesBásicas
ObservabilidadCompletaHubble (básica)
Curva de aprendizajePronunciadaPronunciada
MadurezAltaMedia (características de Service Mesh)

Comparación de características ​

CaracterísticaIstioCilium
Network PolicyKubernetes + IstioKubernetes + Cilium (más potente)
Balanceo de carga L7Muy detalladoBásico
mTLSAutomático, control detalladoCompatible
Gestión de tráficoMuy avanzadaBásica
ObservabilidadPrometheus, Jaeger, KialiHubble
RendimientoBuenoExcelente
Multi-clusterFuerteCluster Mesh

Cuándo elegir cada opción ​

Elegir Istio:

  • La gestión de tráfico L7 es un requisito fundamental
  • Se necesitan potentes características de Service Mesh
  • Se necesitan herramientas completas de observabilidad y depuración

Elegir Cilium:

  • Se considera reemplazar CNI
  • La seguridad de red es la principal preocupación
  • La optimización del rendimiento es importante
  • Se desea aprovechar la tecnología eBPF

Uso conjunto:

  • Se puede usar Cilium como CNI e Istio como Service Mesh
  • Sin embargo, se debe considerar la superposición de características y la mayor complejidad

Optimización específica para EKS ​

Integración de IAM Roles for Service Accounts (IRSA) ​

Configure IRSA para permitir que las cargas de trabajo de Istio accedan de forma segura a servicios de AWS.

Configuración de IRSA ​

bash
# 1. Create OIDC provider
eksctl utils associate-iam-oidc-provider \
    --cluster my-cluster \
    --approve

# 2. Create IAM policy
cat <<EOF > app-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
EOF

aws iam create-policy \
    --policy-name MyAppS3Policy \
    --policy-document file://app-policy.json

# 3. Link IAM Role to Service Account
eksctl create iamserviceaccount \
    --cluster my-cluster \
    --namespace default \
    --name my-app-sa \
    --attach-policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/MyAppS3Policy \
    --approve

Uso de Istio con IRSA ​

yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa
  namespace: default
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/my-app-role
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app-sa  # Using IRSA
      containers:
      - name: app
        image: my-app:latest
        env:
        - name: AWS_REGION
          value: us-west-2

Integración con AWS Certificate Manager (ACM) ​

Cómo usar certificados ACM con Istio Gateway.

Terminación TLS en NLB ​

yaml
apiVersion: v1
kind: Service
metadata:
  name: istio-ingressgateway
  namespace: istio-system
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "external"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:region:account:certificate/cert-id"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
spec:
  type: LoadBalancer
  selector:
    istio: ingressgateway
  ports:
  - name: https
    port: 443
    targetPort: 8443

Terminación TLS en Istio (ACM Private CA) ​

bash
# 1. Issue certificate from ACM Private CA
aws acm-pca issue-certificate \
    --certificate-authority-arn arn:aws:acm-pca:region:account:certificate-authority/ca-id \
    --csr file://csr.pem \
    --signing-algorithm "SHA256WITHRSA" \
    --validity Value=365,Type="DAYS"

# 2. Create Kubernetes Secret
kubectl create secret tls my-tls-secret \
    --cert=certificate.pem \
    --key=private-key.pem \
    -n istio-system

# 3. Use in Gateway
yaml
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: my-tls-secret  # ACM certificate
    hosts:
    - "myapp.example.com"

Integración con CloudWatch Container Insights ​

Implemente monitoreo unificado enviando métricas de Istio a CloudWatch.

Configuración de CloudWatch Agent ​

bash
# 1. Attach IAM policy
eksctl create iamserviceaccount \
    --cluster my-cluster \
    --namespace amazon-cloudwatch \
    --name cloudwatch-agent \
    --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
    --approve

# 2. Install CloudWatch Agent
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml

kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml

Recopilación de métricas de Prometheus ​

yaml
# prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: amazon-cloudwatch
data:
  prometheus.yaml: |
    global:
      scrape_interval: 1m
      scrape_timeout: 10s

    scrape_configs:
    # Istio Control Plane metrics
    - job_name: 'istiod'
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - istio-system
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: istiod;http-monitoring

    # Envoy sidecar metrics
    - job_name: 'envoy-stats'
      metrics_path: /stats/prometheus
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_container_port_name]
        action: keep
        regex: '.*-envoy-prom'
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:15090
        target_label: __address__

Consulta de CloudWatch Logs Insights ​

sql
-- Istio error log analysis
fields @timestamp, @message
| filter @logStream like /istio-proxy/
| filter @message like /error/
| sort @timestamp desc
| limit 100

-- Request latency analysis
fields @timestamp, request_duration_ms
| filter @logStream like /istio-proxy/
| stats avg(request_duration_ms), max(request_duration_ms), pct(request_duration_ms, 95) by bin(5m)

Ajustes de optimización de EKS ​

1. Optimización de recursos de Pod ​

yaml
# Envoy sidecar resource optimization
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    defaultConfig:
      proxyMetadata:
        # EKS optimization
        ISTIO_META_DNS_CAPTURE: "true"
        ISTIO_META_DNS_AUTO_ALLOCATE: "true"
  values:
    global:
      proxy:
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 2000m
            memory: 1024Mi
        # Connection pool settings
        concurrency: 2

2. Consideraciones sobre Cluster Autoscaler ​

yaml
# Istio Gateway Autoscaling
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: istio-ingressgateway
  namespace: istio-system
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: istio-ingressgateway
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

3. Pod Disruption Budget ​

yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: istio-ingressgateway
  namespace: istio-system
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: istio-ingressgateway

Prácticas recomendadas ​

1. Guía de selección de Load Balancer ​

Usar NLB:

  • gRPC, WebSocket y otras conexiones de larga duración
  • Manejo de millones de solicitudes por segundo
  • Se requiere IP estática
  • Terminación TLS en Istio

Usar ALB:

  • Solo HTTP/HTTPS
  • Enrutamiento basado en rutas
  • Se requiere seguridad de WAF
  • Integración de autenticación con Cognito

2. Ubicación de la terminación TLS ​

Terminar en Load Balancer (recomendado):

  • Renovación automática de certificados ACM
  • Administración sencilla
  • Menor carga en Istio

Terminar en Istio:

  • Se requiere cifrado de extremo a extremo
  • Control detallado de políticas TLS
  • Uso de mTLS

3. Optimización de costos ​

  • Spot Instances: Usar para cargas de trabajo de Istio Gateway
  • Graviton Instances: Ahorro de costos con instancias basadas en ARM
  • Límites de recursos: Establecer límites adecuados de recursos para sidecar
  • Ambient Mode: Considerar para eliminar la sobrecarga de sidecar

4. Seguridad ​

  • IRSA: Acceder a servicios de AWS con roles IAM
  • Security Groups: Principio de mínimo privilegio
  • mTLS: Habilitar el cifrado entre servicios
  • Network Policy: Usar con Cilium o Calico

5. Monitoreo ​

  • CloudWatch: Registros y métricas unificados
  • X-Ray: Trazabilidad distribuida
  • Prometheus + Grafana: Métricas detalladas
  • Kiali: Visualización de Service Mesh

Próximos pasos ​

Si ha completado la integración con AWS, consulte los siguientes documentos:

  1. Gestión de tráfico: Características avanzadas de gestión de tráfico
  2. Seguridad: mTLS y autenticación/autorización
  3. Observabilidad: Recopilación de métricas, registros y trazas

Referencias ​

Pregunta a la documentación

Enter envía, Shift+Enter añade una línea.