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口殘留問題現象不一致。