| 另外需要注意的是,新版本的OpenStack是直接使用haproxy代理转发的,在一些老版本中则使用neutron-ns-metadata-proxy进程负责转发,实现的代码位于neutron/agent/metadata/namespace_proxy.py: def _proxy_request(self, remote_address, method, path_info,                        query_string, body):     headers = {         'X-Forwarded-For': remote_address,     }      if self.router_id:         headers['X-Neutron-Router-ID'] = self.router_id     else:         headers['X-Neutron-Network-ID'] = self.network_id      url = urlparse.urlunsplit((         'http',         '169.254.169.254',         path_info,         query_string,         ''))      h = httplib2.Http()     resp, content = h.request(         url,         method=method,         headers=headers,         body=body,         connection_type=agent_utils.UnixDomainHTTPConnection) 
 大家可能对请求URL为169.254.169.254有疑问,怎么转发给自己呢? 这是因为这是一个UNIX Domain Socket请求,其实这个URL只是个参数占位,填什么都无所谓,这个请求相当于: curl -H "X-Neutron-Network-ID: ${network_uuid}"       -H "X-Forwarded-For: ${request_ip}"       -X GET       --unix /var/lib/neutron/metadata_proxy       http://169.254.169.254 
 3.4 Metadata请求第三次转发 前面说到,haproxy会把Metadata请求转发到本地的一个socket文件中,那么,到底是哪个进程在监听/opt/stack/data/neutron/metadata_proxysocket文件呢?我们通过lsof查看下: # lsof /opt/stack/data/neutron/metadata_proxy COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME neutron-m 11085 stack    3u  unix 0xffff8801c8711c00      0t0 65723197 /opt/stack/data/neutron/metadata_proxy neutron-m 11108 stack    3u  unix 0xffff8801c8711c00      0t0 65723197 /opt/stack/data/neutron/metadata_proxy neutron-m 11109 stack    3u  unix 0xffff8801c8711c00      0t0 65723197 /opt/stack/data/neutron/metadata_proxy # cat /proc/11085/cmdline  | tr ' ' ' ' /usr/bin/python /usr/bin/neutron-metadata-agent --config-file /etc/neutron/neutron.conf 
 可见neutron-metadata-agent监听了这个socket文件,相当于haproxy把Metadata服务通过socket文件转发给了neutron-metadata-agent服务。 def run(self):     server = agent_utils.UnixDomainWSGIServer('neutron-metadata-agent')     server.start(MetadataProxyHandler(self.conf),                  self.conf.metadata_proxy_socket,                  workers=self.conf.metadata_workers,                  backlog=self.conf.metadata_backlog,                  mode=self._get_socket_mode())     self._init_state_reporting()     server.wait() 
 进一步验证了neutron-metadata-agent监听了/opt/stack/data/neutron/metadata_proxysocket文件。 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |