skip to Main Content

I’m using Kubernetes v1.23.16 cluster (One master and three workers) bare metal based.

I have created couple of services in a separate namespace. The same as follows.

$ kubectl get services --all-namespaces
NAMESPACE     NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP                  11d
app1          app1-service      ClusterIP   10.103.151.235   <none>        80/TCP                   19h
app2          app2-service      ClusterIP   10.105.88.151    <none>        80/TCP                   11d
kube-system   kube-dns          ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   11d

Now I’m having below nginx resource yml to access the service outside. For example i would like access as given below.

  1. http://web.example.com/app1
  2. http://web.example.com/app2
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: app-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: web.example.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port: 
              number: 80

      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80

When i apply the nginx resource yml file it says service not found error.

$ kubectl describe ingress app-ingress
Name:             app-ingress
Labels:           <none>
Namespace:        default
Address:
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host             Path  Backends
  ----             ----  --------
  web.example.com
                   /app1    app1-service:80 (<error: endpoints "app1-service" not found>)
                   /app2    app2-service:80 (<error: endpoints "app2-service" not found>)
Annotations:       nginx.ingress.kubernetes.io/rewrite-target: /$2

Since my applications services are running in different namespace separately and my nginx resource yml is running in default namespace. So now how do i configure nginx resource file to access both of my service?

2

Answers


  1. An Ingress resource can only refer to Services in the same namespace as the Ingress. To manage two paths on the same hostname that lead to backends in different namespaces, you will need two separate Ingress resources.

    In the app1 namespace:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: app-ingress
      namespace: app1
    spec:
      ingressClassName: nginx
      rules:
      - host: web.example.com
        http:
          paths:
          - path: /app1
            pathType: Prefix
            backend:
              service:
                name: app1-service
                port:
                  number: 80
    

    And in the app2 namespace:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: app-ingress
      namespace: app2
    spec:
      ingressClassName: nginx
      rules:
      - host: web.example.com
        http:
          paths:
          - path: /app2
            pathType: Prefix
            backend:
              service:
                name: app2-service
                port:
                  number: 80
    

    With these resources in place, requests for http://web.example.com/app1 will go to app1-service, and requests for http://web.example.com/app2 will go to app2-service.

    NB: I’ve removed your nginx.ingress.kubernetes.io/rewrite-target annotation because you’re not doing any regex-based path rewriting in this example.


    I’ve put a deployable example online here.

    Login or Signup to reply.
  2. Just remove your rewrite path in single ingress you can achieve it.

    If you are creating the multiple make sure to change the name as Larsks suggested else it will overwrite the existing one.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: app-ingress
    spec:
      ingressClassName: nginx
      rules:
      - host: web.example.com
        http:
          paths:
          - path: /app1
            pathType: Prefix
            backend:
              service:
                name: app1-service
                port: 
                  number: 80
    
          - path: /app2
            pathType: Prefix
            backend:
              service:
                name: app2-service
                port:
                  number: 80
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search