Atom feed of this document
  

 元数据服务

计算节点为虚拟机实例使用元数据服务来获取指定实例的数据。实例在 http://169.254.169.254 访问元数据服务。元数据服务支持两套 API:OpenStack 元数据 API 和 EC2-兼容的 API。两种 API 都以日期为版本。

要获取元数据API所支持的版本列表,发送GET请求到http://169.254.169.254/openstack:

$ curl http://169.254.169.254/openstack
2012-08-10
2013-04-04
2013-10-17
latest

要列出所支持的EC2兼容的元数据API版本,发送GET请求到http://169.254.169.254:

$ curl http://169.254.169.254
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
latest

如果您编写了一个 API 的 consumer,要优先尝试访问最近的 API 版本来支持您的 consumer,如果最近的一个是不可用的,那么可以追溯到更早期的版本。

来自OpenStack API的元数据分发的是JSON格式。要获取这些元数据,发送GET请求到 http://169.254.169.254/openstack/2012-08-10/meta_data.json:

$ curl http://169.254.169.254/openstack/2012-08-10/meta_data.json
{
    "uuid": "d8e02d56-2648-49a3-bf97-6be8f1204f38",
    "availability_zone": "nova",
    "hostname": "test.novalocal",
    "launch_index": 0,
    "meta": {
        "priority": "low",
        "role": "webserver"
    },
    "project_id": "f7ac731cc11f40efbc03a9f9e1d1d21f",
    "public_keys": {
        "mykey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDYVEprvtYJXVOBN0XNKVVRNCRX6BlnNbI+USLGais1sUWPwtSg7z9K9vhbYAPUZcq8c/s5S9dg5vTHbsiyPCIDOKyeHba4MUJq8Oh5b2i71/3BISpyxTBH/uZDHdslW2a+SrPDCeuMMoss9NFhBdKtDkdG9zyi0ibmCP6yMdEX8Q== Generated by Nova\n"
    },
    "name": "test"
}

实例也通过元数据服务,使用一个到 http://169.254.169.254/openstack/2012-08-10/user_data 的 GET 请求来获取用户数据 (以 API 调用的 user_data 参数或 nova boot 命令的 --user_data 标签传递):

$ curl http://169.254.169.254/openstack/2012-08-10/user_data
#!/bin/bash
echo 'Extra user data here'

元数据服务有一个与 Amazon EC2 元数据服务兼容的 2009-04-04 版本的 API。这意味着为 EC2 设计的虚拟机镜像在 OpenStack 中也可以正常工作。

EC2 API 为每个元数据元素暴露一个分离的 URL。通过到 http://169.254.169.254/2009-04-04/meta-data/ 的 GET 查寻来获取这些元素的列表:

$ curl http://169.254.169.254/2009-04-04/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
kernel-id
local-hostname
local-ipv4
placement/
public-hostname
public-ipv4
public-keys/
ramdisk-id
reservation-id
security-groups
$ curl http://169.254.169.254/2009-04-04/meta-data/block-device-mapping/
ami
$ curl http://169.254.169.254/2009-04-04/meta-data/placement/
availability-zone
$ curl http://169.254.169.254/2009-04-04/meta-data/public-keys/
0=mykey

实例可以通过向 http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key 发送 GET 请其获取公有 SSH key (在用户请求一个新的实例时由密钥对名称确定):

$ curl http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDYVEprvtYJXVOBN0XNKVVRNCRX6BlnNbI+USLGais1sUWPwtSg7z9K9vhbYAPUZcq8c/s5S9dg5vTHbsiyPCIDOKyeHba4MUJq8Oh5b2i71/3BISpyxTBH/uZDHdslW2a+SrPDCeuMMoss9NFhBdKtDkdG9zyi0ibmCP6yMdEX8Q== Generated by Nova

通过以GET请求http://169.254.169.254/2009-04-04/user-data,实例可以获取到用户的数据:

$ curl http://169.254.169.254/2009-04-04/user-data
#!/bin/bash
echo 'Extra user data here'

元数据服务是由 nova-api 服务或 nova-api-metadata 服务实现的。请注意 nova-api-metadata 服务一般仅在运行多主机模式下使用,因为它会检索指定实例的元数据。如果您正在运行 nova-api 服务,您必需将 metadata 作为在 /etc/nova/nova.conf 文件中的 enabled_apis 配置选项中列出的元素之一 。默认的 enabled_apis 配置选项包括了元数据服务,因此您不需要修改它。

主机在 169.254.169.254:80 上访问服务,而且它会通过 nova-network 服务建立的 iptables 规则被转化到 metadata_host:metadata_port 中。在多主机模式下,您可以将 metadata_host 设置为 127.0.0.1

为了实例可以获得元数据服务,nova-network 服务必需配置 iptables 为 NAT port 169.254.169.254 地址的 80 端口到 metadata_host 中指定的 IP 地址 (这默认是到 $my_ip 的,即 nova-network 服务的 IP 地址) 和 /etc/nova/nova.confmetadata_port 中指定的端口 (默认是 8775)。

[注意]注意

metadata_host 的配置属性必须是IP地址,而并非主机名。

默认的计算服务设置是假设nova-networknova-api是运行在同一台主机中的。若事实的情况不是这样的话,在运行nova-network的主机的/etc/nova/nova.conf文件中,设置metadata_host配置属性,即指定运行nova-api的主机的IP地址。

表 4.2. Description of metadata configuration options
配置属性=默认值 描述
[DEFAULT]
metadata_cache_expiration = 15 (IntOpt) Time in seconds to cache metadata; 0 to disable metadata caching entirely (not recommended). Increasingthis should improve response times of the metadata API when under heavy load. Higher values may increase memoryusage and result in longer times for host metadata changes to take effect.
metadata_host = $my_ip (StrOpt) 元数据API服务器的IP地址
metadata_listen = 0.0.0.0 (StrOpt)元数据API监听的IP地址
metadata_listen_port = 8775 (IntOpt)元数据API监控端口
metadata_manager = nova.api.manager.MetadataManager (StrOpt)OpenStack元数据服务管理者
metadata_port = 8775 (IntOpt)元数据API端口
metadata_workers = (IntOpt) 元数据服务的工作者数量。缺省是可用CPU的数量。
vendordata_driver = nova.api.metadata.vendordata_json.JsonFileVendorData (StrOpt) 使用赞助商数据的驱动
vendordata_jsonfile_path = (StrOpt) 从文件加载JSON格式赞助商数据

Questions? Discuss on ask.openstack.org
Found an error? Report a bug against this page


loading table of contents...