加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

OpenStack虚拟机如何获取metadata

发布时间:2018-08-29 23:17:23 所属栏目:空间 来源:佚名
导读:技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战 1. 关于OpenStack metadata服务 我们知道OpenStack虚拟机是通过cloud-init完成初始化配置,比如网卡配置、hostname、初始化密码以及密钥配置等。cloud-init是运行在虚拟机内部的一

另外需要注意的是,新版本的OpenStack是直接使用haproxy代理转发的,在一些老版本中则使用neutron-ns-metadata-proxy进程负责转发,实现的代码位于neutron/agent/metadata/namespace_proxy.py:

  1. def _proxy_request(self, remote_address, method, path_info, 
  2.                        query_string, body): 
  3.     headers = { 
  4.         'X-Forwarded-For': remote_address, 
  5.     } 
  6.  
  7.     if self.router_id: 
  8.         headers['X-Neutron-Router-ID'] = self.router_id 
  9.     else: 
  10.         headers['X-Neutron-Network-ID'] = self.network_id 
  11.  
  12.     url = urlparse.urlunsplit(( 
  13.         'http', 
  14.         '169.254.169.254', 
  15.         path_info, 
  16.         query_string, 
  17.         '')) 
  18.  
  19.     h = httplib2.Http() 
  20.     resp, content = h.request( 
  21.         url, 
  22.         method=method, 
  23.         headers=headers, 
  24.         body=body, 
  25.         connection_type=agent_utils.UnixDomainHTTPConnection) 

大家可能对请求URL为169.254.169.254有疑问,怎么转发给自己呢? 这是因为这是一个UNIX Domain Socket请求,其实这个URL只是个参数占位,填什么都无所谓,这个请求相当于:

  1. curl -H "X-Neutron-Network-ID: ${network_uuid}"  
  2.      -H "X-Forwarded-For: ${request_ip}"  
  3.      -X GET  
  4.      --unix /var/lib/neutron/metadata_proxy  
  5.      http://169.254.169.254 

3.4 Metadata请求第三次转发

前面说到,haproxy会把Metadata请求转发到本地的一个socket文件中,那么,到底是哪个进程在监听/opt/stack/data/neutron/metadata_proxysocket文件呢?我们通过lsof查看下:

  1. # lsof /opt/stack/data/neutron/metadata_proxy 
  2. COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME 
  3. neutron-m 11085 stack    3u  unix 0xffff8801c8711c00      0t0 65723197 /opt/stack/data/neutron/metadata_proxy 
  4. neutron-m 11108 stack    3u  unix 0xffff8801c8711c00      0t0 65723197 /opt/stack/data/neutron/metadata_proxy 
  5. neutron-m 11109 stack    3u  unix 0xffff8801c8711c00      0t0 65723197 /opt/stack/data/neutron/metadata_proxy 
  6. # cat /proc/11085/cmdline  | tr '' ' ' 
  7. /usr/bin/python /usr/bin/neutron-metadata-agent --config-file /etc/neutron/neutron.conf 

可见neutron-metadata-agent监听了这个socket文件,相当于haproxy把Metadata服务通过socket文件转发给了neutron-metadata-agent服务。

  1. def run(self): 
  2.     server = agent_utils.UnixDomainWSGIServer('neutron-metadata-agent') 
  3.     server.start(MetadataProxyHandler(self.conf), 
  4.                  self.conf.metadata_proxy_socket, 
  5.                  workers=self.conf.metadata_workers, 
  6.                  backlog=self.conf.metadata_backlog, 
  7.                  mode=self._get_socket_mode()) 
  8.     self._init_state_reporting() 
  9.     server.wait() 

进一步验证了neutron-metadata-agent监听了/opt/stack/data/neutron/metadata_proxysocket文件。

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读