neutron-DHCP-Agent代码分析

本文深入分析了Neutron DHCP Agent的运作机制,包括DHCP agent scheduler的调度算法,如随机分配和权重负载均衡。详细探讨了DHCP agent的启动流程,特别是DhcpDriver如何调用DNSmasq来创建DHCP服务。此外,还介绍了DNSmasq的配置和日志管理,以及虚机获取IP的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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/dhcp_agent_scheduler.py: 

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值