neutron-metadata-agent 初始化流表过程
/usr/bin/neutron-metadata-agent --config-file=/etc/neutron/neutron_metadata.conf --config-file=/etc/neutron/metadata_agent.ini
/usr/bin/neutron-metadata-agent 调用neutron.agent.metadata_agent.py中的main方法
+------------------------------------------------------------------------------------+
(一) neutron-metadata-agent 初始化过程:
+------------------------------------------------------------------------------------+
(1) neutron.agent.metadata_agent.py中的main方法执行逻辑
1.1.设置配置参数
1.2.开启一个monitor线程,定时向monitor_file_dir 写入当前时间来检查服务是否hung住
1.3.初始化一个UnixDomainMetadataProxy实例启动一个unixDomain proxy WSGIServer服务,即 neutron-metadata-agent 进程服务,并调用wait()方法等待请求进行处理。WSGIServer服务的application 为
实现了_proxy_request方法的MetadataProxyHandler实例。WSGIServer 启动时调用MetadataProxyHandler的 __call__方法来proxy http request。处理request的逻辑:
(a) 通过request中请求头里的 'X-Forwarded-For'(vm实例的fixed_ip), 'X-Neutron-Network-ID'(vm实例所在network的net-id) 和 'X-Neutron-Router-ID'(vm实例所在router的router-id)调用 MetadataPluginAPI
(b) 插件向neutron-server发送rpc 消息请求ports信息。如果返回的ports数量为多个,则响应请求并返回HTTPNotFound错误。
(c)如果ports数量为1即返回单个port(一般同一network中的fixed_ip是不重复的),代理http request:
重新构造request向nova_metadata服务发送http request获取 metadata响应并返回。此时请求头headers有:'X-Forwarded-For': req.headers.get('X-Forwarded-For'), 'X-Instance-ID': instance_id,
'X-Tenant-ID': tenant_id, 'X-Instance-ID-Signature': self._sign_instance_id(instance_id)
tips: 启动UnixDomainMetadataProxy 服务是会配置一个 CONF.metadata_proxy_socket 文件来监听本地unix socket 。
+---------------------------------+
此服务可结合 neutron dhcp agent 初始化服务一起来看: https://blog.csdn.net/gyunling/article/details/88829156