1.5 问题分析
1.5.1 查看进程启动时间
查看neutron.conf修改时间,三个节点都是7月15号。
查看neutron-server启动时间,都是在neutron.conf修改之后启动。
查看dhcp-agent启动时间,三个节点都是7月12号。
所以这里存在问题,neutron.conf修改之后dhcp-agent没重启。
不过,现在dhcp-agent状态是正常的,不是根本原因。
查看neutron.conf修改时间:
[root@yfq-vnet-ctl-9-74~]# ls -l /etc/neutron/neutron.conf
-rw-r--r-- 1root root 35503 Jul 15 16:49 /etc/neutron/neutron.conf
[root@yfq-vnet-ctl-9-74~]#
[root@yfq-vnet-ctl-9-89~]# ls -l /etc/neutron/neutron.conf
-rw-r--r-- 1root root 35503 Jul 15 16:49 /etc/neutron/neutron.conf
[root@yfq-vnet-ctl-9-89~]#
[root@yfq-vnet-ctl-9-104~]# ll /etc/neutron/neutron.conf
-rw-r--r-- 1root root 35504 Jul 15 16:49 /etc/neutron/neutron.conf
[root@yfq-vnet-ctl-9-104~]#
查看dhcp-agent启动时间:
查看neutron-server启动时间。
查看ovs-agent启动时间:
1.5.2 为什么出现binding_failed
从代码流程分析中可以看出,dhcp port绑定失败的可能原因有:
1) dhcp-agent里配置的租户网络类型不对。
2) dhcp-agent上报create port后,agent立即变成down的。
1.5.3 为什么dhcp-agent不打log
我们进行一下如下验证:
创建网络:
网络创建成功了,但是dhcp-agent日志中并没有任何打印。
将dnsmasq进程杀掉,看看能否恢复。
恢复了,并且终于打了个日志:
综上,dhcp-agent里,如果没有异常,是不打log的。
这个可以改进一下。
1.1.4 为什么dhcp-agent同步时不会删除多余的tap口
在问题定位时,我们新建了网络,可以看到是没有问题的。
所以这些出问题的网络应该都是以前创建的,在某种条件下,tap没有被正确删除。
下面我们一步一步进行测试,寻找问题复现的办法,并结合代码分析,找到问题的根本原因。
1.1.5 对比配置文件
首先找个正常的环境,对比下配置文件,看看是不是配置问题。
研发区环境
|
开源环境
|
[DEFAULT]
verbose = True ---->
auth_strategy=keystone
rpc_backend = rabbit
core_plugin = ml2 ---->
service_plugins = router,firewall,lbaas,vpnaas ---->
allow_overlapping_ips = True ---->
notify_nova_on_port_status_changes = True ---->
notify_nova_on_port_data_changes = True ---->
nova_url = http://10.254.9.242:8774/v2 ---->
bind_host = 10.254.9.74 ---->
dhcp_agents_per_network = 2
debug = False
dhcp_lease_duration = -1
rpc_workers = 10 ---->
api_workers = 10 ---->
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent]
[keystone_authtoken]
identity_uri = http://10.254.9.242:5000
auth_url = http://10.254.9.242:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = 947da0da7413
[database]
connection = mysql://neutron:bcvnetwork#[email protected]:3306/neutron
[nova]
auth_url = http://10.254.9.242:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = nova
password = d4849649eb79acd1bd43
[oslo_concurrency]
lock_path = $state_path/lock
[oslo_policy]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
rabbit_hosts = 10.254.9.74:5672,10.254.9.89:5672,10.254.9.104:5672
rabbit_userid = openstack
rabbit_password = bcvnetwork#123
rabbit_retry_interval=1
rabbit_retry_backoff=2
rabbit_max_retries=0
rabbit_durable_queues=true
rabbit_ha_queues=true
|
[DEFAULT]
verbose = True
router_distributed = False
debug = False
state_path = /var/lib/neutron
use_syslog = False
log_dir =/var/log/neutron
bind_host = 0.0.0.0
bind_port = 9696
core_plugin =neutron.plugins.ml2.plugin.Ml2Plugin
service_plugins =router
auth_strategy = keystone
base_mac = fa:16:3e:00:00:00
mac_generation_retries = 16 ---默认
dhcp_lease_duration = 86400
dhcp_agent_notification = True ---默认
allow_bulk = True
allow_pagination = False
allow_sorting = False
allow_overlapping_ips = True
agent_down_time = 75 ----默认
router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.ChanceScheduler
allow_automatic_l3agent_failover = False
dhcp_agents_per_network = 1
l3_ha = False
api_workers = 40
rpc_workers = 40
use_ssl = False
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://10.254.9.82:8774/v2
nova_region_name =RegionOne
nova_admin_username =nova
nova_admin_tenant_name =services
nova_admin_password =089c2c7ba84e4cc2
nova_admin_auth_url =http://10.254.9.82:5000/v2.0
send_events_interval = 2
rpc_backend=neutron.openstack.common.rpc.impl_kombu ---默认rabbit
control_exchange=neutron
lock_path=/var/lib/neutron/lock
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent] root_helper = sudo neutron-rootwrap /etc/neutron/rootwrap.conf --默认sudo
report_interval = 30 --默认
[keystone_authtoken]
auth_uri = http://10.254.9.82:5000/v2.0
identity_uri = http://10.254.9.82:35357
admin_tenant_name = services
admin_user = neutron
admin_password = fd1e5c16fcf3432c
[database]
connection = mysql://neutron:[email protected]/neutron
max_retries = 10
retry_interval = 10
min_pool_size = 1
max_pool_size = 10
idle_timeout = 3600
max_overflow = 20
[nova]
[oslo_concurrency]
lock_path = $state_path/lock
[oslo_policy]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
kombu_reconnect_delay = 1.0
rabbit_host = 10.254.9.82
rabbit_port = 5672
rabbit_hosts = 10.254.9.82:5672
rabbit_use_ssl = False
rabbit_userid = guest
rabbit_password = guest
rabbit_virtual_host = /
rabbit_ha_queues = False
heartbeat_rate=2 ---自研没有
heartbeat_timeout_threshold=0
|
从配置文件看,只有root_helper比较可疑,我们来验证一下。
1.1.6 测试root_helper参数
找个正常的环境,进行如下操作。
1)测试创建网络
将root_helper的配置修改为sudo。
重启dhcp-agent,
创建网络,观察网络能否创建成功
创建网络成功,但是端口状态是down的。原因是sudo这个roothelper不能执行root命令。
这与之前的问题现象不一致,所以不是root_helper的问题。
1.1.7 测试rabbit host配置错误时的现象
修改neutron.conf中mq host为错误的地址。
rabbit_host =10.254.9.82
rabbit_port =5672
rabbit_hosts =10.254.9.82:5672
->
rabbit_host =10.254.9.83
rabbit_port =5672
rabbit_hosts =10.254.9.83:5672
然后重启dhcp-agent,观察现象:
dhcp-agent报错:
过一段时间,agent变为down。
创建网络时,没有创建dhcp-port:
这是因为dhcpport的创建流程是这样的:
neutron plugin中:
1) 根据dhcp_agents_per_network配置的数目,调度网络到某个dhcp agent上。
2) plugin通过rpc ( rabbit mq)发送给dhcp agent。内容是网络ID。
dhcp agent中:
1) 通过rpc获取网络信息,包括该网络内的子网、端口的全部信息。
2) 检测该网络在该agent上是否已经创建dhcp port,如果已经创建,但是subnet-id有变化,发送rpc给plugin更新端口。(一个网络一个dhcp server,所以会承载所有的子网的dhcp功能)
3) 如果dhcpport已经创建,但是device_id不对,发送rpc给plugin更新端口。
4) 如果dhcpport没有创建,发送rpc给plugin创建端口。
5) 如上更新、创建端口的动作都是同步事件,会等plugin的返回结果。
6) 创建namespace,并将tap加入其中。
7) 在tap口上配置ip、路由。
8) 生成leases、hosts等文件。
9) 在namespace里启动dnsmasq服务,并且通过process_monitor监控进程状态。
按照上面的流程,如果rabbit host配置错误,会直接导致dhcp port无法创建。
与tap口残留问题现象不一致。