NodePort的端口在宿主机上查不到?

目录标题

Cilium

在开启了 Cilium 作为 CNI / Service 代理后,NodePort 并不像 iptables/ipvs 那样由 kube-proxy 管理,而是全部通过 eBPF map 在内核里做转发。要查看 Cilium 下的 NodePort,常用几条命令:

  1. 查看所有服务及其对应的 ClusterIP/NodePort/LB IP 列表

    cilium service list
    

    这个命令会给出一个表格,里面有:

    • ID:Cilium 给每个 Service 分配的内部标识
    • Frontend:ClusterIP:Port、NodePort(0.0.0.0:NodePort)或外部 LB IP
    • Backends:对应的 Pod IP:Port
  2. 查看底层 eBPF LB 路由(相当于 “iptables -t nat”)

    cilium bpf lb list
    

    输出里,你可以看到所有 Service frontend(包括 NodePort)和它们的后端节点分布情况。

  3. 如果想直接看 eBPF map

    • 列出所有 map:

      bpftool map list
      
    • 找到与 Service LB 相关的 map(一般名字里带 cilium_lb4_*cilium_services_v4),然后:

      bpftool map dump name cilium_services_v4
      

      或者

      bpftool map dump pinned /sys/fs/bpf/tc/globals/cilium_services_v4
      

    这样可以看到 key(VIP、Port、Proto)到 value(Backend IDs)的映射。

  4. Kubernetes 原生视角(仅做配置核对)

    kubectl get svc -A -o wide
    

    或者

    kubectl describe svc my-service -n my-namespace
    

    这里能确认为 Service 分配了哪个 NodePort。


示例:
假设你有一个在 default 命名空间下叫 web 的 Service,NodePort 是 30080,可以这样做:

# 列出所有 Service,看 ID 和 Frontend
cilium service list | grep web

# 查看 eBPF LB 详情,确认 NodePort 30080 映射到哪些后端
cilium bpf lb list | grep 30080

通过上述命令,就能在 Cilium 的 eBPF 层面,准确看到 NodePort 的转发规则,以及它被转发到哪些 Pod 上。

在这里插入图片描述

在这里插入图片描述

kube-proxy

在 Kubernetes 的 NodePort 模式下,其实并没有一个进程在宿主机上“直接” listen 这个端口,所以用 ss/netstat 是看不到的。NodePort 的流量是通过 kube-proxy 在 netfilter(iptables/IPVS)层面做 DNAT/NAT 转发的,你要看的是那里的规则:

  1. iptables 模式下

    # 列出 nat 表中所有的 NodePort 转发规则
    iptables -t nat -L KUBE-SERVICES -n --line-numbers | grep <NodePort>
    

    或者更全一点:

    iptables -t nat -L -n | grep <NodePort>
    

    你会看到类似:

    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:30080 to:10.244.1.5:80
    

    这就说明所有到宿主机 30080 的 TCP 请求都会被转发到 Pod 的 IP:Port。

  2. IPVS 模式下(kube-proxy --proxy-mode=ipvs
    如果你的 kube-proxy 用的是 IPVS,就要用:

    ipvsadm -Ln | grep <NodePort>
    

    会看到类似:

    TCP  0.0.0.0:30080  rr
      -> 10.244.1.5:80        Masq    1      100%
    
  3. Kubernetes 原生命令
    如果你只是想快速确认哪个 NodePort 对应哪个 Service,也可以直接:

    kubectl get svc -A -o wide
    

    或者:

    kubectl describe svc my-service -n my-namespace
    

    里边都会列出 NodePort: <port>


小结:

  • ss/netstat 只看进程级别的 listening socket,NodePort 并不是某个进程 bind 的端口;
  • iptables-save/ipvsadm 能查看 kube-proxy 在内核层面设置的 DNAT/IPVS 规则;
  • kubectl get/describe svc 则是最高层面查看配置和映射。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值