Unable to access NGINX nodePort service in K8 cluster running on RPI
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
A NodePort service should let you reach a pod through http://NODE_IP:NODE_PORT, but on a Raspberry Pi Kubernetes cluster there are a few extra failure points. ARM image compatibility, lightweight distributions such as k3s, home-network firewalls, and incorrect node IP assumptions all show up more often on Pi clusters than on cloud VMs.
The right way to debug this is from the inside out: confirm the pod is healthy, confirm the service has endpoints, then confirm traffic can reach the node and that kube-proxy is publishing the port correctly.
Verify the Pod and Service First
Start by checking whether the NGINX pod is actually running and ready. A NodePort can exist even when there are no healthy endpoints behind it.
If the service shows no endpoints, the selector does not match the pod labels or the pod is not ready yet.
A working example looks like this:
If kubectl get endpoints nginx-nodeport is empty, fix that before looking at networking.
Test Reachability from Inside the Cluster
Before testing from your laptop or phone, test from inside the cluster. That tells you whether the application path works independently of the external network.
If those requests fail, the problem is not NodePort exposure. It is the pod, container port, or service selector.
If they succeed, move outward and test the node IP.
Use the Correct Node IP and Port
A common mistake is hitting the wrong address. NodePort listens on the node's network IP, not the cluster service IP. On a Raspberry Pi cluster, nodes may have multiple interfaces such as Ethernet, Wi-Fi, VPN, and internal overlay networking.
Check the node addresses:
Then test from another machine on the same network:
If you test from the same Raspberry Pi node, remember that some home-router setups or local firewall configurations behave differently for local versus remote traffic.
Check kube-proxy, Firewall, and CNI Behavior
NodePort depends on iptables or IPVS rules installed by kube-proxy. If that component is unhealthy, the service may exist in Kubernetes while the node never forwards packets.
Also inspect host firewall rules. On Ubuntu or Debian-based Pi nodes, ufw or raw iptables rules may block high ports.
On k3s, the networking stack is simplified, but the same core checks apply. If you use nftables or a custom CNI, verify those components are not dropping traffic before it reaches the service.
Make Sure the Image Runs on ARM
Raspberry Pi nodes are ARM devices, so an x86-only container image will fail or crash-loop. NGINX official images are generally multi-architecture, but custom images or sidecars may not be.
Check the pod status and logs:
If the pod is restarting or never becomes ready, the service may technically exist while there is nothing usable behind it.
When to Use LoadBalancer Instead
NodePort is good for debugging and small internal setups. For a cleaner Raspberry Pi homelab, consider MetalLB with a LoadBalancer service. That gives you a stable LAN IP and removes some of the friction of choosing the right node address.
Still, if NodePort does not work, do not skip the diagnosis. The same missing endpoints or broken network path will often affect LoadBalancer too.
Common Pitfalls
- Testing the service IP instead of the node IP.
NodePortis reached through the node address, not the ClusterIP. - Ignoring empty endpoints. A service with no matching ready pods cannot forward traffic.
- Using an image that is not compatible with ARM. On Raspberry Pi, architecture mismatches are a real failure mode.
- Forgetting host firewall rules on high ports such as
30080. Kubernetes objects do not automatically override OS-level filtering. - Assuming external access proves application health. Always test pod and service connectivity from inside the cluster first.
Summary
- Diagnose
NodePortissues from the inside out: pod, endpoints, node IP, then host networking. - Confirm the service selector matches a ready NGINX pod.
- Reach the service through
NODE_IP:NODE_PORT, not through the ClusterIP. - Check
kube-proxy, iptables, and firewall rules on Raspberry Pi nodes. - Verify the container image actually runs on ARM before chasing network problems.

