Neutron DHCP-Agent问题分析定位(3)

Neutron DHCP-Agent 代码分析与故障排查
本文深入分析了Neutron DHCP-Agent的工作流程,包括dhcp port的绑定过程、DHCP-agent与plugin的同步机制、tap接口创建、日志分析及网络调度策略。通过对代码流程的解析,揭示了可能导致问题的环节,如网络状态同步失败和网络DHCP调度的条件。

作者:闫兴安

1.4   代码流程分析

1.4.1 dhcp port如何进行bind_port

plugin中,在创建port时会进行bind_port。所谓bind是指端口id、主机名、网络属性进行绑定。

其中网络属性包括:网络ID、网络类型、物理网络名称、网络segment-id。

bind_port的过程:

1)      按序遍历所有mech_driver,挨个进行bind_port。

2)      如果某个mech_driver报异常,记log,然后继续进行下一个mech driver的bind。

3)      如果某个mech_driver没有进行绑定,继续进行下一个mech driver的bind。

4)      只要有一个mech_driver bind成功,就返回。(ovs driver不支持多层bind)

5)      如果所有的mech_driver都绑定失败,记vif_type为binding_failed。

 

我们的环境中mech_driver只有openvswitch,所以来看下ovs driver的binding:

1)      遍历所有agent,如果是down的,不进行绑定,记Log;如果是active的,执行下面步骤。

2)      检查agent的上报过来的配置。包括:网络类型是否在agent的配置文件中配置;如果是flat和vlan类型的网络,还检查物理网络名称是否在agent的配置文件中配置;

3)      如果上述检查不通过,不进行绑定;如果检查通过,进行绑定。

4)      只要有一个agent绑定成功,就返回,表示ovs driver绑定成功。

5)      如果所有的agent都没有进行绑定,就会出现binding_failed。

 

1.4.2 dhcp-agent与plugin的同步

dhcp-agent主动同步过程:

1)      启动时,首先从namespace名字中获取网络信息,记录到cache(内存)中。后续从plugin获取的所有信息都记录在cache里。之后进行同步时依据的就是这个cache。

2)  &n

### 解决 Neutron Plugin Install Agent Packages 命令未找到的问题 在 DevStack 环境中,当出现 `neutron_plugin_install_agent_packages: command not found` 的错误时,通常表明脚本路径配置不正确或相关函数未被加载。以下是详细的解决方案: #### 检查函数定义 确认 `neutron_plugin_install_agent_packages` 函数是否存在于 DevStack 脚本中。可以通过以下命令搜索该函数的定义: ```bash grep -r "neutron_plugin_install_agent_packages" /opt/stack/devstack/* ``` 如果未找到相关定义,则可能是脚本未正确加载或函数名称发生了更改。需要手动检查 `/opt/stack/devstack/lib/neutron` 文件中的内容,确保其包含正确的函数定义[^1]。 #### 手动安装 Neutron Agent 包 如果上述命令不可用,可以手动安装所需的 Neutron Agent 包。例如,在基于 Ubuntu 的系统上,运行以下命令安装必要的组件: ```bash sudo apt-get update sudo apt-get install -y neutron-common neutron-dhcp-agent neutron-l3-agent neutron-metadata-agent neutron-openvswitch-agent ``` #### 配置 Neutron 数据库支持 确保 Neutron 数据库已正确初始化。按照以下步骤操作[^2]: ```sql CREATE DATABASE neutron default character set utf8; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'openstack'; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'openstack'; ``` #### 修改 Neutron 配置文件 更新 `/etc/neutron/neutron.conf` 文件以确保配置正确。以下是一个示例配置[^2]: ```ini [DEFAULT] auth_strategy = keystone rpc_backend = neutron.openstack.common.rpc.impl_kombu rabbit_host = controller core_plugin = ml2 service_plugins = router allow_overlapping_ips = True [keystone_authtoken] auth_uri = http://controller:5000 auth_host = controller auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = neutron admin_password = service_pass ``` #### 条件判断语句的功能 在 DevStack 中,条件判断语句用于控制服务的启用和禁用。例如,以下代码片段展示了如何根据服务状态启用或禁用 Neutron 组件: ```bash if is_service_enabled q-agt; then echo "Enabling Neutron Agent" fi if is_service_enabled q-dhcp; then echo "Enabling Neutron DHCP" fi if is_service_enabled q-l3; then echo "Enabling Neutron L3" fi ``` 这些条件判断语句通过检查服务是否启用,决定是否执行特定的脚本逻辑[^1]。 #### 检查网络接口配置 如果使用 Open vSwitch(OVS),确保网络接口已正确配置。参考以下配置文件内容[^4]: ```plaintext allow-ovs br-phy iface br-phy inet dhcp pre-up /usr/bin/ovs-vsctl -- --may-exist add-br br-phy pre-up /usr/bin/ovs-vsctl -- --may-exist add-port br-phy eth0 ovs_type OVSBridge ovs_ports eth0 iface br-phy inet6 static pre-up modprobe ipv6 address 2001:2:3:4500:fa32:e4ff:febe:87cd netmask 64 gateway 2001:2:3:4500::1 allow-br-phy eth0 iface eth0 inet manual ovs_bridge br-phy ovs_type OVSPort ``` #### 验证服务状态 完成上述配置后,验证 `radvd` 和 Neutron 服务的状态: ```bash sudo systemctl status radvd.service sudo systemctl status neutron-dhcp-agent neutron-l3-agent neutron-metadata-agent neutron-openvswitch-agent ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值