neutron提供DHCP服务的组件是DHCP agent。DHCP agent在网络节点上运行,默认通过dnsmasq实现dhcp功能。
what?
dhcp服务的配置文件是/etc/neutron/dhcp_agent.ini
,如下图所示:
- dhcp_driver - 定义使用dnsmasq实现DHCP
- interface_interface - 定义使用linux bridge连接dhcp服务
Example of interface_driver option for OVS based plugins(OVS, Ryu, NEC, NVP,
nterface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
Example of interface_driver option for LinuxBridge
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
当创建network并且在subnet上enable DHCP服务时,网络节点上的DHCP agent会启动一个dnsmasq进程为该network提供DHCP服务。
dnsmasq和network是一对一的关系,一个dnsmasq进程可以为同一个network中所有的enable dhcp的subnet提供服务。
如上图所示,DHCP agent启动时会为每个network创建一个目录放在
/var/lib/neutron/dhcp/
目录下用以存放相关配置文件。服务启动时会指定启动参数,我们来讨论下其中比较重要的几个启动参数。
-
--dhcp-hostfile - 存放DHCP host(instance)信息的文件,dnsmasq从该文件获取host的IP与MAC的对应关系。每一个host对应一个条目,信息来源于neutron数据库。
- --interface - 指定提供服务的interface,指定的interface为“ns-cfae36f3-7c”,说明该接口由namespace提供。
why?
我们来讨论一下为什么要使用namespace,首先来了解一下namespace的概念。
Linux Network Namespace 简介
在二层网络上,VLAN可以将一个物理交换机分割成几个独立的虚拟交换机。同样在三层网络上,linux network namespace可以将一个物理三层网络分割成几个独立的虚拟三层网络。
每个namespace都有自己独立的网络栈,包括route table,firewall rule, network interface device等。
为什么使用Linux Network Namespace
- Neutron 通过namespace为每个network提供独立的dhcp和路由服务,从而允许租户创建重叠的网络。如果没有namespace机制,网络就不能重叠,这显然就不能满足云计算的要求。
- 每个dnsmasq进程都位于独立的namespace中,命名为
qdhcp-<network-id>
- 宿主机本身也有一个namespace,叫root namespace,拥有所有物理和虚拟interface device。
- 新建的namespace默认只有一个loopback devic, 管理员可以将虚拟的interface(tap、bridge)添加到某个namespace中。
使用namespace带来的问题:
对于fla-net的dhcp tap设备,需要将其放到namespace中,但是这样tap设备将无法直接和root namespace中的bridge设备通讯。
neutron 使用veth pair来解决这个问题:
tap19a0ed3d-fe 与 ns-19a0ed3d-fe 就是一对 veth pair,它们将 qdhcp-f153b42f-c3a1-4b6c-8865-c09b5b2aa274 连接到 brqf153b42f-c3。
- 可以通过
ip netns exec <network-namespace-name> <command>
管理namespace。