Search code examples
kubernetes-ingressgoogle-kubernetes-engine

K8s Ingress rule for multiple paths in same backend service


I am trying to setup ingress load balancer. Basically, I have a single backend service with multiple paths.

Let's say my backend NodePort service name is hello-app. The pod associated with this service exposes multiple paths like /foo and /bar. Below is the example

NodePort service and associated deployment

    apiVersion: v1
    kind: Service
    metadata:
      name: hello-app
    spec:
      selector:
        app: hello-app
      type: NodePort
      ports:
        - protocol: "TCP"
          port: 7799
          targetPort: 7799
    ---
    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: hello-app
      labels:
        app: hello-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: hello-app
      template:
        metadata:
          labels:
            app: hello-app
        spec:
          containers:
          - name: hello-app
            image: us.gcr.io/hello-app:latest

Now onn making request like below I am facing 404 error.

http://{ingress-address:port}/foo
http://{ingress-address:port}/bar

I have tried below ingress configurations alternatively, but in both cases it didn't helped.

Ingress configuration 1

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: basic-ingress
    spec:
      rules:
      - http:
          paths:
          - path: /*
            backend:
              serviceName: hello-app
              servicePort: 7799

Ingress configuration 2

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: basic-ingress
    spec:
      backend:
        serviceName: hello-app
        servicePort: 7799

Error Message

10.88.16.10 - - [20/Jan/2019 08:50:55] "GET / HTTP/1.1" 404 - [2019-01-20 08:50:55] [INFO] [_internal] [_log] 10.88.16.10 - - [20/Jan/2019 08:50:55] "GET / HTTP/1.1" 404 -

I have looked into example mention in this link, but it assumes that different path refers to different backend service. In my case, multiple paths belong to the same backend service.

It looks like the full path is not being forwarded to downstream backend service from ingress which is resulting into the invalid request. Can somebody please suggest what is the correct way to configure ingress for the above requirement?


Solution

  • Answering my question after learning more about ingress.

    It wasn't an issue of wrong path forwarding to downstream. Basically gke ingress controller, expects a readiness probe to be present in backend. I was missing this in my deployment and because of it ingress was marking backend as "unknown"

    Eventually reading other stackoverflow questions below on it helped me to solve the problem

    gcp-load-balancer-backend-status-unknown

    kubernetes-ingress-gce-keeps-returning-502-error

    After introducing readiness probe as below, ingress was able to detect backend properly and passes on the request to backend.

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: hello-app
      labels:
        app: hello-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: hello-app
      template:
        metadata:
          labels:
            app: hello-app
        spec:
          containers:
          - name: hello-app
            image: us.gcr.io/hello-app:latest
            readinessProbe:
              httpGet:
                path: /healthz
                port: 7799
              periodSeconds: 1
              timeoutSeconds: 1
              successThreshold: 1
              failureThreshold: 10