加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

OpenStack假造机怎样获取metadata

发布时间:2018-08-16 06:04:34 所属栏目:站长百科 来源:佚名
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 1. 关于OpenStack metadata处事 我们知道OpenStack假造机是通过cloud-init完成初始化设置,好比网卡设置、hostname、初始化暗码以及密钥设置等。cloud-init是运行在假造机内部的一

因为neutron-metadata-agent是节制节点上的历程,因此和Nova Metadata处事必定是通的, OpenStack假造机怎样会见Nova Metadata处事题目根基就办理了。

  1. curl 169.254.169.254 -> haproxy(80端口) -> UNIX Socket文件 -> neutron-metadata-agent -> nova-api-metadata 

即一共必要三次转发。

可是Nova Metadata处事怎样知道是哪个假造机发送过来的哀求呢?换句话说,怎样获取该假造机的uuid,我们将在下一章先容。

4 Metadata处事怎样获取假造机信息

前一章先容了OpenStack假造机怎样通过169.254.169.254达到Nova Metadata处事,那达到之后怎样判定是哪个假造机发送过来的呢?

OpenStack是通过neutron-metadata-agent获取假造机的uuid的。我们知道,在统一个Neutron network中,纵然有多个subnet,也不应承IP一再,即通过IP地点可以或许独一确定Neutron的port信息。而neutron port会配置device_id标识斲丧者信息,对付假造机来说,即假造机的uuid。

因此neutron-metadata-agent通过network uuid以及假造机ip即可获取假造机的uuid。

不知道各人是否还记得在haproxy设置文件中存在一条设置项:

  1. http-request add-header X-Neutron-Network-ID 2c4b658c-f2a0-4a17-9ad2-c07e45e13a8a 

即haproxy转发之前会把network id添加到哀求头部中,而IP可以通过HTTP的头部X-Forwarded-For中获取。因此neutron-metadata-agent具备获取假造机的uuid以及project id(租户id)前提,我们可以查察neutron-metadata-agent获取假造机uuid以及project id实现,代码位于neutron/agent/metadata/agent.py:

  1. def _get_instance_and_tenant_id(self, req): 
  2.     remote_address = req.headers.get('X-Forwarded-For') 
  3.     network_id = req.headers.get('X-Neutron-Network-ID') 
  4.     router_id = req.headers.get('X-Neutron-Router-ID') 
  5.  
  6.     ports = self._get_ports(remote_address, network_id, router_id) 
  7.     if len(ports) == 1: 
  8.         return ports[0]['device_id'], ports[0]['tenant_id'] 
  9.     return None, None 

假如谁都可以伪造Metadata哀求获取任何假造机的metadata信息,显然是不安详的,因此在转发给Nova Metadata处事之前,还必要发一个secret:

  1. def _sign_instance_id(self, instance_id): 
  2.     secret = self.conf.metadata_proxy_shared_secret 
  3.     secret = encodeutils.to_utf8(secret) 
  4.     instance_id = encodeutils.to_utf8(instance_id) 
  5.     return hmac.new(secret, instance_id, hashlib.sha256).hexdigest() 

metadata_proxy_shared_secret必要打点员设置,然后组合假造机的uuid天生一个随机的字符串作为key。

最终,neutron-metadata-agent会把假造机信息放到头部中,发送到Nova Metadata处事的头部信息如下:

  1. headers = { 
  2.     'X-Forwarded-For': req.headers.get('X-Forwarded-For'), 
  3.     'X-Instance-ID': instance_id, 
  4.     'X-Tenant-ID': tenant_id, 
  5.     'X-Instance-ID-Signature': self._sign_instance_id(instance_id) 

此时Nova Metadata就可以通过假造机的uuid查询metadata信息了,代码位于nova/api/metadata/base.py:

  1. def get_metadata_by_instance_id(instance_id, address, ctxt=None): 
  2.     ctxt = ctxt or context.get_admin_context() 
  3.     attrs = ['ec2_ids', 'flavor', 'info_cache', 
  4.              'metadata', 'system_metadata', 
  5.              'security_groups', 'keypairs', 
  6.              'device_metadata'] 
  7.     try: 
  8.         im = objects.InstanceMapping.get_by_instance_uuid(ctxt, instance_id) 
  9.     except exception.InstanceMappingNotFound: 
  10.         LOG.warning('Instance mapping for %(uuid)s not found; ' 
  11.                     'cell setup is incomplete', {'uuid': instance_id}) 
  12.         instance = objects.Instance.get_by_uuid(ctxt, instance_id, 
  13.                                                 expected_attrs=attrs) 
  14.         return InstanceMetadata(instance, address) 
  15.  
  16.     with context.target_cell(ctxt, im.cell_mapping) as cctxt: 
  17.         instance = objects.Instance.get_by_uuid(cctxt, instance_id, 
  18.                                                 expected_attrs=attrs) 
  19.         return InstanceMetadata(instance, address) 

5 在假造机外部怎样获取假造机metadata

(编辑:湖南网)

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

热点阅读