K8s 集群外通过路由直连 Pod 实战
默认情况下,K8s 集群内的 Pod 运行在独立的虚拟子网中,访问外部流量通常经过 NAT 转换。若需从集群外部直接访问 Pod,常规做法是 NodePort、HostPort 或 LoadBalancer。不过,还有一种更底层的方式:通过静态路由直连。
原理与前提
假设你的集群使用 Calico 作为 CNI 组件,它会在节点上创建 tunl0 隧道接口用于容器间通信。我们可以通过查看节点的路由表,获取每个节点所划分的 Pod 网段及对应的网关(即节点 IP)。
首先登录到任意一个 K8s 节点,执行以下命令查看路由信息:
route -n | grep tunl0
输出示例如下,这里可以看到 Pod 网段、下一跳网关以及出口设备:
10.233.119.0 10.21.21.74 255.255.255.192 UG 0 0 0 tunl0
10.233.55.64 10.21.21.76 255.255.255.192 UG 0 0 0 tunl0
10.233.183.64 10.21.21.75 255.255.255.192 UG 0 0 0 tunl0
这些规则告诉系统:如果要访问 10.233.x.x 网段的地址,请将数据包转发给对应的节点 IP。
配置客户端路由
关键步骤是将这些路由规则添加到客户端机器或路由器上。这样,当你在外部发起请求时,系统就知道该把包发给哪个 K8s 节点。
以 Linux 客户端为例,添加路由的命令格式为:
route add -net <Pod 网段> netmask <掩码> gw <节点 IP>
根据上面的查询结果,我们可以执行类似以下的命令(请替换为你实际环境中的 IP):
route add -net 10.233.55.64 netmask 255.255.255.192 gw 10.21.21.76
route add -net 10.233.119.0 netmask 255.255.255.192 gw 10.21.21.74
route add -net 10.233.183.64 netmask 255.255.255.192 gw 10.21.21.75
Windows 客户端注意事项
如果在 Windows 环境下操作,命令略有不同,且需要加上 -p 参数以确保重启后路由依然生效:
route add -p <Pod 网段> mask <掩码> <节点 IP>
例如:
route add -p 10.233.97.128 mask 255.255.255.192 192.168.1.225
route add -p 10.233.75.0 mask 255.255.255.192 192.168.1.226
注意:Windows 下通常需要管理员权限才能执行此命令,且具体网段和网关 IP 需根据你的实际集群规划填写。
验证连通性
配置完成后,我们需要在 K8s 中部署一个测试服务来验证网络是否通畅。
创建一个简单的 Nginx Deployment:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
template:
metadata:
labels:
app:

