I have 1 master and 2 worker nodes. There is 1 service running on 1 node and a similar service is running on the other node. Both of them are of NodePort type. How do I forward http requests coming to the pod of first service to a pod of second service?
I have tried using these iptable rules on the first worker node:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport <nodeport-of-service1> -j DNAT --to <public IP of worker2>:<nodeport-of-service2> iptables -t nat -A POSTROUTING -p tcp -d <public IP of worker2> --dport <nodeport of service2> -j MASQUERADE
but it doesn't seem to work. eth0
is the WAN interface on the worker-1.
Any idea how this can be done?
In the comments, @VonC gave you a pretty good link with the explanation about networking.
I just want to add one point to that topic.
The rules which you tried to add are pretty similar to rules which Kube-proxy
adds to the iptables
when you create a Service
inside a cluster.
If you create a Service with NodePort
type instead of exposing the port of your Pod, you will get exactly what you need: each connection to the NodePort
of the service will be forwarded to the right pod with round-robin load balancing.
That is from the official documentation:
For each
Service
, kube-proxy installs iptables rules which capture traffic to the Service’s clusterIP (which is virtual) and Port and redirects that traffic to one of the Service’s backend sets. For each Endpoints object, it installs iptables rules which select a backend Pod. By default, the choice of backend is random.
It will always work like that, but if you have a service with NodePort
type, kube-proxy will create an additional rule which will forward requests from the selected port on nodes to the Service's clusterIP.