资讯专栏INFORMATION COLUMN

深度解析 OpenStack metadata 服务架构

Michael_Lin / 1312人阅读

摘要:下图展示了虚拟机可以获取到的信息神奇的这个地址来源于,亚马逊在设计公有云的时候为了让能够访问,就将这个特殊的作为服务器的地址。服务启动了服务,负责处理虚拟机发送来的请求。服务也运行在网络节点。中的路由和服务器都在各自独立的命名空间中。

前言

下图是OpenStack虚拟机在启动过程中发出的一个请求,我们在里面可以看到cloud-init和169.254.169.254。那么它们分别是做什么用的呢,接下来我们将会做一个详细的介绍。

众所周知,在创建虚拟机的时候,用户往往需要对虚拟机进行一些配置,比如:开启一些服务、安装某些包、添加SSH 秘钥、配置 hostname,修改密码等等。这里有两个问题,一个是谁负责初始化虚拟机配置,另一个是虚拟机如何获取到这些配置信息的。

首先这些信息的初始化是通过cloud-Init的方式配置到虚拟机中。cloud-Init是一个用来自动配置虚拟机的初始设置的工具,它可以在使用模板部署虚拟机时使用,从而达到避免网络冲突的目的。在使用这个工具前,cloud-init 软件包必须在虚拟机上被安装。安装后,cloud-Init服务会在系统启动时搜索如何配置系统的信息。您可以使用只运行一次窗口来提供只需要配置一次的设置信息;或在新建虚拟机、编辑虚拟机和编辑模板窗口中输入虚拟机每次启动都需要的配置信息。

cloud-init负责初始化虚拟机配置,那么虚拟机如何获取到用户传递的配置信息呢?OpenStack提供了两种方式获取这些配置信息,一种是config drive,一种是metadata RESTful服务。由于篇幅关系,本文主要阐述metadata RESTful服务。

OpenStack nova-api-metadata服务提供了RESTful 接口,虚拟机可以通过访问API获取metadata 信息。要完成从虚拟机至网络节点的请求发送和响应,保证链路的连通,只有nova-api-metadata服务是不够的,OpenStack提供neutron-metadata-agent 和 neutron-ns-metadata-proxy服务保证虚拟机的请求可以发送到nova-api-metadata服务。

下图展示了虚拟机可以获取到的metadata信息

神奇的169.254.169.254

这个地址来源于AWS,亚马逊在设计公有云的时候为了让instance 能够访问 metadata,就将 169.254.169.254 这个特殊的IP 作为metadata 服务器的地址。然后大家在给亚马逊定制各种操作系统镜像的时候获取metadata的api地址就写的是169.254.169.254。为了这些镜像也能在OpenStack上运行,为了兼容它。OpenStack就保留了这个地址。

nova-api-metadata服务

nova-api-metadata启动了RESTful 服务,负责处理虚拟机发送来的REST API 请求。从请求的HTTP 头部中取出相应的信息,获得虚拟机的ID,继而从数据库中读取虚拟机的metadata 信息,最后将结果返回。

neutron-metadata-agent服务

neutron-metadata-agent 运行在网络节点,负责将接收到的获取metadata 的请求转发给nova-api-metadata。neutron-metadata-agent 会获取虚拟机和租户的ID,添加到请求的HTTP 头部中。nova-api-metadata 会根据这些信息获取metadata。

neutron-ns-metadata-proxy服务

neutron-ns-metadata-proxy 也运行在网络节点。为了解决网络节点的网段和租户的虚拟网段重复的问题,OpenStack 引入了网络命名空间。neutron 中的路由和DHCP 服务器都在各自独立的命名空间中。由于虚拟机获取metadata 的请求都是以路由和DHCP 服务器作为网络出口,所以需要通过neutron-ns-metadata-proxy 联通不同的网络命名空间,将请求在网络命名空间之间转发。

neutron-ns-metadata-proxy利用在unix domain socket 之上的HTTP技术,实现了不同网络命名空间之间的HTTP 请求转发。并在请求头中添加’X-Neutron-Router-ID’和’X-Neutron-Network-ID’信息,以便neutron-metadata-agent 来辨别发送请求的虚拟机,获取虚拟机的ID。通过下图可以看出每个网络或者router均会有一个服务进程,网络对应的端口号为80,router对应的端口号为9697。

虚拟机获取metadata流程

如上图所示,虚拟机获取metadata 的大致流程为:首先请求被发送至neutron-ns-metadata-proxy,此时会在请求中添加router-id 和network-id,然后请求通过unix domian socket 被转发给neutron-metadata-agent,根据请求中的router-id、network-id 和IP,获取port 信息,从而拿到instance-id 和tenant-id 加入请求中,最后请求被转发给nova-api-metadata,其利用instance-id 和tenant-id 获取虚拟机的metadata,返回相应。

上面我们分析了各个服务之间转发请求的流程,那么现在只存在一个问题,整个获取metadata 的路线就通畅了:虚拟机如何将请求发送至neutron-ns-metadata-proxy? neutron通过两种方式来解决这个问题:通过router 发送请求和通过DHCP 发送请求。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/5342.html

相关文章

  • 深度解码超实用的OpenStack Heat

    摘要:模板中的顶级,定义实例化后将返回的数据。通过如此的解析和协作,最终完成请求的处理。服务接受请求,读入模板信息,处理后利用请求发送给。首先,调用拿到对应的。Heat 是由AWS的EC2 Cloud Formation 演化而来,是openstack中负责Orchestration的service, 用于openstack 中资源的编排,它通过将OpenStack中的资源(resource)以模...

    pkwenda 评论0 收藏0
  • 通过demo学习OpenStack开发所需的基础知识 -- 数据库(1)

    摘要:另外,项目在单元测试中使用的是的内存数据库,这样开发者运行单元测试的时候不需要安装和配置复杂的数据库,只要安装好就可以了。而且,数据库是保存在内存中的,会提高单元测试的速度。是实现层的基础。项目一般会使用数据库来运行单元测试。 OpenStack中的关系型数据库应用 OpenStack中的数据库应用主要是关系型数据库,主要使用的是MySQL数据库。当然也有一些NoSQL的应用,比如Ce...

    warnerwu 评论0 收藏0
  • 【干货】云计算新名词解析

    摘要:慢慢硬件和就绑在一起了,的,的,的微软是个例外,可在不同的服务器上跑。虚拟软件的老大自打推出它的之后,很快又推出了它的管理平台另一大佬微软比胃口还大,从操作系统到虚拟软件,当然忘不了它的管理平台。自此,成了容器的代名词。  云世界里的技术日新月异,新名词一个接着一个让人应接不暇,从虚拟化开始,VMware、HyperV、KVM,到云管理平台VSphere、SystemCenter、OpenS...

    BicycleWarrior 评论0 收藏0
  • ECUG Con 邀您共议服务端开发最深度实践

    摘要:本届大会仍然以交流云计算产业的最前沿技术探索和服务端开发运维的最成熟实践为宗旨,围绕各讲师过去一年内的技术演变和项目实践进行互动和分享。 showImg(https://segmentfault.com/img/bVsmUZ);ECUG 全称为 Effective Cloud User Group (实效云计算用户组),由七牛云 CEO 许式伟于 2007 年发起,集结了一批具有高端视...

    dongxiawu 评论0 收藏0
  • openstack创建虚拟机源码阅读

    摘要:标签源码阅读在中虚拟机的创建无疑是非常重要的了解虚拟机创建流程并阅读模块关于创建虚拟机的源码对开发有很很大帮助本篇文章将以版本为基础讲解创建虚拟机的源码由于模块代码复杂而且阅读源码所需知识较多所以侧重于流程逻辑源码阅读可能不够详尽指出模块结 标签: openstack nova 源码阅读 在openstack中,虚拟机的创建无疑是非常重要的,了解虚拟机创建流程并阅读nova模块关于创...

    muddyway 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<