已暴露K8s NodePort服务仍无法通过外部IP访问Nginx
无法通过30602端口访问Kubernetes部署的Nginx服务器
环境信息
- 操作系统: Ubuntu 22
已排查内容
防火墙检查(ufw)
admin@tst-server:~$ sudo ufw status verbose Status: inactive
端口监听检查(netstat)
admin@tst-server:~$ netstat -an | grep 22 | grep -i listen tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN unix 2 [ ACC ] STREAM LISTENING 354787 /run/containerd/s/9a866c6ea3a4fe1976aaed0884400cd59228d43776774cc3fad2d0b9a7c2ed7b unix 2 [ ACC ] STREAM LISTENING 21722 /run/systemd/private admin@tst-server:~$ netstat -an | grep 30602 | grep -i listen # 无输出,30602端口未被监听
Kubernetes部署操作
创建Deployment
kubectl create deployment nginx --image=nginx kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE myapp 2/2 2 2 8d nginx 1/1 1 1 9m50s
创建NodePort Service
kubectl create service nodeport nginx --tcp=80:80 kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d nginx NodePort 10.109.112.116 <none> 80:30602/TCP 10m
访问测试
admin@tst-server:~$ hostname tst-server.com admin@tst-server:~$ curl tst-server.com:30602 curl: (7) Failed to connect to tst-server.com port 30602 after 10 ms: Connection refused
解决方案步骤
1. 检查kube-proxy运行状态
NodePort的流量转发依赖kube-proxy,先确认它是否正常:
kubectl get pods -n kube-system | grep kube-proxy
若状态非Running,重启组件:
kubectl rollout restart daemonset kube-proxy -n kube-system
2. 用ss工具排查端口监听
netstat可能遗漏部分监听信息,用ss查看30602端口的监听详情:
ss -tulpn | grep 30602
如果输出显示仅监听127.0.0.1或集群内部IP,需确认kube-proxy的模式(iptables/ipvs)配置,单节点集群要确保监听范围未被限制。
3. 验证Nginx Pod本身可用性
先确认Pod能正常提供服务:
# 获取Nginx Pod名称 POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}') # 测试Pod内部访问 kubectl exec -it $POD_NAME -- curl localhost:80
若返回Nginx默认页面,说明Pod正常,问题出在Service转发环节。
4. 检查iptables规则(iptables模式下)
如果kube-proxy使用iptables模式,检查是否生成了对应30602端口的转发规则:
sudo iptables-save | grep 30602
若无相关规则,重启kube-proxy后再次检查。
5. 确认节点网络配置
- 检查IP转发是否开启:
sudo sysctl net.ipv4.ip_forward
若输出为net.ipv4.ip_forward = 0,开启并永久生效:
sudo sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
- 检查是否有其他防火墙工具运行:
sudo systemctl status firewalld
若运行,关闭服务或添加30602端口允许规则。
6. 重新创建NodePort Service
以上步骤无效时,删除并重新创建Service,指定端口确保一致性:
kubectl delete svc nginx kubectl create service nodeport nginx --tcp=80:80 --node-port=30602
内容的提问来源于stack exchange,提问作者Nital
相关产品推荐
相关产品推荐

