| 
                         另外需要注意的是,新版本的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文件。                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |