You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已暴露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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:28:06