Kubernetes--网络原理路由

一、路由

    Linux系统包含一个完整的路由功能。当IP层处理数据发送或者转发时,会使用路由表来决定发往哪里。在通常情况下,如果主机与目的主机直接相连,那么主机可以直接发送IP报文到目的主机。例如:通过点对点的链接或网络共享,如果主机与目的主机没有直接相连,那么主机将IP报文发送给默认的路由器,然后路由器来决定往哪里发送报文。

    路由功能由IP层维护一张路由表来实现。当主机接收到数据报文时,它用此表来决策接下来应该做什么操作。当从网络侧接收到的数据报文时,IP层首先会检查报文中目的的IP地址是否与主机自身的IP地址相同。如果数据报文中的目的IP地址是主机的IP地址,那么将报文传输到传输层相应协议中。如果报文中目的IP地址不是主机自身的地址,并且主机配置了路由功能,那么报文将会被转发,否则,报文将会被丢弃。

    路由表中的数据一般是以条目形式存在。一个典型的路由表通常包含以下主要条目项:

    (1) 目的的IP地址: 此字段表示目标的IP地址。如果这个IP地址可以是某主机的地址,也可以是一个网络地址。如果这个地址表示某主机的地址,那么它的主机ID将被标记为非零;如果这个条目包含的是一个网络地址,那么它的主机ID将被标记为零。

    (2)下一个路由器的IP地址:这里采用“下一个”的说法,是因为下一个路由器并不总是最终的目的路由器,它很可能是一个中间路由器。条目给出的下一个路由器的地址用来转发在相应的接口接收到IP数据报文。

   (3)标志:这个字段提供了另一组重要信息,例如,目的IP地址是一个主机地址还是一个网络地址。此外,从标志中可以得知下一个路由器是真实路由器还是一个直接相连的接口。

   (4)网络接口范围:为一些数据报文的网卡接口规范,该规范将与报文一起被转发。

     在通过路由表转发时,如果任何条目的第1个字段完全匹配目的IP地址(主机)或部分匹配条目的IP地址(网络),它将指示下一个路由器的IP地址。这个是一个重要信息,因为这些信息直接告诉主机(具备路由功能)数据包应该被转发到哪个路由器。而条目中的所有其它字段将提供更多的辅助信息来为路由转发做决定。

    如果没有找到 一个完全匹配的IP,就接着搜索匹配的网络ID。如果找到,那么该数据报文会被转发到指定的路由器上。可以看出,网络上的所有主机都是通过这个路由表中的单个(这个)条目进行管理。

    如果上述两个条件都不匹配,那么该数据报文将被转发到一个默认的路由器上。

    如果上述步骤都失败,默认路由器也不存在,那么该数据报文最终无法被转发。任何无法投递的数据报文都将产生一个ICMP主机不可达或ICMP网络不可达的错误,并将此错误返回给生成此数据报文的应用程序。

 二、路由表创建

      Linux的路由表至少包括两个表(当启用策略时还会有其它表),一个是LOCAL,一个是MAIN。在LOCAL表中会包含本地设备地址。LOCAL路由表是在配置网络设备地址时自动创建的。   LOCAL表用于供Linux协议栈识别本地地址,以及进行本地各个不同网络接口之间的数据转发。

ip route show table local type local #查看LOCAL路由表

Kubernetes--网络原理路由_第1张图片

    MAIN表用于各类网络IP地址转发。它的建立即可以使用静态配置生成,也可以使用动态路由发现协议生成。动态路由发现协议一般使用组播功能来通过发送路由发现数据,动态的交换和获取网络网络路由信息,并更新到路由表中。

     Linux下支持路由发现协议的开源协议,常用的有Quagga、Zebra等。Kubernetes的利用Quagga动态容器路由发现的机制实现Kubernetes的网络组网。

ip route list #ip 路由表查看

[root@fangren-clouddev ~]# ip route list
default via 192.168.1.1 dev eth0 proto dhcp metric 100   
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1    #源地址10.244.0.1,目标地址在10.244.0.0/24 网段的数据包都将通过cni0接口发出
169.254.169.254 via 192.168.1.1 dev eth0 proto dhcp metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-165afb888ba8 proto kernel scope link src 172.18.0.1
172.19.0.0/16 dev br-4ad4480ec9cb proto kernel scope link src 172.19.0.1
172.23.0.0/16 dev br-34cec38a2c3f proto kernel scope link src 172.23.0.1 linkdown
188.188.0.0/16 dev testbr0 proto kernel scope link src 188.188.188.0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.7 metric 100  #192.168.1.7 原地址(本机),目标地址在192.168.1.0/24网段的数据包都将通过eth0接口发出

  Netstat-rn查看路由表

netstat -rn #查看路由表

[root@fangren-clouddev ~]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0          #标志是G说明网络接口连接的是网关(需要通过外部主机Gateway来转递封包),否则接口直接连接的主机
10.244.0.0      0.0.0.0         255.255.255.0   U         0 0          0 cni0          #标志U说明是可达路由
169.254.169.254 192.168.1.1     255.255.255.255 UGH       0 0          0 eth0          #H表示目标是一部主机(IP)而不是网域
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-165afb888ba8  #直接连接的主机,没有表示G
172.19.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-4ad4480ec9cb  #直接连接的主机,没有表示G
172.23.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-34cec38a2c3f #直接连接的主机,没有表示G
188.188.0.0     0.0.0.0         255.255.0.0     U         0 0          0 testbr0         #直接连接的主机,没有表示G
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0

你可能感兴趣的:(Kubernetes,网络,kubernetes,网络协议)