要想从 nova-api-metadata 获得 metadata,需要指定 instance 的 id。但 instance 刚启动时无法知道自己的 id,所以 http 请求中不会有 instance id 信息,id 是由 neutron-metadata-agent 添加进去的。针对 l3-agent 和 dhcp-agent 这两种情况在实现细节上有所不同,下面分别讨论。

l3-agent

下面是 l3-agent 参与情况下 metadata http 请求的处理流程图。

大的流程为:instance -> neutron-ns-metadata-proxy -> neutron-metadata-agent -> nova-api-metadata,处理细节说明如下:

① neutron-ns-metadata-proxy 接收到请求,在转发给 neutron-metadata-agent 之前会将 instance ip 和 router id 添加到 http 请求的 head 中,这两个信息对于 l3-agent 来说很容易获得。

② neutron-metadata-agent 接收到请求后,会查询 instance 的 id,具体做法是:

1) 通过 router id 找到 router 连接的所有 subnet,然后筛选出 instance ip 所在的 subnet。

2)在 subnet 中找到 instance ip 对应的 port。

3)通过 port 找到对应的 instance 及其 id。

③ neutron-metadata-agent 将 instance id 添加到 http 请求的 head 中,然后转发给 nova-api-metadata,这样 nova-api-metadata 就能返回指定 instance 的 metadata 了。

我们再来看 dhcp-agent 的情况。

dhcp-agent

① neutron-ns-metadata-proxy 在转发请求之前会将 instance ip 和 network id 添加到 http 请求的 head 中,这两个信息对于 dhcp-agent 来说很容易获得。

② neutron-metadata-agent 接收到请求后,会查询 instance 的 id,具体做法是:

1) 通过 network id 找到 network 所有的 subnet,然后筛选出 instance ip 所在的 subnet。

2)在 subnet 中找到 instance ip 对应的 port。

3)通过 port 找到对应的 instance 及其 id。

③ neutron-metadata-agent 将 instance id 添加到 http 请求的 head 中,然后转发给 nova-api-metadata,这样 nova-api-metadata 就能返回指定 instance 的 metadata 了。

这样,不管 instance 将请求发给 l3-agent 还是 dhcp-agent,nova-api-metadata 最终都能获知 instance 的 id,进而返回正确的 metadata。

从获取 metadata 的流程上看,有一步是至关重要的:instance 必须首先能够正确获取 DHCP IP,否则请求发送不到 169.254.169.254。但不是所有环境都会启用 dhcp,更极端的,有些环境可能连 nova-api-metadata 服务都不会启用。那么 instance 还能获得 metadata 吗?

这就是下一节我们要讨论的主题:config drive

instance 怎么获得自己的 Metadata - 每天5分钟玩转 OpenStack(169)的更多相关文章

  1. 通过 dhcp-agent 访问 Metadata - 每天5分钟玩转 OpenStack(168)

    OpenStack 默认通过 l3-agent 创建和管理 neutron-ns-metadata-proxy,进而与 nova-metadata-api 通信.但不是所有环境都有 l3-agent, ...

  2. 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

    上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...

  3. nova-compute 部署 instance 详解 - 每天5分钟玩转 OpenStack(28)

    本节讨论 nova-compute,并详细分析 instance 部署的全过程. 先给大家道个歉:今天这篇文章的篇幅比以往要多一些,本来想分两次发,但考虑到文章的完整和系统性,还是一次发了出来,这次可 ...

  4. Metadata Service 一个最简单的应用 - 每天5分钟玩转 OpenStack(164)

    实现 instance 定制化,cloud-init(或 cloudbase-init)只是故事的一半,metadata service 则是故事的的另一半.两者的分工是:metadata servi ...

  5. Metadata Service 架构详解 - 每天5分钟玩转 OpenStack(165)

    下面是 Metadata Service 的架构图,本节我们详细讨论各个组件以及它们之间的关系. nova-api-metadata nova-api-metadata 是 nova-api 的一个子 ...

  6. 获取 metadata 的完整例子 - 每天5分钟玩转 OpenStack(166)

    我们将通过实验详细分析 instance 从 nova-api-metadata 获取信息的完整过程. 环境介绍 1. 一个 all-in-one 环境(多节点类似). 2. 已创建 neutron ...

  7. 获取 metadata 过程详解 - 每天5分钟玩转 OpenStack(167)

    接上节,启动 neutron router 后 instance c1 终于拿到了 metadata, 从下面 c1 的启动日志可知: c1 所认为的 metadata 服务地址是 169.254.1 ...

  8. Metadata Service 最高频的应用 - 每天5分钟玩转 OpenStack(164)

    实现 instance 定制化,cloud-init(或 cloudbase-init)只是故事的一半,metadata service 则是故事的的另一半.两者的分工是:metadata servi ...

  9. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)

    上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...

随机推荐

  1. 基于Selenium2与Python自动化测试环境搭建

    简介: selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: *  免费,也不用再为破解QTP而大伤脑筋 *  小巧,对于 ...

  2. 初识Jenkins

    近期,接手了一个活,我要搭一个Jenkins持续集成的平台,所以,就把这次工作的收获分享给大家了. Jenkins是什么 Jenkins插件配置 Jenkins怎么用 新建job 系统配置 添加用户 ...

  3. 集成支付宝-iOS

    前言 坑坑坑,把踩过的坑都要记下来!! 正文 1.支付宝的demo和文档都好难找啊@_@,像我这个记忆不太好的,第二次都找不到!!为了方便大家,还是直接给大家网址吧,(不要太感谢我喔~)https:/ ...

  4. C# 6 与 .NET Core 1.0 高级编程 - 40 ASP.NET Core(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 40 章  ASP.NET Core(上)),不对的地方欢迎指出与交流. 章节出自<Professiona ...

  5. IntelliJ IDEA 2016.1.4 git 切换分支详解

    参考网址: http://cache.baiducontent.com/c?m=9d78d513d9981de90fb3ca255501d7174202d7743da7c7647ac3e54a8414 ...

  6. php与微信基础的学习

    我们要搞的是用php来与微信进行信息交互,现在是一个学习过程...结合慕课网渔夫老师的讲解. 微信公众号的申请具体可百度,太简单不予说明,微信本身功能也挺多,也有相关第三方平台,然而我们学习编程--具 ...

  7. HTTP各状态消息说明

    200:请求已成功,请求所希望的响应头或数据体将随此响应返回. 302:请求的资源临时从不同的 URI 响应请求.由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求.只有在 Cache- ...

  8. 如何用PHP做到页面注册审核

    用户注册后就有该条用户记录,你对用户表设一个"审核状态"字段,默认值设为"未审核",然后你写几句审核代码做成一个功能,按照你们的意愿若审核通过你把审核状态改为& ...

  9. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

  10. KoaHub.js:使用ES6/7特性开发Node.js框架(2)

    介绍   KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async ...