Kubernetes Ingress siempre dirige el tráfico al pod equivocado

Kubernetes Ingress siempre dirige el tráfico al pod equivocado

Tengo la siguiente configuración en un minikubeclúster de Kubernetes (localmente)

  1. espacio de nombrescustomer-a
  • 1 implementación -> imprime "Hola del cliente A"
  • 1 Servicio tipo LoadBalancer
  • 1 ingreso -> anfitrióncustomer-a.example.com
  1. espacio de nombrescustomer-b
  • 1 implementación -> imprime "Hola del cliente B"
  • 1 Servicio tipo LoadBalancer
  • 1 ingreso -> anfitrióncustomer-b.example.com
  1. espacio de nombrescustomer-c
  • 1 implementación -> imprime "Hola del cliente C"
  • 1 Servicio tipo LoadBalancer
  • 1 ingreso -> anfitrióncustomer-c.example.com

Como estoy ejecutando esta configuración en un minikubeclúster, tengo que usar el minikube tunnelcomando para acceder al servicio de ingreso

Y así es como se ve mi configuración actual

// kubectl get ing, svc -n customer-a

NAME                                   CLASS   HOSTS                      ADDRESS   PORTS   AGE
ingress.networking.k8s.io/customer-a   nginx   customer-a.example.com             80      11s

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/customer-a   LoadBalancer   10.96.39.62   127.0.0.1     80:30048/TCP   11s


// kubectl get ing, svc -n customer-b
NAME                                   CLASS   HOSTS                      ADDRESS        PORTS   AGE
ingress.networking.k8s.io/customer-b   nginx   customer-b.example.com   192.168.49.2   80      30s

NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/customer-b   LoadBalancer   10.110.126.198   127.0.0.1     80:31292/TCP   30s


// kubectl get ing, svc -n customer-c
NAME                                   CLASS   HOSTS                      ADDRESS        PORTS   AGE
ingress.networking.k8s.io/customer-c   nginx   customer-c.example.com   192.168.49.2   80      6m36s

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/customer-c   LoadBalancer   10.104.99.195   127.0.0.1     80:32717/TCP   6m36s

Según lo anterior, EXTERNAL-IPde todos los LoadBalancertipos de Servicios son iguales, pero para diferenciar el flujo de tráfico, he utilizado el HOSTSanterior ( customer-a.example.com, customer-b.example.com, customer-c.example.com)

Y he asignado la IP a los nombres de host de la /etc/hostssiguiente manera:

127.0.0.1 customer-a.example.com customer-b.example.com customer-c.example.com

Cuando intento acceder a cada URL, solo me dirige al mismo resultado, que esHi from Customer C

// curl -kv http://customer-a.example.com

> GET / HTTP/1.1
> Host: customer-a.example.com
> User-Agent: curl/7.85.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< date: Thu, 29 Dec 2022 00:24:49 GMT
< server: uvicorn
< content-length: 20
< content-type: application/json
<
* Connection #0 to host customer-a.example.com left intact
{"response":"Hi from Customer C"}


// curl -kv http://customer-b.example.com

> GET / HTTP/1.1
> Host: customer-b.example.com
> User-Agent: curl/7.85.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< date: Thu, 29 Dec 2022 00:24:49 GMT
< server: uvicorn
< content-length: 20
< content-type: application/json
<
* Connection #0 to host customer-b.example.com left intact
{"response":"Hi from Customer C"}


// curl -kv http://customer-c.example.com

> GET / HTTP/1.1
> Host: customer-c.example.com
> User-Agent: curl/7.85.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< date: Thu, 29 Dec 2022 00:24:49 GMT
< server: uvicorn
< content-length: 20
< content-type: application/json
<
* Connection #0 to host customer-c.example.com left intact
{"response":"Hi from Customer C"}

¿Alguien puede ayudarme a encontrar el problema con esto? ¿Asumo que esto tiene algo que ver con el minikube tunnel?

Respuesta1

Esto no tiene nada que ver con el túnel minikube. El problema aquí es que todos sus servicios utilizan el mismo puerto para comunicarse fuera del clúster. En el protocolo tcp, dos aplicaciones que se ejecutan en la misma máquina no pueden tener los mismos números de puerto, por lo que en este caso debe configurar números de puerto personalizados para las tres implementaciones y asignarlos en consecuencia en su balanceador de carga o configuración de ingreso o nginx.

información relacionada