La puerta de enlace de ingreso de Istio no puede conectarse a más de una réplica para un servicio

La puerta de enlace de ingreso de Istio no puede conectarse a más de una réplica para un servicio

Estoy configurando Istio en un nuevo clúster de AWS EKS y creé una implementación básica de nginx para probar. Cuando el despliegue sólo tiene una réplica funciona perfectamente, respondiendo en menos de 100ms. Cuando agrego una réplica, el tiempo de respuesta del nuevo módulo aumenta enormemente, con un promedio de alrededor de 10 segundos.

Basado en sugerencias de otros lugares, actualicé elconfiguración de mallapara deshabilitar los reintentos automáticos:

meshConfig:
   defaultHttpRetryPolicy: {}

Después de que esto sucedió, descubrí que las solicitudes al segundo pod siempre fallan:

"GET / HTTP/1.1" 503 UF upstream_reset_before_response_started{connection_failure} - "-" 0 91 10003 - "108.249.9.111,10.1.0.117" "curl/7.68.0" "6fa51be8-1441-4454-8d 1b-a03c93b257dc" "example.com" "10.1.52.62:80" outbound|80||nginx.my-namespace.svc.cluster.local - 10.1.108.189:8080 10.1.0.117:21410 - -

Mi configuración es la siguiente:

# AWS ALB Ingress -> istio-ingressgateway (ClusterIP) -> gateway -> virtualservice -> service -> nginx

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: default
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

---

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: nginx
spec:
  hosts:
  - "example.com"
  gateways:
  - default
  http:
  - route:
    - destination:
        host: nginx

---

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      name: http

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
    version: v1
spec:
  replicas: 2
  revisionHistoryLimit: 1
  selector:
    matchLabels:
      app: nginx
      version: v1
  template:
    metadata:
      labels:
        app: nginx
        version: v1
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
          resources:
            requests:
              memory: 100Mi
              cpu: 100m
            limits:
              memory: 1500Mi
              cpu: 1000m

Versiones:

$ istioctl version
client version: 1.13.2
control plane version: 1.13.2
data plane version: 1.13.2 (1 proxies)


$ kubectl version --short
Client Version: v1.21.11
Server Version: v1.21.5-eks-bc4871b

Respuesta1

Descubrí que mi problema se debía a reglas de grupo de seguridad mal configuradas para los nodos. No permitía el tráfico de nodo a nodo, lo que impedía que la puerta de entrada de istio se comunicara con pods en otros nodos.

Usando el módulo AWS EKS Terraform, agregué lo siguiente:


  node_security_group_additional_rules = {

    ingress_self_all = {
      description = "Node to node all ports/protocols"
      protocol    = "-1"
      from_port   = 0
      to_port     = 0
      type        = "ingress"
      self        = true
    }
    egress_all = {
      description = "Node all egress"
      protocol    = "-1"
      from_port   = 0
      to_port     = 0
      type        = "egress"
      cidr_blocks = ["0.0.0.0/0"]
    }
  }

información relacionada