Nginx routing for kubernetes services

2/6/2019

I am having same requirements like metioned in this post - https://tech.holidayextras.com/routing-to-internal-kubernetes-services-using-proxies-and-ingress-controllers-e7eb44954d53

But I am not sure of what is that ipaddresses of backends mentioned there. I assumed it is the ips of my master and worker nodes in my cluster

My kubernetes has master node ip as 10.118.6.35 and worker node ip as 10.118.2.215 which are AWS ec2 instances.

So when I configured like below in my nginx.conf(please refer below), I am getting index.html rendered when I do curl https://10.118.6.35

But when I do https://10.118.6.35/hello-kenzan I am getting nginx error page default 404 page But I expect to route it to my kubernetes services running in NodePort 80:30854

I have followed steps as mentioned in that post. FYI, I am showing the echo-ing.yaml below -

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echomap
  annotations: {
    'kubernetes.io/ingress.class': nginx
   }
spec:
  rules:
  - host: ip-10-118-6-35.ec2.internal
    http:
      paths:
      - path: /hello-kenzan
        backend:
           service and: hello-kenzan
           service port: 80

And below is nginx.conf -

http {
       ssl_certificate ...
        ....
        ....
  server {
   listen     443 SSL;
   server_name www.ip-10.118-6-35.ec2.internal.com;
   root /usr/share/nginx/html;
   ssl_certificate ...
   ...
   ...
   include /etc/nginx/default.d/*.conf;

   location / {
   }
   error_page 404 /404.html;
      location = /40x.html {
    }
    error_page 500 502 503 504 /50x.html;
      location = /50x.html {
    }
}
upstream backend_nodes {
    server 10.118.6.35:31001;
    server 10.118.2.215:31001;
  }
upstream backend_nodes_ssl {
    server 10.118.6.35:32001;
    server 10.118.2.215:32001;
  }
server {
    listen 80;
    server_name backends.nodes;
     location / {
       proxy_pass https://backend_nodes;
      }
   }
 server {
    listen 443;
    server_name backends.nodes.ssl;
     location / {
       proxy_pass https://backend_nodes_ssl;
      }
   }
}

Please suggest what to give for backend node ips

Update

Hey finally made it to work when I try with IP address from browser instead of DNS name -

https://10.118.6.35/hello-kenzan <- this working now https://myservice.myorg.com/hello-kenzan <- this not working by giving nginx error page temporarily unavailable.

But https://myservice.myorg.com <- works by taking to welcome to nginx index page.

This is my modified nginx.conf -

 http {
           ssl_certificate ...
            ....
            ....

server {
       listen     80;
       server_name ip-10.118-6-35.ec2.internal;
       root /usr/share/nginx/html;

       include /etc/nginx/default.d/*.conf;

       location / {
       }
       location /hello-kenzan {
           proxy_pass https://backend_nodes;
          }
       error_page 404 /404.html;
          location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
          location = /50x.html {
        }
    }
      server {
       listen     443 SSL;
       server_name ip-10.118-6-35.ec2.internal;
       root /usr/share/nginx/html;
       ssl_certificate ...
       ...
       ...
       include /etc/nginx/default.d/*.conf;

       location / {
       }
       location /hello-kenzan {
           proxy_pass https://backend_nodes_ssl;
       }
       error_page 404 /404.html;
          location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
          location = /50x.html {
        }
    }
    upstream backend_nodes {
        server 10.96.88.237:80
      }
    upstream backend_nodes_ssl {
        server 10.96.88.237:443
      }

  }

Any thoughts??

-- Gopi
kubernetes
kubernetes-ingress
nginx
nginx-ingress
nginx-reverse-proxy

1 Answer

2/7/2019

while you are trying with master IP and node Ip is absolutely wrong with the approach of nginx ingress controller. when you add the ingress nginx controller it make load balancer behind (if using aws, digital ocean you check that load balacer in console of it).

you have to use the load balancer ip rather then using ip of node and master ip. 

starting nginx ingress controller

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

for more info visit this if any query add comment :

https://knowihave.blogspot.com/2019/02/how-to-set-up-nginx-ingress-with-cert.html

here at last it's installing cert manager you can remove that part other all thing is easy and simple.

-- Harsh Manvar
Source: StackOverflow