Mostly this is done in a cloud environment where they have Kubernetes integrated with cloud load balancers and you expose kubernetes services as type LoadBalancer.
However I wanted to do this without cloud in my Virtualbox environment. Its not ideal and I wish nginx could add a port when using proxy_pass pointing to upstream.
My configuration is not ideal and does not scale well. I am using it in a POC and it is working so far so documenting for future reference.
NOTE I did not test if upstream is failing over but that is well documented for nginx so I trust it is working. You could of course change upstream mechanisms to round-robin, least-connected or ip-hash.
user www-data;worker_processes 4;worker_rlimit_nofile 40000;
events { worker_connections 8192;}
http { map $host $serverport { "hello.cluster01.local" "30000"; "web01.cluster01.local" "30001"; "web02.cluster01.local" "30002"; default "no_match"; }
upstream hello.cluster01.local-30000 { server 172.20.100.10:30000; server 172.20.100.11:30000; }
upstream web01.cluster01.local-30001 { server 172.20.100.10:30001; server 172.20.100.11:30001; }
upstream web02.cluster01.local-30002 { server 172.20.100.10:30002; server 172.20.100.11:30002; }
server { listen 80; server_name "~(.*).cluster01.local"; set $upstream $host-$serverport; location / { proxy_set_header X-Forwarded-For $remote_addr; # if not load balancing pointing to one node like below is fine #proxy_pass http://172.20.100.10:$np; # with upstream you can't add a port so I have an upstream per service #proxy_pass http://backend:$np; proxy_pass http://$upstream; proxy_set_header Host $host; } }}