VirtualBox Kubernetes集群无法通过ClusterIP/NodePort访问服务求助
我来帮你一步步排查这个Kubernetes服务访问的问题,咱们从基础到深入梳理调试步骤:
一、先揪出最可能的核心问题:标签匹配错误
注意到你创建NodePort Service时用的selector: app: foo,但通过kubectl run foo --generator=run/v1创建的Pod,默认标签是run: foo而非app: foo!这会直接导致Service找不到对应的Pod,Endpoints为空,流量自然无法转发。
先验证这个点:
# 查看Pod的标签 kubectl get pods --show-labels
如果输出里的LABELS列是run=foo,那就是标签不匹配的问题,解决方法二选一:
# 方案1:修改已有的Service,匹配Pod的默认标签 kubectl patch svc foo-http -p '{"spec":{"selector":{"run":"foo"}}}' # 方案2:给Pod添加`app=foo`的标签,适配Service的selector kubectl label pod <你的Pod名称> app=foo
修改后再用kubectl describe svc foo-http查看Endpoints字段,确认已经关联到Pod的IP和8080端口。
二、基础状态验证(标签没问题后继续)
如果标签匹配正常,先确认核心组件和资源的运行状态:
- 检查所有节点的关键服务状态:
确保所有服务都是# 在每个节点执行 systemctl status kubelet kube-proxy flanneldactive (running)状态,没有报错日志。 - 检查Pod和副本控制器的健康状态:
确认kubectl get pods,rcfoo的Pod都是Running状态,READY为1/1,没有重启或异常事件。可以用kubectl describe pod <Pod名称>查看Pod的启动日志和事件,确认容器正常启动。 - 验证Pod内的端口监听:
进入Pod内部,确认应用确实在监听0.0.0.0:8080(如果只监听127.0.0.1,Service无法转发流量):kubectl exec -it <Pod名称> -- netstat -tulpn
三、网络组件与路由排查
Flannel网络连通性验证:
在主节点和每个工作节点上,ping其他节点的Pod网段(Flannel默认是10.244.0.0/16,每个节点分配一个子网段),确认跨节点Pod能互相通信。如果ping不通,检查Flannel的配置文件/etc/kubernetes/flannel/subnet.env,确认每个节点的网段正确,且Flannel服务没有报错。kube-proxy iptables规则检查:
kube-proxy负责将Service流量转发到Pod,它会生成对应的iptables规则。执行以下命令查看:iptables-save | grep foo-http应该能看到
KUBE-SVC-xxxx和KUBE-SEP-xxxx相关的规则,确认规则指向正确的Pod IP。如果没有这些规则,查看kube-proxy的日志排查同步问题:journalctl -u kube-proxy -f内核参数永久生效验证:
你临时设置了net.bridge.bridge-nf-call-iptables和net.bridge.bridge-nf-call-ip6tables,但要确保它们在所有节点上永久生效:# 查看当前值 sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables # 写入sysctl.conf永久生效 echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf sysctl -p
四、防火墙与端口放行检查
VirtualBox节点可能开启了firewalld或iptables,导致流量被拦截:
- 临时关闭防火墙测试:
如果关闭后能访问,说明是防火墙规则的问题,需要添加放行规则:systemctl stop firewalld # 或者清空iptables规则 iptables -F && iptables -t nat -F- 放行Flannel的VxLAN端口(默认8472)
- 放行ClusterIP的8081端口和NodePort的31123端口
五、流量追踪深度调试
如果以上步骤都没问题,用工具追踪流量走向:
- 在节点上抓Service端口的流量:
查看是否有数据包到达,以及是否有响应。# 抓ClusterIP 8081端口流量 tcpdump -i any port 8081 -vv # 抓NodePort 31123端口流量 tcpdump -i any port 31123 -vv - 在Pod上抓8080端口的流量:
确认是否有来自Service的流量到达Pod内部。kubectl exec -it <Pod名称> -- tcpdump -i any port 8080 -vv
内容的提问来源于stack exchange,提问作者CppNoob

