Kubernetes集群NodePort服务无法全节点访问的排查请求
首先,你的理解完全正确——NodePort类型的服务确实应该允许从集群内任意节点的对应端口访问,所以当前的异常肯定是集群配置层面的问题。结合你提供的信息,我整理了以下逐步诊断的建议:
先确认跨节点Pod的连通性
NodePort服务的流量最终要转发到Pod上,如果跨节点的Pod之间无法通信,那其他节点的NodePort自然无法访问。你可以这么做:- 先获取Jira Pod的IP:
kubectl get pods -n wittlesouth -o wide - 在nuc1或nuc2上启动一个临时Pod测试连通性:
kubectl run -it --rm busybox --image=busybox:1.28 --namespace=default - 在busybox里执行
telnet <Jira-Pod-IP> 8082或者ping <Jira-Pod-IP>,如果连不通,那问题出在Calico网络的跨节点通信上,这是最可能的根因。
- 先获取Jira Pod的IP:
验证Calico网段与kubeadm配置是否匹配
你初始化集群时指定了--pod-network-cidr=10.5.0.0/16,但Calico默认的Pod网段是192.168.0.0/16,如果修改Calico配置时没改对,会直接导致跨节点Pod无法通信。
查看Calico的配置:kubectl get configmap calico-config -n kube-system -o yaml检查
cidr字段是否为10.5.0.0/16,如果不一致,需要修改Calico的配置并重启相关Pod。检查节点上的iptables转发规则
你提到已经生成了iptables规则,但需要确认规则是否正确指向了服务的ClusterIP。在无法访问的节点(比如nuc1)上执行:iptables-save | grep 32760应该能看到两条关键规则:一条标记流量,另一条将流量转发到对应服务的iptables链(比如
KUBE-SVC-XXXXXXXXX)。接着再查这个服务链的规则:iptables-save | grep KUBE-SVC-XXXXXXXXX确认是否有DNAT规则指向Jira Pod的IP和端口。如果规则缺失或错误,可能是kube-proxy没有正确同步规则。
查看kube-proxy的运行日志
kube-proxy负责维护NodePort的iptables规则,日志里可能会有同步失败的信息。在无法访问的节点上,执行:# 如果kube-proxy是systemd管理的 journalctl -u kube-proxy # 或者通过kubectl查看Pod日志 kubectl logs kube-proxy-$(kubectl get pods -n kube-system | grep kube-proxy | awk '{print $1}') -n kube-system检查是否有关于服务同步、iptables操作失败的错误信息。
排查节点防火墙/安全组
即使iptables规则正确,节点本身的防火墙(比如ufw、firewalld)可能会阻止NodePort的入站流量,或者Calico需要的BGP端口(179)被拦截。执行以下命令检查:# 检查ufw状态 ufw status # 或者firewalld firewall-cmd --list-all确保NodePort范围(默认30000-32767)的TCP流量被允许,同时节点间的179端口(Calico BGP通信)也开放。
临时排除HostPort的干扰
你的Jira Pod设置了HostPort 8082,虽然理论上HostPort不会影响NodePort的正常工作,但可以临时去掉Pod的HostPort配置,重新部署后测试NodePort是否能在其他节点访问,排除HostPort带来的冲突。
如果跨节点Pod连通性有问题,那优先解决Calico的网段配置和跨节点通信问题,这是NodePort失效的核心原因。
内容的提问来源于stack exchange,提问作者E. Wittle

