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

VirtualBox Kubernetes集群无法通过ClusterIP/NodePort访问服务求助

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 flanneld
    
    确保所有服务都是active (running)状态,没有报错日志。
  • 检查Pod和副本控制器的健康状态:
    kubectl get pods,rc
    
    确认foo的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
    

三、网络组件与路由排查

  1. Flannel网络连通性验证:
    在主节点和每个工作节点上,ping其他节点的Pod网段(Flannel默认是10.244.0.0/16,每个节点分配一个子网段),确认跨节点Pod能互相通信。如果ping不通,检查Flannel的配置文件/etc/kubernetes/flannel/subnet.env,确认每个节点的网段正确,且Flannel服务没有报错。

  2. 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
    
  3. 内核参数永久生效验证:
    你临时设置了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端口的流量:
    kubectl exec -it <Pod名称> -- tcpdump -i any port 8080 -vv
    
    确认是否有来自Service的流量到达Pod内部。

内容的提问来源于stack exchange,提问作者CppNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:09