The other day I wanted to point a subpath of an ingress to a service in another namespace. But an ingress can’t access a service in another namespace. But I found that it can be achieved by declaring multiple ingresses and these can reside in different namespaces as long as they share same host. This is only available with nginx as the ingress controller.

If multiple ingresses share the same host then these are some of the rules that apply (https://kubernetes.github.io/ingress-nginx/how-it-works/#building-the-nginx-model)

  • If more than one Ingress contains a TLS section for the same host, the oldest rule wins.
  • If multiple Ingresses define different paths for the same host, the ingress controller will merge the definitions.
  • If the same path for the same host is defined in more than one Ingress, the oldest rule wins.

So if we define two ingresses like this:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-site-example-com-main
  namespace: a
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - site.example.com
    secretName: site-example-com-secret
  rules:
  - host: site.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: site-example-com-svc
            port:
              number: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-subpath-site-example-com
  namespace: b
spec:
  ingressClassName: nginx
  rules:
  - host: site.example.com
    http:
      paths:
      - path: /subpath
        pathType: Prefix
        backend:
          service:
            name: subpath-site-example-com-svc
            port:
              number: 80

These two ingresses will merge and the subpath ingress can be placed in another namespace and point to services in that namespace.

The nginxinc/kubernetes-ingress develop by NGINX supports something similar which is called mergable ingress types which the community develop version kubernetes/ingress-nginx doesn’t support.