1 Neutron-dhcp-agent
NEUTRONDHCP为租户网络提供DHCP服务,即IP地址动态分配,另外还会提供metadata请求服务。根据整个DHCP处理的流程,DHCP模块主要由DHCP agent scheduler、DHCP agent、DHCP driver构成:
DHCP agent scheduler:负责DHCP agent与network的调度
DHCP agent:为租户网络提供DHCP的功能,提供metadatarequest服务。
DHCP driver:用于管理DHCPserver,目前环境中是采用的dnsmasq。
整个DHCP处理的流程架构图如下:
对应架构图中数字,有以下几个操作:
1.当dashboard上执行network/subnet/port的操作时,会调用neutron-api通知CorePlugin(如linux bridge plugin,ovs plugin等),创建相应虚拟network/subnet/port。
2.agentmanagement/agent scheduler里面会通过调度算法调度DHCP agent
3.network/subnet/port操作会发送rpc请求到DHCP agent。
4.agentschedulerdb发送rpc请求到DHCP agent。
5. DHCP agent通过DhcpPluginApi发送rpc请求到coreplugin,操作相应的数据库。
6. DHCP agent调用dhcpdriver实现DHCP server的管理。
2 DHCP agent scheduler
2.1 DHCP agent scheduler调度算法介绍
通过DHCP agent scheduler,系统中可以部署多个dhcp agent,增加可用性(HA, highavailability),避免单点失败(SOF,single point of failure);多个dhcp agent可以安装在多台机器上,同时服务。
DHCP agent的调度算法可以在/etc/nentron/neutron.conf文件中设置,默认设置是neutron.scheduler.dhcp_agent_scheduler.ChanceScheduler,这个实现是采用了随机分配算法。另外还有一种调度算法是根据agent的权重,进行负载均衡。
network_scheduler_driver = neutron.scheduler.dhcp_agent_scheduler.WeightScheduler |
调度算法通过network_scheduler_driver的实现在neutron/scheduler/dhcp_agent_scheduler.py。
系统默认使用的是随机分配算法,下面是DHCP agent的随机调度算法部分代码:
#neutron/scheduler/base_scheduler.py
class BaseChanceScheduler(BaseScheduler): """Choose agents randomly.""" def __init__(self, resource_filter): self.resource_filter = resource_filter def select(self, plugin, context, resource_hostable_agents, resource_hosted_agents, num_agents_needed): chosen_agents = random.sample(resource_hostable_agents, num_agents_needed) return chosen_agents
2.2 DHCP agent schedul调用DHCP agent过程
根据agent的权重调度的方法,是比较常用的方法,有利于负载均衡。所以本节以WeightScheduler为例,分析一个网络使用一个DHCP agent的情况,是如何调度的。目前环境中在controller上和computer分别安装一个DHCP agent,并把DHCP agent调度算法设置成按权重调度。
network_scheduler_driver = neutron.scheduler.dhcp_agent_scheduler.WeightScheduler |
#neutron/scheduler/base_scheduler.py class BaseWeightScheduler(BaseScheduler): """Choose agents randomly.""" def __init__(self, resource_filter): self.resource_filter = resource_filter def select(self, plugin, context, resource_hostable_agents, resource_hosted_agents, num_agents_needed): chosen_agents = sorted(resource_hostable_agents, key=attrgetter('load'))[0:num_agents_needed] return chosen_agents
|
调度算法的代码如下:在neutron/scheduler/dhcp_agent_scheduler.py:BaseWeightScheduler:select处设置pdb断点查看调用栈如下:
根据调用栈看下首先schedule函数的调度过程,代码如下。首先从所有的DHCP agents里面通过self.resource_filter.filter_agent函数选出可供使用的DHCP agent,下面分别介绍该函数和self.select函数。
#neutron/scheduler/base_scheduler.py def schedule(self, plugin, context, resource): """Select and bind agents to a given resource.""" if not self.resource_filter: return # filter the agents that can host the resource filtered_agents_dict = self.resource_filter.filter_agents( plugin, context, resource) num_agents = filtered_agents_dict['n_agents'] hostable_agents = filtered_agents_dict['hostable_agents'] hosted_agents = filtered_agents_dict['hosted_agents'] chosen_agents = self.select(plugin, context, hostable_agents, hosted_agents, num_agents) # bind the resource to the agents self.resource_filter.bind(context, chosen_agents, resource['id']) return chosen_agents |
self.resource_filter.filter_agent的返回值是一个字典,字典有3个key值。代码如下:
#neutron/scheduler/dhcp_agent_scheduler.py def filter_agents(self, plugin, context, network): """Return the agents that can host the network. This function returns a dictionary which has 3 keys. n_agents: The number of agents should be scheduled. If n_agents=0, all networks are already scheduled or no more agent can host the network. hostable_agents: A list of agents which can host the network. hosted_agents: A list of agents which already hosts the network. """ agents_dict = self._get_network_hostable_dhcp_agents( plugin, context, network) if not agents_dict['hostable_agents'] or agents_dict['n_agents'] <= 0: return { 'n_agents': 0, 'hostable_agents': [], 'hosted_agents': agents_dict['hosted_agents']} return agents_dict |
第一个KEY 'n_agents'代表需要调度几个dhcpagents,默认是一个。这个可以修改配置文件进行修改:
dhcp_agents_per_network = 1 |
第二个KEY'hostable_agents'代表可以使用的DHCP agent,这里面记录着每个agent的详细信息,如下:
<neutron.db.agents_db.Agent[objectat 56fd5d0] {id=u'21ea8426-5e68-4f83-abd6-3451e426511e', agent_type=u'DHCP agent',binary=u'neutron-dhcp-agent', topic=u'dhcp_agent', host=u'computer35',availability_zone=u'nova', admin_state_up=True,created_at=datetime.datetime(2016, 10, 19, 7, 33, 14),started_at=datetime.datetime(2016, 10, 19, 7, 33, 14), heartbeat_timestamp=datetime.datetime(2016,10, 19, 8, 58, 32), description=None, configurations=u'{"subnets": 2,"dhcp_lease_duration": 86400, "dhcp_driver":"n