Is there a way url redirect internally to particular service based on context path?

11/21/2019

There are multiple same pods running in one cluster but different namespaces. This is the web application running in Kubernetes. I have the URL <HOSTNAME>:<PORT>/context/abc/def/...... I want to redirect to particular service based on the context. Is there a way i can achieve it using ingress controller ? Or Is there any way i can achieve it using different ports through ingress ?

My web application works fine if the URL is <HOSTNAME>:<PORT>/abc/def/...... Since i have to access the different pods using the same URL, I am adding context to it. Do we have any other way to achieve this use case ?

-- Sunil Gudivada
kubernetes
kubernetes-ingress
multi-tenant
nginx-ingress

2 Answers

11/22/2019

You can do that with rewrite-target. In example below i used <HOSTNAME> value of rewrite.bar.com and <PORT> with value 80.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: context-service
          servicePort: 80
        path: /context1(/|$)(.*)
      - backend:
          serviceName: context-service2
          servicePort: 80
        path: /context2(/|$)(.*)       

For example, the ingress definition above will result in the following rewrites:

rewrite.bar.com/context1 rewrites to rewrite.bar.com/ for context 1 service.

rewrite.bar.com/context2 rewrites to rewrite.bar.com/ for context 2 service.

rewrite.bar.com/context1/new rewrites to rewrite.bar.com/new for context 1 service.

rewrite.bar.com/context2/new rewrites to rewrite.bar.com/new for context 2 service.

-- Piotr Malec
Source: StackOverflow

11/21/2019

You can manage how the traffic is pointed to the correct service by using the rules configuration of the ingress, here is a simple example from the documentation:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
  - http:
      paths:
      - path: /abc
        backend:
          serviceName: abc-service
          servicePort: 80
      - path: /context
        backend:
          serviceName: context-service
          servicePort: 80
-- wolmi
Source: StackOverflow