dhcp是由dnsmasq进程来实现的,而dnsmasq进程由dhcp agent负责管理。一个dhcp agent可管理多个dnsmasq进程。
通常情况下一个租户网络会对应创建一个dnsmasq进程来充当该租户网络的dhcp server,为该网络的虚拟机动态分配IP地址信息。当然通过配置也可以让一个租户网络对应创建多个dnsmasq进程,即提供dhcp ha功能。
下面以一个租户网络只创建一个dnsmasq进程为例进行描述。通常由网络节点提供dhcp服务。dnsmasq进程是运行在独立命名空间里,因此每个租户网络的dnsmasq进程是相互隔离,互不干扰的。
如下图2所示,创建了两个租户网络,两个租户网络的dnsmasq进程分别在各自的命名空间提供dhcp server服务。命名空间与br-int桥通过veth pair连接,根据第1章的描述,在br-int桥上的每个端口都会分配一个内部VLAN ID,对于dhcp而言,也是一样的,如下图2中的tap1分配了内部VLAN ID=1,tap2分配了内部VLAN ID=3。命名空间中存在一个端口,该端口由neutron分配了一个IP地址,如下图2所示的10.0.1.2/24和10.0.2.2/24.
可以在网络节点上查看dhcp namespace的信息,如下面所示的在控制节点上执行(控制节点+网络节点)。
查看命名空间里面的接口信息如下:
从上面的截图可以看到在命名空间中的端口分配了dhcp server的IP地址。
查看dnsmasq进程,可以看见有两个,如下所示:
根据查看进行的信息可以看见dnsmasq进程的配置文件所在的目录,如选一个来看,如下所示(同时还可以看见mtu、租期过期时间等信息)
配置目录下有如下的文件:
下面展示了几个文件的内容。其中:
- host
该文件保存了每个IP+MAC的绑定信息,当前只有dhcp端口的信息,后面创建虚拟机时会将虚拟机的MAC+IP绑定信息也写入到这个文件。这样当虚拟机发送dhcp广播请求时通过匹配虚拟机的MAC地址来分配对应的IP地址。
- opts
保存了一些路由配置信息,如:默认路由。
- interface
记录了这个dhcp namespace里有哪些端口信息。
下面我们来分析下br-int上的流表,怎样通过流表匹配将虚拟机的dhcp请求及回应报文送入到相应的dhcp namespace。如下图所示:
虚拟机发出的dhcp报文通过隧道(图中的示例为VXLAN)到达br-tun桥,在这里我们暂时不分析br-tun桥上的流表,后面会有详细的介绍。在br-tun桥上会将vni转换成内部vlan id,例如VM1的流量会转换成vlan 1,vm2的流量会转换成vlan 3.这样送到br-int桥上的报文是带上了内部VLAN ID值。根据br-int流表的匹配(下图红色标注),最终匹配上table=60,执行NORMAL动作(该动作是执行传统二层转发,即根据br-int桥上的MAC+VLAN表(如下图4所示)进行转发),VM1的流量会被引导到dnsmasq1 namespace,VM2的流量会被引导到dnsmasq2 namespace。