Integración con AWS
Este documento explica cómo integrar Istio con servicios de AWS en un entorno de Amazon EKS.
Tabla de contenidos
- Integración con AWS Load Balancer
- Comparación de Istio con otras soluciones
- Optimización específica de EKS
- Prácticas recomendadas
Integración con AWS Load Balancer
Istio Ingress Gateway puede integrarse con AWS Load Balancer para gestionar el 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
# 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-controller2. Configuración de Istio Ingress Gateway con NLB
# 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: 84433. Configuración del recurso Gateway
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: trueVentajas de NLB
- Alto rendimiento: Gestiona millones de solicitudes por segundo
- Baja latencia: Opera en la Capa 4 para ofrecer 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
- Gestión de millones de solicitudes por segundo
- Cuando se requiere una IP estática
- Cuando la terminación de 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 funciones avanzadas de enrutamiento.
Arquitectura de ALB
Configuración de ALB
1. Crear ALB con un recurso Ingress
# 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: 802. Enrutamiento basado en rutas
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: 80Ventajas 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 requiere enrutamiento basado en rutas
- Cuando se requiere seguridad de WAF
- Cuando se gestionan varios dominios con un único balanceador de carga
Comparación entre NLB y ALB
| Propiedad | NLB | ALB |
|---|---|---|
| Capa OSI | Capa 4 (TCP/UDP) | Capa 7 (HTTP/HTTPS) |
| Rendimiento | Millones de solicitudes por segundo | Decenas de miles de solicitudes por segundo |
| Latencia | Muy baja | Baja |
| IP estática | Compatible (Elastic IP) | No compatible |
| Terminación TLS | Paso directo como TCP (gestionado en Istio) | Puede gestionarse en ALB |
| Enrutamiento | Basado en IP/Port | Basado en Path, Host y Header |
| Integración WAF | No disponible | Disponible |
| Costo | Menor | Relativamente mayor |
| WebSocket | Compatibilidad nativa | Compatible |
| gRPC | Compatibilidad nativa | Requiere HTTP/2 |
| Uso recomendado | Alto rendimiento, WebSocket, gRPC | Enrutamiento HTTP, WAF, autenticación |
Comparación de Istio con otras soluciones
Istio vs VPC Lattice
VPC Lattice es el servicio administrado de redes de aplicaciones de AWS.
Comparación de arquitecturas
Comparación de características
| Propiedad | Istio | VPC Lattice |
|---|---|---|
| Administración | Autoadministrado | Administrado por AWS (Fully-managed) |
| Sidecar | Requerido (Sidecar o Ambient) | No requerido |
| Sobrecarga de recursos | Alta (Envoy por Pod) | Baja (sin sidecar) |
| Complejidad | Alta | Baja |
| Curva de aprendizaje | Pronunciada | Suave |
| Gestión de tráfico | Muy avanzada (control detallado) | Básica (funciones suficientes) |
| mTLS | Automático, control detallado | Compatible |
| Observabilidad | Métricas y trazas enriquecidas | Métricas básicas |
| Inyección de fallos | Compatible | No compatible |
| Circuit Breaker | Control detallado | Funcionalidad básica |
| Rate Limiting | Local + Global | Funcionalidad básica |
| Multi-cluster | Compatibilidad sólida | Conectividad entre VPC |
| Cross-account | Complejo | Simple (compatibilidad nativa) |
| Costo | Costo de cómputo (EC2) | Costo por uso del servicio |
| Vendor Lock-in | Ninguno (open source) | Dependencia de AWS |
| Solo Kubernetes | Sí | No (EC2, Lambda, etc.) |
Cuándo elegir Istio
Istio es adecuado cuando:
- Se necesita control de tráfico detallado
- Canary deployment, pruebas A/B, Traffic Mirroring
- Reglas de enrutamiento complejas (basadas en Header, Cookie, etc.)
- Fault Injection para Chaos Engineering
- Existen requisitos de seguridad estrictos
- Cifrado mTLS automático entre servicios
- Políticas de autorización detalladas
- Validación de JWT, RBAC
- Se necesita observabilidad avanzada
- Métricas detalladas (Latency P50/P95/P99)
- Trazado distribuido (Jaeger, Zipkin)
- Visualización de topología de servicios (Kiali)
- Mesh multi-cluster
- Comunicación entre varios clusters de EKS
- Failover entre clusters
- Balanceo de carga global
- Independencia del proveedor
- Posibilidad de migrar a otros clouds o entornos on-premises
- Uso de estándares de Kubernetes
Ejemplo: gestión avanzada de tráfico de Istio
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: 100Cuándo elegir VPC Lattice
VPC Lattice es adecuado cuando:
- Conectividad de servicios simple
- Solo se necesitan balanceo de carga y enrutamiento básicos
- Es importante una implementación rápida
- Baja sobrecarga operativa
- Se prefieren servicios administrados por AWS
- Sin carga de administración de sidecar
- Comunicación entre VPC/cuentas
- Conexión de servicios entre varias cuentas de AWS
- Comunicación sin VPC peering
- Entornos mixtos
- Entornos mixtos de EKS + EC2 + Lambda
- Uso de diversos tipos de cómputo más allá de Kubernetes
- Optimización de costos
- Reducción de los costos de recursos de sidecar
- Servicios de pequeña escala
Uso conjunto de Istio + VPC Lattice
Las dos soluciones no son mutuamente excluyentes y pueden utilizarse juntas:
Casos de uso:
- Dentro del cluster: Istio para la gestión detallada del tráfico y la seguridad
- Entre clusters/entre cuentas: VPC Lattice para conectividad simple
- Entornos mixtos: Usar VPC Lattice para conectar clusters de Istio con Lambda/EC2
Istio vs Cilium (basado en eBPF)
Cilium es una solución de redes y seguridad de Kubernetes que usa eBPF.
Comparación de arquitecturas
| Propiedad | Istio | Cilium |
|---|---|---|
| Stack tecnológico | Envoy Proxy (sidecar) | eBPF (nivel de kernel) |
| Propósito principal | Service Mesh | CNI + Service Mesh |
| Redes | Opera sobre Kubernetes CNI | Proporciona CNI directamente |
| Rendimiento | Bueno | Excelente (nivel de kernel) |
| Uso de recursos | Alto (sidecar) | Bajo (nivel de kernel) |
| Funciones L7 | Muy potentes | Básicas |
| Observabilidad | Enriquecida | Hubble (básica) |
| Curva de aprendizaje | Pronunciada | Pronunciada |
| Madurez | Alta | Media (funciones de Service Mesh) |
Comparación de características
| Característica | Istio | Cilium |
|---|---|---|
| Network Policy | Kubernetes + Istio | Kubernetes + Cilium (más potente) |
| Balanceo de carga L7 | Muy detallado | Básico |
| mTLS | Automático, control detallado | Compatible |
| Gestión de tráfico | Muy avanzada | Básica |
| Observabilidad | Prometheus, Jaeger, Kiali | Hubble |
| Rendimiento | Bueno | Excelente |
| Multi-cluster | Sólido | Cluster Mesh |
Cuándo elegir cada opción
Elegir Istio:
- La gestión de tráfico L7 es un requisito principal
- Se necesitan funciones potentes de Service Mesh
- Se necesitan herramientas enriquecidas 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 funciones y la mayor complejidad
Optimización específica de 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 los servicios de AWS.
Configuración de IRSA
# 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 \
--approveUso de Istio con IRSA
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-2Integración con AWS Certificate Manager (ACM)
Cómo usar certificados de ACM con Istio Gateway.
Terminación de TLS en NLB
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: 8443Terminación de TLS en Istio (ACM Private CA)
# 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 GatewayapiVersion: 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
# 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.yamlRecopilación de métricas de Prometheus
# 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
-- 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)Configuración de optimización de EKS
1. Optimización de recursos de Pod
# 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: 22. Consideraciones sobre Cluster Autoscaler
# 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: 803. Pod Disruption Budget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: istio-ingressgateway
namespace: istio-system
spec:
minAvailable: 1
selector:
matchLabels:
app: istio-ingressgatewayPrácticas recomendadas
1. Guía de selección de Load Balancer
Usar NLB:
- gRPC, WebSocket y otras conexiones de larga duración
- Gestión de millones de solicitudes por segundo
- Se requiere IP estática
- Terminación de 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 de TLS
Terminar en Load Balancer (recomendado):
- Renovación automática de certificados de ACM
- Administración sencilla
- Menor carga en Istio
Terminar en Istio:
- Se requiere cifrado de extremo a extremo
- Control detallado de la política de 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
- Resource Limits: Establecer límites adecuados de recursos de sidecar
- Ambient Mode: Considerar para eliminar la sobrecarga de sidecar
4. Seguridad
- IRSA: Acceder a servicios de AWS con IAM roles
- Security Groups: Principio de mínimo privilegio
- mTLS: Habilitar el cifrado entre servicios
- Network Policy: Usar con Cilium o Calico
5. Monitoreo
- CloudWatch: Logs y métricas unificados
- X-Ray: Trazado distribuido
- 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:
- Gestión de tráfico: Funciones avanzadas de gestión de tráfico
- Seguridad: mTLS y autenticación/autorización
- Observabilidad: Métricas, logs y recopilación de trazas