Using Kuberenetes ingress controller as reverse proxy to other services in the cluster

2/20/2019

I have a simple Kubernetes cluster on kops and aws, which is serving a web app, there is a single html page and a few apis. They are all running as services. I want to expose all endpoints(html and apis) publicly for the web page to work.

I have exposed the html service as an LoadBalancer and I am also using nginx-ingress controller. I want to use the same LoadBalancer to expose the other apis as well(using a different LoadBalancer for each service seems like a bad and expensive way), it is something that I was able to do using Nginx reverse proxy in the on-premise version of the same application, by giving different paths for each api in the nginx conf file.

Although I am not able to do the same in the cluster, I tried Service ingress but somehow I am not able to get the desired result, if I add a path, e.g. "path: "/mobiles-service"" and then add the specific service for it, the http requests do not somehow get redirected to the service. Only the html service works on the root path. Any help would be appreciated.

-- Ashish Ranjan
kubernetes
kubernetes-ingress
nginx

1 Answer

2/20/2019

First you need to create controller for your Kops cluster running on AWS

kubectl apply -f https://raw.githubusercontent.com/kubernetes/kops/master/addons/ingress-nginx/v1.6.0.yaml

Then check if ingress-nginx service is created by running:

kubectl get svc ingress-nginx -n kube-ingress

Then create your pods and ClusterIP type services for your each app like sample below:

kind: Service
apiVersion: v1
metadata:
  name: app1-service
spec:
  selector:
    app: app1
  ports:
    - port: <app-port>

Then create ingress rule file like sample below:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
        - path: /app1
          backend:
            serviceName: app1-service
            servicePort: <app1-port>
        - path: /app2
          backend:
            serviceName: app2-service
            servicePort: <app2-port>

Once you deploy this ingress rule yaml, Kubernetes creates an Ingress resource on your cluster. The Ingress controller running in your cluster is responsible for creating an HTTP(S) Load Balancer to route all external HTTP traffic (on port 80) to the App Services in backend you exposed on specified pathes.

You can see newly created ingress rule by running:

kubectl get ingress

And you will see output like below:

NAME              HOSTS   ADDRESS                                                                  PORTS   AGE
example-ingress   *       a886e57982736434e9a1890264d461398-830017012.us-east-2.elb.amazonaws.com   80      1m

In relevant path like http://external-dns-name/app1 and http://external-dns-name/app2 you will access to your apps and in root / path, you will get <default backend - 404>

-- coolinuxoid
Source: StackOverflow