Метаданные виртуальных машин

Метаданные — механизм, с помощью которого Nova передаёт информацию о конфигурации запускаемым виртуальным машинам. Метаданные широко используются вспомогательными приложениями, такими как cloud-init, для указания параметров, которые должны использовать виртуальные машины — например, пароля суперпользователя.

Метаданные доступны через сетевую службу и через диск конфигурации (config drive). Кроме того, пользователь может их самостоятельно настроить с помощью функции пользовательских данных userdata.

В данном руководстве представлен краткий обзор этих функций и описание доступных типов метаданных.

Типы метаданных

Метаданные делятся на три типа в зависимости от того, кто передаёт их виртуальным машинам.

Данные, предоставленные пользователем

Пользователь, запустивший виртуальную машину, может передавать метаданные этой машине несколькими способами.

Для пар ключей аутентификации можно использовать функции пар ключей nova API для загрузки ключа и последующего указания этого ключа во время выполнения команды nova boot.

Для менее структурированных данных можно передавать небольшой блок данных с помощью функции userdata nova API.

Данные, предоставленные Nova

Nova автоматически передаёт информацию виртуальной машине с помощью внутренней реализации системы метаданных. Эта информация содержит такие данные, как запрашиваемое имя хоста виртуальной машины и зона доступности этой машины. Всё это происходит по умолчанию и не требует вмешательства пользователя либо разработчика.

Nova предоставляет данные как в формате OpenStack metadata API, так и совместимом с AWS EC2. И то, и другое имеет разные версии, названные по дате выпуска.

Данные, предоставленные разработчиком

Разработчику OpenStack может понадобиться передать данные виртуальной машине. Эти данные могут быть неизвестны пользователю, запускающему машину. Например, в случае с криптографическим токеном, используемым для регистрации виртуальной машины в Active Directory после загрузки, пользователь не имеет доступа к Active Directory для создания токена, зато развёртывание Nova может иметь разрешение на создание токена от имени пользователя.

Для этого нужно настроить функцию данных производителя (vendor data), которую может выполнить ваш оператор облачных вычислений.

Сетевая служба метаданных

Служба метаданных позволяет виртуальным машинам извлекать данные по отдельным машинам с помощью REST API. Виртуальные машины получают доступ к этой службе по адресу 169.254.169.254 или fe80::a9fe:a9fe. Через эту службу возможен доступ ко всем типам метаданных: предоставленным пользователем, сервисом Nova и производителем.

Доступ по IPv6

Служба метаданных доступна по протоколу IPv6 по адресу локальной связи fe80::a9fe:a9fe.

Как и во всех локальных адресах IPv6, IPv6-адрес метаданных не является полным без идентификатора зоны (в гостевой системе Linux это обычно имя интерфейса, отображающееся после знака процента). Обратите внимание, что в URL-адресах требуется экранировать знак процента самостоятельно.

Например, если основной сетевой интерфейс в гостевой системе — ens2, то http://[fe80::a9fe:a9fe%25ens2]:80/... нужно заменить на http://169.254.169.254/....

Использование службы метаданных

Чтобы получить список поддерживаемых версий для OpenStack metadata API, выполните GET-запрос к http://169.254.169.254/openstack, который вернёт список каталогов:

$ curl http://169.254.169.254/openstack
2012-08-10
2013-04-04
2013-10-17
2015-10-15
2016-06-30
2016-10-06
2017-02-22
2018-08-27
latest

Информацию о содержании и структуре этих каталогов см. в разделе Метаданные в формате OpenStack.

Чтобы получить список поддерживаемых версий для метаданных API, совместимых с EC2, выполните 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

Информацию о содержании и структуре этих каталогов см. в разделе Метаданные в формате EC2.

Диски конфигурации

Диски конфигурации — это специальные диски, которые подключаются к виртуальной машине при её загрузке. Виртуальная машина может смонтировать такой диск и считывать с него файлы для получения информации, которая обычно доступна через службу метаданных.

Один из вариантов применения диска конфигурации — передача сетевой конфигурации, когда не используется DHCP для назначения IP-адресов виртуальным машинам. Например, можно передавать конфигурацию IP-адреса для виртуальной машины через диск конфигурации, который машина установит самостоятельно и получит к нему доступ, прежде чем будут настроены сетевые параметры для виртуальной машины.

Использование диска конфигурации

Чтобы включить диск конфигурации для виртуальной машины, добавьте параметр --config-drive true к команде openstack server create.

Следующий пример запускает диск конфигурации и передаёт файл пользовательских данных с двумя парами значений ключей, которые доступны с диска конфигурации:

$ openstack server create --config-drive true --image my-image-name \
    --flavor 1 --key-name mykey --user-data ./my-user-data.txt \
    --property role=webservers --property essential=false MYINSTANCE

Если ваша гостевая операционная система поддерживает доступ к диску по метке (label), можно подключить диск конфигурации в качестве устройства /dev/disk/by-label/configurationDriveVolumeLabel. В следующем примере диск конфигурации имеет метку тома config-2:

# mkdir -p /mnt/config
# mount /dev/disk/by-label/config-2 /mnt/config

Если ваша гостевая ОС не использует udev, то каталог /dev/disk/by-label отсутствует. Вы можете использовать команду blkid для идентификации блочного устройства, соответствующего диску конфигурации. Например:

# blkid -t LABEL="config-2" -odevice
/dev/vdb

После идентификации устройство можно установить:

# mkdir -p /mnt/config
# mount /dev/vdb /mnt/config

После установки можно просмотреть содержимое диска конфигурации:

$ cd /mnt/config
$ find . -maxdepth 2
.
./ec2
./ec2/2009-04-04
./ec2/latest
./openstack
./openstack/2012-08-10
./openstack/2013-04-04
./openstack/2013-10-17
./openstack/2015-10-15
./openstack/2016-06-30
./openstack/2016-10-06
./openstack/2017-02-22
./openstack/latest

Файлы, появляющиеся на диске конфигурации, зависят от аргументов, переданных команде openstack server create. Формат этого каталога такой же, как у службы метаданных, за исключением того, что метаданные, совместимые с EC2, теперь расположены в каталоге ec2, а не в корневом каталоге (/).

Информацию о формате файлов и подкаталогов в этих каталогах см. в разделах Метаданные в формате OpenStack и Метаданные в формате EC2.

Настройки образов

Свойство метаданных образа img_config_drive можно использовать для принудительного включения диска конфигурации:

$ openstack image set IMG-UUID --property img_config_drive=mandatory

Параметр img_config_drive указывает, нужен ли образу диск конфигурации.

Форматы метаданных

Nova предоставляет свои метаданные в формате OpenStack и в формате, совместимом с EC2.

Метаданные в формате OpenStack

Метаданные из OpenStack API распространяются в формате JSON. Для каждой версии предоставлены два файла: meta_data.json и network_data.json. Файл meta_data.json содержит информацию, относящуюся к Nova, а файл network_data.json содержит информацию, полученную от Neutron.

Например:

$ curl http://169.254.169.254/openstack/2018-08-27/meta_data.json

{
    "random_seed": "yu5ZnkqF2CqnDZVAfZgarG...",
    "availability_zone": "nova",
    "keys": [
        {
            "data": "ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n",
            "type": "ssh",
            "name": "mykey"
        }
    ],
    "hostname": "test.novalocal",
    "launch_index": 0,
    "meta": {
        "priority": "low",
        "role": "webserver"
    },
    "devices": [
        {
            "type": "nic",
            "bus": "pci",
            "address": "0000:00:02.0",
            "mac": "00:11:22:33:44:55",
            "tags": ["trusted"]
        },
        {
            "type": "disk",
            "bus": "ide",
            "address": "0:0",
            "serial": "disk-vol-2352423",
            "path": "/dev/sda",
            "tags": ["baz"]
        }
    ],
    "project_id": "f7ac731cc11f40efbc03a9f9e1d1d21f",
    "public_keys": {
        "mykey": "ssh-rsa AAAAB3NzaC1y...== Generated by Nova\n"
    },
    "name": "test"
}
$ curl http://169.254.169.254/openstack/2018-08-27/network_data.json
{
    "links": [
        {
            "ethernet_mac_address": "fa:16:3e:9c:bf:3d",
            "id": "tapcd9f6d46-4a",
            "mtu": null,
            "type": "bridge",
            "vif_id": "cd9f6d46-4a3a-43ab-a466-994af9db96fc"
        }
    ],
    "networks": [
        {
            "id": "network0",
            "link": "tapcd9f6d46-4a",
            "network_id": "99e88329-f20d-4741-9593-25bf07847b16",
            "type": "ipv4_dhcp"
        }
    ],
    "services": [
        {
            "address": "8.8.8.8",
            "type": "dns"
        }
    ]
}

Метаданные в формате EC2

API, совместимые с EC2, также совместимы с версией 2009-04-04 службы метаданных Amazon EC2. Поэтому образы виртуальных машин, разработанные для EC2, будут корректно работать с OpenStack.

API EC2 предоставляет отдельный URL-адрес для каждого элемента метаданных. Чтобы получить список этих элементов, выполните GET-запрос к http://169.254.169.254/2009-04-04/meta-data/.

Например:

$ 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

Виртуальные машины могут получать открытый SSH-ключ (идентифицируемый по имени пары ключей, когда пользователь запрашивает новую ВМ), отправляя GET-запрос на http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key:

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

Пользовательские данные

Пользовательские данные — это блок данных, которые пользователь может указать при запуске виртуальной машины. Виртуальная машина получает доступ к этим данным через службу метаданных или диск конфигурации. Обычно подобные данные используются для передачи скрипта оболочки, который виртуальная машина запускает при загрузке.

Пользовательские данные используются в таких приложениях, как cloud-init — пакете Ubuntu с открытым исходным кодом, доступном в различных дистрибутивах Linux, который быстро справляется с инициализацией облачной виртуальной машины.

Вы можете добавить пользовательские данные в локальный файл и включить их через параметр --user-data <user-data-file> при создании виртуальной машины:

$ openstack server create --image ubuntu-cloudimage --flavor 1 \
    --user-data mydata.file VM_INSTANCE

Примечание

Предоставленные пользовательские данные не должны быть закодированы в base64, поскольку они будут автоматически закодированы для передачи допустимых входных данных в REST API, который имеет ограничение в 65535 байт после кодирования.

После загрузки вы можете получить доступ к этим данным из виртуальной машины, используя либо службу метаданных, либо диск конфигурации. Чтобы получить к ним доступ через службу метаданных, отправьте GET-запрос к http://169.254.169.254/openstack/<версия>/user_data (формат OpenStack) либо к http://169.254.169.254/<версия>/user-data (формат EC2). Например:

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

Данные производителя

Там, где они настроены, виртуальные машины могут извлекать данные по конкретному производителю из службы метаданных или диска конфигурации. Чтобы получить к ним доступ через службу метаданных, отправьте GET-запрос в зависимости от настроек инсталляции либо к http://169.254.169.254/openstack/<версия>/vendor_data.json, либо к http://169.254.169.254/openstack/<версия>/vendor_data2.json. Например:

$ curl http://169.254.169.254/openstack/2018-08-27/vendor_data2.json
{
    "testing": {
        "value1": 1,
        "value2": 2,
        "value3": "three"
    }
}

Примечание

Наличие и содержимое данного файла варьируется в зависимости от настроек инсталляции.

Общие рекомендации

Не полагайтесь на наличие метаданных EC2 в службе метаданных или на диске конфигурации, поскольку эти данные могут быть удалены в будущем релизе. В частности, не полагайтесь на файлы в каталоге ec2.

При создании образов, которые обращаются к службе метаданных или данным диска конфигурации, и при этом многие подкаталоги с метаданными расположены внутри каталога openstack, всегда выбирайте самую новую версию API по дате, которую поддерживает ваш клиент. Например, если ваш гостевой образ поддерживает версии 2012-03-05, 2012-08-05 и 2013-04-13, сначала попробуйте 2013-04-13 и вернитесь к предыдущей версии, если 2013-04-13 отсутствует.