无法从Kubernetes主节点访问Pod NodePort服务,寻求技术支持
问题描述
虚拟机环境中全新部署Kubernetes集群,包含2台CentOS Stream 8节点:
- 主节点:master-server26(IP:192.168.1.26)
- 工作节点:worker-server27(IP:192.168.1.27)
网络配置为桥接模式,Kubernetes版本v1.21.9,Docker版本23.0.0。
部署了Node.js Hello World应用Pod,对应Service为NodePort类型,nodePort设为31500。当前可通过http://192.168.1.27:31500/访问服务,但无法通过http://192.168.1.26:31500/访问。已确认:
- Kubernetes网络组件无重启记录
- kube-proxy Pod无报错信息
现有资源状态
Pod列表
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES default helloworldnodejsapp-deployment-86966cfcc5-85dgm 1/1 Running 0 17m 10.244.1.2 worker-server27 <none> <none> kube-flannel kube-flannel-ds-226w7 1/1 Running 0 24m 192.168.1.27 worker-server27 <none> <none> kube-flannel kube-flannel-ds-4cdhn 1/1 Running 0 63m 192.168.1.26 master-server26 <none> <none> kube-system coredns-558bd4d5db-ht6sp 1/1 Running 0 63m 10.244.0.3 master-server26 <none> <none> kube-system coredns-558bd4d5db-wq774 1/1 Running 0 63m 10.244.0.2 master-server26 <none> <none> kube-system etcd-master-server26 1/1 Running 0 64m 192.168.1.26 master-server26 <none> <none> kube-system kube-apiserver-master-server26 1/1 Running 0 64m 192.168.1.26 master-server26 <none> <none> kube-system kube-controller-manager-master-server26 1/1 Running 0 64m 192.168.1.26 master-server26 <none> <none> kube-system kube-proxy-ftsmp 1/1 Running 0 63m 192.168.1.26 master-server26 <none> <none> kube-system kube-proxy-xhccg 1/1 Running 0 24m 192.168.1.27 worker-server27 <none> <none> kube-system kube-scheduler-master-server26 1/1 Running 0 64m 192.168.1.26 master-server26 <none> <none>
节点详情
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master-server26 Ready control-plane,master 70m v1.21.9 192.168.1.26 <none> CentOS Stream 8 4.18.0-448.el8.x86_64 docker://23.0.0 worker-server27 Ready <none> 30m v1.21.9 192.168.1.27 <none> CentOS Stream 8 4.18.0-448.el8.x86_64 docker://23.0.0
Docker配置(/etc/docker/daemon.json)
{ "exec-opts": ["native.cgroupdriver=systemd"],"dns": ["8.8.8.8", "8.8.4.4","192.168.1.1"] }
应用部署YAML
apiVersion: apps/v1 kind: Deployment metadata: name: helloworldnodejsapp-deployment labels: app: web spec: selector: matchLabels: app: web replicas: 1 strategy: type: RollingUpdate template: metadata: labels: app: web spec: containers: - name: helloworldnodejsapp image: "********:helloworldnodejs" ports: - containerPort: 8010 imagePullSecrets: - name: regcred --- apiVersion: v1 kind: Service metadata: name: helloworldnodejsapp-svc labels: app: web spec: type: NodePort selector: app: web ports: - port: 8010 targetPort: 8010 nodePort: 31500
排查与解决方案
1. 检查主节点防火墙规则
NodePort服务依赖kube-proxy在节点上监听端口,主节点大概率是防火墙未放行31500端口,或拦截了集群相关流量。在master-server26上执行:
# 临时放行31500端口并永久生效 firewall-cmd --add-port=31500/tcp --permanent firewall-cmd --reload # 同时确保Kubernetes集群必备端口已放行 firewall-cmd --add-port=6443/tcp --permanent firewall-cmd --add-port=2379-2380/tcp --permanent firewall-cmd --add-port=10250/tcp --permanent firewall-cmd --add-port=10255/tcp --permanent firewall-cmd --reload
2. 验证主节点kube-proxy转发规则
kube-proxy负责将NodePort流量转发到后端Pod,检查主节点的iptables/ipvs规则是否包含31500端口的转发:
# 查看iptables中31500相关规则 iptables-save | grep 31500 # 若kube-proxy使用ipvs模式,查看ipvs规则 ipvsadm -Ln | grep 31500
如果规则缺失,重启主节点的kube-proxy Pod:
kubectl delete pod kube-proxy-ftsmp -n kube-system
3. 测试主节点到Pod的网络连通性
在master-server26上直接访问Pod的IP(10.244.1.2:8010),验证基础网络是否正常:
curl 10.244.1.2:8010
若无法连通,检查flannel网络日志确认集群网络是否正常:
kubectl logs kube-flannel-ds-4cdhn -n kube-flannel
4. 检查主节点污点与调度配置(可选)
默认master节点会被打污点阻止普通Pod调度,但NodePort服务不需要Pod在master运行,不过若网络策略或路由存在异常,可临时去除污点测试:
# 去除污点 kubectl taint nodes master-server26 node-role.kubernetes.io/master- # 测试完成后恢复污点(如需) kubectl taint nodes master-server26 node-role.kubernetes.io/master=:NoSchedule
内容的提问来源于stack exchange,提问作者kaushal47
相关产品推荐
相关产品推荐

