针对 Kubernetes 容器网络的问题分析和排查,经常需要查看路由表。本文主要是分析 route 命令输出各项参数的含义,及其中经常出现的 0.0.0.0 的含义。

路由表

在容器网络为 Calico 的 kubernetes 集群机器上执行route -n命令输出如下:

1
2
3
4
5
6
7
8
9
[root@node03 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.161.16.200   0.0.0.0		    UG    100    0        0 eth0
10.161.16.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
10.244.113.128  10.161.16.194   255.255.255.192 UG    0      0        0 tunl0
10.244.186.192  0.0.0.0         255.255.255.192 U     0      0        0 * 
10.244.186.193  0.0.0.0         255.255.255.255 UH    0      0        0 cali687d9beb32a
......

各字段主要说明如下:

  • Destination:目标网络或目标主机
  • Gateway:网关,连接两个不同网络的设备。
  • Genmask:目的地址的子网掩码。255.255.255.255 表示目的主机,0.0.0.0 表示默认路由
  • Flags:标识 U 表示路由生效,G 表示网关,H 表示目标地址是一个主机。
  • Metric:到目标地址的跳数
  • Ref:路由被引用数
  • Use: 路由被查询次数
  • Iface:接口,去往目的地址所经出口

理解 0.0.0.0 地址

在 IPV4 地址中,0.0.0.0 通常表示未明确的、无效的目标。

在上面的情况中,目标地址为 0.0.0.0,表示没有明确制定的意思,即默认路由。路由匹配会按照掩码长度由长到短开始匹配。所以,一般默认路由的目标子网掩码为 0.0.0.0,表示最后才匹配的意思。同时 Flags 中的 G 标志,表示使用路由。

看上述代码块的第二条路由,网关中的 0.0.0.0,表示没有,无效的意思。即,本条路由不经网关。网关是从一个网络进入另一个网络的边缘设备。换句话说,命中网关是 0.0.0.0 的报文,它的目标是可能是同一网络下的其它目标地址。这时候走的是二层直连,需要发起 ARP 请求换取 MAC 地址进行发送。这条路由通常是在网卡上配置 IP 时候自动生成的。在网卡上每绑定一个 IP,就相应地生成一条这样的记录。可以看到本条路由的 Flags 并没有 G 标志。

第三条路由和第一条路由类似,当匹配到 10.244.113.128~10.244.113.191 网段区间的 IP,执行本条路由。经 tunl0 设备发往 10.161.16.194 网关(calico 场景下是另一个 kubernetes 工作节点)。

第五条路由,标志为 H,掩码是 255.255.255.255,表示目标地址是 10.244.186.193,直接发往 cali687d9beb32a,而这个设备的另一端是容器内的 eth0。这种情况也不需要网关,网关为 0.0.0.0。