Создание и использование снимков OpenStack

Что такое снимок в публичном облаке OpenStack / OVHcloud?

Снимок — это механизм, позволяющий создать новый образ из запущенного экземпляра. В основном это служит двум целям:

  1. В качестве механизма резервного копирования: сохраните основной диск вашего экземпляра в образ, а затем загрузите новый экземпляр из этого образа с сохраненными данными.
  2. В качестве механизма шаблонов: настройте базовое изображение и сохраните его для использования в качестве шаблона для новых экземпляров.



Можно делать снимки экземпляров, когда они работают или остановлены. Проще говоря, снимки — это изображения со следующими дополнительными свойствами:



Как создать снимок
Использование интерфейса командной строки

Чтобы создать моментальный снимок экземпляра с помощью интерфейса командной строки, используйте следующую команду:

# 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, поэтому в целях единообразия мы не устанавливаем пакет ни в какой дистрибутив.

Источники:
  • Запись в блоге Себастьяна Хана «OpenStack: выполнение согласованных снимков» [1]
  • Вики-статья proxmox о гостевом агенте QEMU [2]
  • Документация Fedora по созданию образов Windows с драйверами virtIO [3]

Работа с небольшими файлами с помощью OpenStack Swift (часть 1)

OpenStack Swift — это распределенная система хранения, которую легко масштабировать по горизонтали с использованием стандартных серверов и дисков.

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



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

Как Swift хранит файлы?

Узлы, отвечающие за хранение данных в кластере Swift, являются «объектными серверами». Чтобы выбрать серверы объектов, которые будут содержать определенный объект, Swift полагается на согласованное хеширование:

На практике, когда объект загружен, контрольная сумма MD5 будет вычисляться на основе имени объекта. Из этой контрольной суммы будет извлечено некоторое количество битов, что даст нам номер «раздела».

Номер раздела позволяет вам посмотреть на «кольцо», чтобы увидеть, на каком сервере и диске должен храниться этот конкретный объект. «Кольцо» — это соответствие между номером раздела и серверами объектов, которые должны хранить объекты, принадлежащие этому разделу.

Давайте посмотрим на пример. В этом случае мы будем использовать только 2 бита из контрольной суммы md5 (слишком мало, но рисовать гораздо проще! Всего 4 раздела)



При загрузке файла, от его имени и других элементов, мы получаем контрольную сумму md5, 72acded3acd45e4c8b6ed680854b8ab1. Если мы возьмем 2 старших бита, мы получим раздел 1.

Из кольца объектов мы получаем список серверов, на которых должны храниться копии объекта.

При рекомендованной настройке Swift вы сохраните три идентичные копии объекта. Для одной загрузки мы создаем три реальных файла на трех разных серверах.

Политика Swift

Мы только что видели, как наиболее распространенная политика Swift — хранить идентичные копии объекта.

Это может быть немного дорого для некоторых случаев использования, и Swift также поддерживает политики «стирания кодирования».

Давайте сравним их сейчас.

«Политика реплик», которую мы только что описали. Вы можете выбрать, сколько копий объектов вы хотите сохранить.



Тип политики «кодирование стирания»



Объект разбивается на фрагменты с добавлением лишних частей, чтобы можно было реконструировать объект, если диск, содержащий фрагмент, выйдет из строя.

В OVHcloud мы используем политику 12 + 3 (12 частей от объекта и 3 вычисляемых части)

Этот режим более экономичен, чем репликация, но он также создает больше файлов в инфраструктуре. В нашей конфигурации мы должны создать 15 файлов в инфраструктуре, а не 3 файла со стандартной политикой «репликации».

Почему это проблема?

В кластерах, где у нас есть комбинация политики кодирования стирания и среднего размера объекта 32 КБ, мы получим более 70 миллионов файлов * на диск *.

На сервере с 36 дисками это 2,5 миллиарда файлов.

Кластеру Swift необходимо регулярно перечислять эти файлы, чтобы:

  • Подавать объект покупателям
  • Обнаружение битовой гнили
  • Реконструировать объект, если фрагмент был потерян из-за сбоя диска

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

В следующем посте мы увидим, как мы это решили.

Понимание CI / CD для больших данных и машинного обучения

На этой неделе команда OVH Integration and Continuous Deployment была приглашена на подкаст DataBuzzWord .



Вместе мы исследовали тему непрерывного развертывания в контексте машинного обучения и больших данных. Мы также обсудили непрерывное развертывание для таких сред , как Kubernetes , Docker, OpenStack и VMware VSphere .

Если вы его пропустили или хотите пересмотреть все, что обсуждалось, вы можете прослушать его еще раз здесь . Мы надеемся скоро вернуться, чтобы продолжить разделять нашу страсть к тестированию, интеграции и непрерывному развертыванию.

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

Найдите CDS на GitHub:


…. и подписывайтесь на нас в Twitter:


Обсудите эти темы с нами на нашем канале Gitter: https://gitter.im/ovh-cds/