Kubernetes nodeport load balancing with nginx
wordpress export detail historical reference can be deleted in future
title: 'Kubernetes NodePort Load Balancing with nginx'
date: '2021-09-15T10:35:02-05:00'
status: publish
permalink: /kubernetes-nodeport-load-balancing-with-nginx
author: admin
excerpt: ''
type: post
id: xxxx
category:
- 'Kubernetes'
tag: ['kubernetes','nginx']
post_format: []
Kubernetes NodePort Load Balancing with nginx
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;
}
}
}