Ingress controlador no puede encontrar activos

Estoy tratando de configurar un controlador Ingress en Microk8s para acoger una aplicación de react (SiguienteJS).

El pod y el servicio están funcionando, así como accesible internamente a través de machine.domain.eu:311

Mi objetivo es hacer este servicio disponible a través de machine.domain.eu/dev en el puerto 80 predeterminado utilizando un controlador de entrada nginx:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - host: machine.domain.eu
      http:
        paths:
          - path: /dev(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: web-svc
                port: 
                  number: 3000

Si emito un comando curl vía curl machine.domain.eu/dev de la máquina, donde el nodo está funcionando, estoy recuperando el html deseado, aunque no puedo ver, si los activos están siendo cargados.

Al cambiar de nuevo a mi máquina local abriendo mi navegador de elección y golpeó el punto final http obtengo una pantalla en blanco y todos los activos estáticos 404. El índice.html viene bien, pero no se encuentran todos los demás recursos.

He probado cualquier número de combinaciones en la anotación para reescribir /$1 /$2, mientras cambia el camino a - path: /dev/?(.*) pero sin efecto.

En otras palabras: El documento mismo se carga a través de http://machine.domain.eu/dev

Sin embargo, los activos, que deben cargarse a través de http://machine.domain.eu/dev/_next/{....}

en realidad se están solicitando a través de:

http://machine.domain.eu/_next/{....}

¿Qué exactamente estoy haciendo mal aquí?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por codealchemy


2 Respuestas:

  • El problema que estás experimentando se debe a que los activos (como los archivos estáticos en la carpeta "_next") no se están cargando correctamente cuando accedes a tu aplicación a través del path "/dev" en el controlador Ingress.

    Para solucionar este problema, necesitas ajustar la configuración de tu controlador Ingress. Parece que estás intentando reescribir el path a "/$2" pero no está funcionando como esperas. Aquí hay una posible solución:

    • Actualiza la configuración de tu Ingress para incluir una configuración adicional para manejar los activos estáticos. Puedes usar el siguiente ejemplo como guía:
    yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: web-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
        nginx.ingress.kubernetes.io/configuration-snippet: |
          rewrite ^/dev(/|$)(.)$ /$2 break;
    spec:
      rules:
           
    • host: machine.domain.eu
    http: paths:
    • path: /dev(/|$)(.)
    pathType: Prefix backend: service: name: web-svc port: number: 3000

    En este ejemplo, se utiliza la anotación nginx.ingress.kubernetes.io/configuration-snippet para agregar una regla de reescritura adicional que captura el path de los activos estáticos y los redirige correctamente.

    • Aplica esta nueva configuración de Ingress en tu cluster Kubernetes.
    • Luego, intenta acceder a tu aplicación a través de `http://machine.domain.eu/dev` y verifica si los activos se cargan correctamente.

    Este ajuste debería ayudar a que los activos estáticos se carguen correctamente al acceder a tu aplicación a través del path "/dev" en el controlador Ingress. Si sigues experimentando problemas, asegúrate de revisar los logs del controlador Ingress para obtener más información sobre lo que está sucediendo.

    Respondida el Dec 18, 2020 a las 08:34 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Parece que el problema es que la anotación nginx.ingress.kubernetes.io/rewrite-target no está configurada correctamente. Esta anotación se utiliza para reescribir la ruta de solicitud antes de que se envíe al servicio de backend.

    En tu configuración actual, la anotación está establecida en /$2, lo que significa que solo reescribe el segundo grupo de captura en la expresión regular de ruta ((.<strong>)). Esto no es lo que quieres, ya que deseas reescribir toda la ruta de solicitud a /dev/$2.

    Para resolver este problema, debes establecer la anotación nginx.ingress.kubernetes.io/rewrite-target en /$1/$2. Esto reescribirá toda la ruta de solicitud a /dev/$2, que es lo que necesitas para que los activos estáticos se carguen correctamente.

    Aquí tienes la configuración actualizada del Ingress:

    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: web-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1/$2
    spec:
      rules:
           
    • host: machine.domain.eu
    http: paths:
    • path: /dev(/|$)(.)
    pathType: Prefix backend: service: name: web-svc port: number: 3000

    Una vez que hayas realizado este cambio, vuelve a implementar el Ingress y comprueba si los activos estáticos se cargan correctamente.

    Respondida el Dec 18, 2020 a las 08:38 - por Gemini

    Votos positivos: 0 | Votos negativos: 0