Estoy configurando un clúster de Kubernetes que contiene tres aplicaciones, cada una de las cuales se ejecuta dentro de su propio pod y servicio respectivos. Las interfaces web de estas aplicaciones deben ser accesibles en los puertos 80, 9000 y 15672. También hay una cantidad de API de backend que se ejecutan en sus propios pods y servicios, que deben ser accesibles en sus respectivos puertos. Se accede al clúster a través de un proxy inverso NGINX con la siguiente definición de ingreso:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress namespace: my-namespace annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/use-regex: "true" spec: tls: - hosts: - myapp.com secretName: my-certificat rules: - host: myapp.com http: paths: - backend: serviceName: my-service-1 servicePort: 8092 path: /api/someroute/(.*) - backend: serviceName: my-service-2 servicePort: 30003 path: /api/someotherroute/(.*) - backend: serviceName: my-other-frontend servicePort: 9000 path: /other/(.*) - backend: serviceName: my-yetanother-frontend servicePort: 15672 path: /yetanother/(.*) - backend: serviceName: my-main-frontend servicePort: 80 path: /(.*) Esto funciona para los servicios api, pero no para las interfaces. Si tuviera que ingresar un URI como myapp.com/other/ en mi navegador, haría una llamada a my-other-frontend:9000/other/ , en lugar de my-other-frontend:9000/ . Por supuesto, esto se puede resolver con una anotación de reescritura como nginx.ingress.kubernetes.io/rewrite-target: /$1 , el problema es que esto también se aplicaría a los servicios api, y esos realmente necesitan la ruta completa en su llamada, por lo que una regla de reescritura general los rompería.
Entonces mi pregunta es: ¿es posible definir reglas de reescritura que solo se apliquen a rutas específicas?
Aconsejaría dividir su ingreso en 2 según sus diferentes anotaciones.
1) El primero para api-services, llamado my-api-ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-api-ingress namespace: my-namespace annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/use-regex: "true" spec: tls: - hosts: - myapp.com secretName: my-certificat rules: - host: myapp.com http: paths: - backend: serviceName: my-service-1 servicePort: 8092 path: /api/someroute/(.*) - backend: serviceName: my-service-2 servicePort: 30003 path: /api/someotherroute/(.*) 2) Y el segundo, digamos my-front-ingress con nginx.ingress.kubernetes.io/rewrite-target: /$1 anotación para el resto de sus interfaces. Según su pregunta, creo que no necesita las instrucciones detalladas para la creación de ingreso con anotación de reescritura.
EDIT1: Sí, es posible crear múltiples ingresos con el mismo host. Pero, por favor, preste atención a qué ingresa exactamente nginx. Consulte la respuesta de @LazerBass con sus investigaciones.
En resumen, según la tabla de comparación de ingresos de nginx ,
El controlador nginxinc no admite la combinación de reglas de ingreso con el mismo host. Puede usarlo solo con Ingresos combinables
La forma más fácil es usar kubernetes/ingress-nginx regulares 
Espero que ayude.