要想从 nova-api-metadata 得到 metadata,须要指定 instance 的 id。但 instance 刚启动时没法知道本身的 id,因此 http 请求中不会有 instance id 信息,id 是由 neutron-metadata-agent 添加进去的。针对 l3-agent 和 dhcp-agent 这两种状况在实现细节上有所不一样,下面分别讨论。
api
下面是 l3-agent 参与状况下 metadata http 请求的处理流程图。spa
大的流程为:instance -> neutron-ns-metadata-proxy -> neutron-metadata-agent -> nova-api-metadata,处理细节说明以下:code
① neutron-ns-metadata-proxy 接收到请求,在转发给 neutron-metadata-agent 以前会将 instance ip 和 router id 添加到 http 请求的 head 中,这两个信息对于 l3-agent 来讲很容易得到。router
② neutron-metadata-agent 接收到请求后,会查询 instance 的 id,具体作法是:ip
1) 经过 router id 找到 router 链接的全部 subnet,而后筛选出 instance ip 所在的 subnet。route
2)在 subnet 中找到 instance ip 对应的 port。network
3)经过 port 找到对应的 instance 及其 id。meta
③ neutron-metadata-agent 将 instance id 添加到 http 请求的 head 中,而后转发给 nova-api-metadata,这样 nova-api-metadata 就能返回指定 instance 的 metadata 了。请求
咱们再来看 dhcp-agent 的状况。im
① 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。