Создание и использование снимков OpenStack
Что такое снимок в публичном облаке OpenStack / OVHcloud?
Снимок — это механизм, позволяющий создать новый образ из запущенного экземпляра. В основном это служит двум целям:
- В качестве механизма резервного копирования: сохраните основной диск вашего экземпляра в образ, а затем загрузите новый экземпляр из этого образа с сохраненными данными.
- В качестве механизма шаблонов: настройте базовое изображение и сохраните его для использования в качестве шаблона для новых экземпляров.
Можно делать снимки экземпляров, когда они работают или остановлены. Проще говоря, снимки — это изображения со следующими дополнительными свойствами:
Как создать снимок
Использование интерфейса командной строкиЧтобы создать моментальный снимок экземпляра с помощью интерфейса командной строки, используйте следующую команду:
# Load your OpenStack credentials
$ source openrc
# Using the openstack client
$ openstack server image create --name <name of the new image> <instance name or uuid>
# Or using the nova client (deprecated)
$ nova image-create <instance name or uuid> <name of the new image>
Использование Horizon
После входа в Horizon вы можете создать моментальный снимок на странице « Вычислить» → «Экземпляры », щелкнув действие «Создать моментальный снимок».
Статус снимка и информацию о нем можно найти на странице Compute → Images.
Затем вы можете выбрать снимок при создании нового экземпляра.
Снимки в реальном времени и согласованность данных
Мы называем моментальный снимок, сделанный для работающего экземпляра без простоя, «живым моментальным снимком».
Эти моментальные снимки представляют собой просто моментальные снимки только для диска и могут быть несовместимыми, если ОС экземпляра не знает, что моментальный снимок делается.
Это происходит, когда гипервизор останавливает экземпляр, чтобы разрешить создание «дельта-файла» перед возобновлением выполнения экземпляра. Это сделано для предотвращения записи экземпляра непосредственно на свой диск во время копирования. По завершении копирования экземпляр снова замораживается, чтобы позволить «дельту» слиться с диском экземпляра, а затем выполнение возобновляется с полностью объединенным диском.
Несоответствия могут появиться при первом зависании, если экземпляр не знает, что гипервизор делает снимок, потому что приложениям и ядру, работающим на экземпляре, не сказано очищать свои буферы.
Обеспечение согласованности снимков
OpenStack Nova полагается на QEMU для управления виртуальными машинами. QEMU также предоставляет инструменты для связи с агентом, установленным на экземпляре, чтобы позволить ему выполнять определенные действия перед моментальным снимком.
Эта связь происходит через виртуальное устройство, добавленное к экземпляру, когда OpenStack Nova обнаруживает, что используемое изображение имеет следующее свойство: hw_qemu_guest_agent set to yes.
Для ранее созданного личного образа вы можете установить свойства с помощью этой команды:
# Using the openstack client
$ openstack image set --property hw_qemu_guest_agent=yes <image name or uuid>
# Or using the glance client (deprecated)
$ glance image-update --property hw_qemu_guest_agent=yes <image name or uuid>
Чтобы проверить, что свойства действительно установлены, используйте следующую команду:
$ openstack image show -f value -c properties <image name or uuid>
На следующей диаграмме показан рабочий процесс создания снимка в этих условиях:
Конкретный шаг, который предотвращает любые несоответствия, — это №6: QEMU-agent замораживает файловую систему.
Настройка агента QEMU
Linux
Qemu-guest-agent не установлен по умолчанию, но после его установки и запуска механизм замораживания / размораживания файловой системы будет работать сразу после установки.
Вы можете проверить, настроен ли ваш экземпляр для связи с гипервизором, проверив конкретное устройство:
$ file /dev/virtio-ports/org.qemu.guest_agent.0
/dev/virtio-ports/org.qemu.guest_agent.0: symbolic link to `../vport2p1'
Если этого файла нет, гостевой агент qemu не будет работать, а это значит, что для вашего образа не установлено hw_qemu_guest_agentсвойство yes.
Дистрибутивы на основе Debian (Debian, Ubuntu)
# Install the agent
user@agent:~$ sudo apt-get update
user@agent:~$ sudo apt-get install qemu-guest-agent
# Check the agent is started (it should be automatically started and enabled)
user@agent:~$ sudo service qemu-guest-agent status
Распределения на основе Redhat (Centos, Fedora)
# Install the agent
user@agent:~$ sudo yum install qemu-guest-agent
# Enable the agent
user@agent:~$ sudo chkconfig qemu-guest-agent on
# Start the agent
user@agent:~$ sudo service qemu-guest-agent start
# Check the agent is started
user@agent:~$ sudo service qemu-guest-agent status
Windows
Загрузите и установите MSI, связанный с вашей архитектурой (32- или 64-разрядные версии, хотя мы рекомендуем 64-разрядные версии для публичного облака) из проекта Fedora: fedorapeople.org/groups/virt/virtio-win/direct-downloads/ последний-qemu-ga /
Вы можете проверить, что служба запущена, используя эту команду powershell:
PS C:\Users\Administrator> Get-Service QEMU-GA
Status Name DisplayName
------ ---- -----------
Running QEMU-GA QEMU Guest Agent
Документацию Fedora по созданию образов Windows с драйверами virtIO можно найти здесь. [2]
Расширенное использование: перехватчики агента QEMU
Можно добавить сценарии, которые будут запускаться до замораживания файловой системы агентом и после ее размораживания.
Пример ниже выполнен в Debian 9, поэтому конфигурацию, возможно, придется скорректировать для других дистрибутивов.
Кроме того, в некоторых дистрибутивах уже есть ловушка fsfreeze.
Добавьте скрипт fsfreeze-hook
Во-первых, нам нужно добавить и активировать механизм fsfreeze-hook:
# Create the folders to receive the hooks
debian@agent:~$ sudo mkdir -p /etc/qemu/fsfreeze-hook.d
# Download the fsfreeze-hook from the QEMU repository
debian@agent:~$ sudo wget -O /etc/qemu/fsfreeze-hook https://raw.githubusercontent.com/qemu/qemu/master/scripts/qemu-guest-agent/fsfreeze-hook
debian@agent:~$ sudo chmod +x /etc/qemu/fsfreeze-hook
# Add the configuration of the qemu-guest-agent daemon to use this script
debian@agent:~$ sudo tee /etc/default/qemu-guest-agent > /dev/null <<EOF
DAEMON_ARGS="-F/etc/qemu/fsfreeze-hook"
EOF
# Restart the service to take the modifications into account
debian@agent:~$ sudo service qemu-guest-agent restart
Пример скрипта перехвата
/etc/qemu/fsfreeze-hook cкрипт позволяет пользователям добавлять пользовательские скрипты, которые будут выполняться до и после замораживания файловой системы.
Добавим тест, который записывает в файл при замораживании и оттаивании экземпляра:
debian@agent:~$ sudo tee /etc/qemu/fsfreeze-hook.d/test_hook.sh > /dev/null <<EOF
#!/bin/bash
case \$1 in
freeze)
echo "I'm frozen" > /tmp/freeze
;;
thaw)
echo "I'm thawed" >> /tmp/freeze
;;
*)
exit 1
;;
esac
EOF
debian@agent:~$ sudo chmod +x /etc/qemu/fsfreeze-hook.d/test_hook.sh
Будьте очень осторожны с пользовательскими сценариями ловушек. В случае неудачи снимок будет полностью заброшен и уничтожен. Если вы не можете найти образ, который должен был быть создан с помощью снимка, вероятно, это связано с ошибкой одного из сценариев. В этом случае проверьте журнал экземпляра qemu-agent.
Сделайте снимок своего экземпляра:
$ openstack server image create --name test_snapshot <instance name or uuid>
Убедитесь, что тестовый хук запущен:
# It works!
debian@agent:~$ sudo cat /tmp/freeze
I'm frozen
I'm thawed
Очистите тест:
debian@agent:~$ sudo rm /etc/qemu/fsfreeze-hook.d/test_hook.sh /tmp/freeze
Почему это не включено по умолчанию?
Qemu-guest-agent не установлен по умолчанию в большинстве дистрибутивов. Так почему бы нам не добавить его по умолчанию в предоставляемые нами базовые изображения?
Проблема в том, что нам юридически не разрешено изменять содержимое базовых образов, предоставляемых Ubuntu, поэтому в целях единообразия мы не устанавливаем пакет ни в какой дистрибутив.
Источники: