dhcp agent用来给一个网络提供DHCP服务。网络的IP地址可以再创建subnet时指定。
dhcp agent启动命令dhcp_agent.py,启动是提供neutron.conf和dhcp_agent.ini配置文件。
重要的配置项
interface_driver ,dhcp agent使用interface_driver来创建tap设备。
dhcp_driver,实现dhcp服务的代码,默认配置是neutron.agent.linux.dhcp.Dnsmasq。dhcp agent默认使用dnsmasq来实现dhcp服务。
dhcp_agent_manager, RPC服务的manager,默认是neutron.agent.dhcp_agent.DhcpAgentWithStateReport
dhcp agent功能
主要有三个任务:
1)报告状态。
2)处理RPC API。
3)启动dhcp服务
1)报告状态
self.heartbeat = loopingcall.FixedIntervalLoopingCall(
self._report_state)
self.heartbeat.start(interval=report_interval)
2)处理RPC API
RPC API处理代码在DhcpAgent中。dhcp agent提供了哪些RPC API可以查看它提供的client来查看。
client代码位于dhcp_rpc_agent_api.py
DhcpAgentNotifyAPI
"""API for plugin to notify DHCP agent."""
主要有:
VALID_METHOD_NAMES = ['network.create.end',
'network.update.end',
'network.delete.end',
'subnet.create.end',
'subnet.update.end',
'subnet.delete.end',
'port.create.end',
'port.update.end',
'port.delete.end']
dnsmasq如何分配IP地址?
通过2个参数文件来分配:
--addn-hosts
-dhcp-hostsfile
dhcp agent会生成这两个文件。其中一个根据mac地址给虚拟分配IP,另一个根据hosname分配。具体可参考dnsmasq使用。
这两个文件如何更新?如有新的虚拟机创建时
dhcp agent会调用dhcp_driver.reload_allocations来更新配置文件。reload_allocations会根据新网络配置重新生成配置文件,具体参看代码。
dhcp agent会在收到如下4种消息时调用reload_allocations
port_update_end
port_delete_end
subnet_update_end
subnet_delete_end
在收到network_create_end后,dhcp agent会在启动一个dhcp(dnsmasq)进程服务这个新网络。dhcp agent则由dhcp agent schduler选择。见后文。
上述消息何时发出?
通知消息在neturon rest API的前端实现中发出:neutron.api.v2.base.py
Controller
notifier_method = self._resource + '.create.end'
notifier_method = self._resource + '.delete.end'
notifier_method = self._resource + '.update.end'
可以看到针对每种resource(network, subnet, port),都会有相应的消息发出。dhcp agent根据这些消息来决定何时重新加载dnsmasp配置文件。
还有用来实现dhcp agent scheduler的API
network_removed_from_agent
network_added_to_agent
agent_updated
针对dhcp agent scheduler有如操作命令(在python-neutronclient中):
neutron dhcp-agent-list-hosting-net List DHCP agents hosting a network.
neutron dhcp-agent-network-add Add a network to a DHCP agent.
neutron dhcp-agent-network-remove Remove a network from a DHCP agent.
dhcp agent scheduler
通过dhcp agent scheduler,系统中可以部署多个dhcp agent:
1)增加可用性(HA, high availability),避免单点失败(SOF, single point of failure)
2)增加性能,多个dhcp agent可以安装在多台机器上,同时服务。
如何调度dhcp agent
调度算法通过network_scheduler_driver配置,默认是neutron.scheduler.dhcp_agent_scheduler.ChanceScheduler
class ChanceScheduler(object):
"""Allocate a DHCP agent for a network in a random way.
More sophisticated scheduler (similar to filter scheduler in nova?)
can be introduced later.
"""
可以看出,这个实现采用了随机分配算法。
如何调用dhcp agent scheduler
通过neutron.api.rpc.agentnotifiers.dhcp_rpc_agent_api.py中
def notify(self, context, data, method_name): 发送消息时,会调用
self._notify_agents,有代码
schedule_required = method == 'port_create_end'
if schedule_required:
agents = self._schedule_network(admin_ctx, network, agents)
可以看到当系统中有新的port创建后,会调用dhcp agent scheduler分配dhcp agent。
3)启动dhcp服务
代码逻辑在def run(self)中
def after_start(self):
self.run()
LOG.info(_("DHCP agent started"))
after_start在manager中被调用。
def run(self):
"""Activate the DHCP agent."""
self.sync_state()
self.periodic_resync()
sync_state()
根据系统中的网络配置,启动dhcp服务器进程(dnsmasq)。sync_state()在dhcp agent启动后运行一次。
periodic_resync
周期执行。
_periodic_resync_helper:高函数周期性调用sync_state()
dhcp agent会缓存一些网路的信息,通过该任务和neutron同步网络信息,更新本地缓存。
创建port, create_port
系统会分配一个MAC和IP地址给这个port(也可以由用户选定IP地址)
代码位于neutron.neutron.db.db_base_plugin_v2.py
mac_address = NeutronDbPluginV2._generate_mac
ips = self._allocate_ips_for_port(context, network, port)
neutron的各种插件实现(core plugin or service plugin)都继承于db包下的对象,这些object实现了对相应资源数据模型的操作。