Home > Mobile >  Kubernetes Ingress path route to different services in different namespaces
Kubernetes Ingress path route to different services in different namespaces

Time:11-02

currently I'm trying the following setup:

I have:

  • one cluster
  • one Ingress Controller
  • one url (myapp.onazure.com)
  • two namespaces for two applications default and default-test
  • two deployments, ingress objects, services for the namespaces

I can easily reach my app from the default namespace with path based routing '/' as a prefix rule Now i have tried to configure the second namespace and following rule: /testing to hit another service

Unfortunately i get an HTTP404 when i try to hit the following URL myapp.onazure.com/testing/openapi.json

What did I miss?

Working Ingress 1

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: liveapi-ingress-object
  namespace: default
  annotations:
    kubernetes.io/ingress.class: public-nginx
spec:
  tls:
    - hosts:
        - myapp-region1.onazure.com
        - myapp-region2.onazure.com
      secretName: ingress-tls-csi
  rules:
    - host: - myapp-region1.onazure.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: liveapi-svc
                port:
                  number: 8080
    - host: myapp-region2.onazure.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: liveapi-svc
                port:
                  number: 8080

Not working Ingress 2

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: liveapi-ingress-object-testing
  namespace: default-testing
  annotations:
    kubernetes.io/ingress.class: public-nginx
    #nginx.ingress.kubernetes.io/rewrite-target: /testing
spec:
  tls:
    - hosts:
        - myapp-region1.onazure.com
        - myapp-region2.onazure.com
      secretName: ingress-tls-csi-testing
  rules:
    - host: myapp-region1.onazure.com
      http:
        paths:
          - path: /testing
            #pathType: Prefix
            backend:
              service:
                name: liveapi-svc-testing
                port:
                  number: 8080
    - host: myapp-region2.onazure.com
      http:
        paths:
          - path: /testing
            #pathType: Prefix
            backend:
              service:
                name: liveapi-svc-testing
                port:
                  number: 8080


Maybe I am missing a rewrite target to simply '/' in the testing namespace ingress?

CodePudding user response:

Use full DNS name of a service,

$SERVICE.$NAMESPACE.svc.cluster.local

But you need to make sure your ignress controller has acccess to the desired namespace.

CodePudding user response:

Finally I figured out the missing part. I had to add the following statement to the not working ingress object:

  annotations:
    kubernetes.io/ingress.class: public-nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1

Please see the complete ingress object:

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: liveapi-ingress-object
  namespace: default-testing
  annotations:
    kubernetes.io/ingress.class: public-nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
    - hosts:
        - myapp.onazure.com
      secretName: ingress-tls-csi-testing
  rules:
    - host: myapp.onazure.com
      http:
        paths:
          - path: /testing/(.*)
            pathType: Prefix
            backend:
              service:
                name: liveapi-svc-testing
                port:
                  number: 8000 

 
  • Related