Скажем, у меня есть серверы приложений, серверы баз данных и несколько балансировщиков нагрузки dns-round-robin. Все это на основе изображений, созданных с помощью Упаковщик с развертыванием под управлением Terraform. Как изменить образ серверов баз данных, не уничтожая их данные, когда экземпляры уничтожаются и воссоздаются?
Самое простое, что я могу придумать, - это отключить запись, сделать снимок базы данных, а затем восстановить снимок на новых серверах. Но кажется действительно неправильным полагаться на подобное ручное возня, и также кажется неправильным отключать службу для простого обновления. Есть способ чище и лучше, правда?
Нет никаких просто ответ на этот вопрос.
Использование архитектуры, созданной на основе изображений (обычно называемой «неизменной инфраструктурой»), отлично работает для служб без сохранения состояния, таких как серверы приложений.
Совершенно определенно можно расширить это до ваших сервисов с отслеживанием состояния с помощью подходящих инструментов, систем аварийного переключения и путей обновления, но для простых систем (как та, которую вы описываете) обычно бывает слишком много.
При использовании этих инструментов следует помнить, что вам не нужно идти «ва-банк». Packer и Terraform разработаны для работы только там, где вы хотите. Они не навязывают шаблон во всех ваших системах специально.
С практической точки зрения, лучший способ справиться с этой проблемой - поддерживать серверы баз данных по-другому, вне Packer (создание исходного образа, да! Но не обязательно обновлять их так же, как и веб-серверы без сохранения состояния) или передавать управление состоянием кому-то на аутсорсинг. еще. Известные варианты включают Heroku Postgres или AWS RDS.
В заключение - да, это возможно, но с нашим текущим инструментарием это, вероятно, больше проблем, чем оно того стоит в меньшем масштабе или с простой архитектурой.
Packer и Terraform по-прежнему могут быть огромным благом в других аспектах той же самой инфраструктуры - Terraform, например, может очень просто предоставить базу данных Heroku для использования на ваших серверах приложений DigitalOcean. Packer может выполнять обновление и выпуск образов сервера приложений, а также для разработки.
Я думаю, что Terraform теперь имеет необходимые здесь функции. Базовый шаблон состоит в том, чтобы определять ваши тома данных отдельно и прикреплять их к экземплярам, чтобы при уничтожении экземпляра и создании нового (например, из нового AMI, созданного Packer) существующий том можно было присоединить к новому экземпляру.
Итак, подробные шаги с Terraform будут такими:
aws_ebs_volume
Ресурсыaws_volume_attachment
(здесь я использовал device_name = "/dev/xvdh"
) aws_ebs_volume
ресурс включает жизненный цикл правило prevent_destroy = true
(так они будут никогда быть удаленным terraform)aws_volume_attachment
ресурс включает skip_destroy = true
(при обновлении terraform не сможет уничтожить их, пока том смонтирован, и остановка экземпляров в любом случае уничтожит вложение, поэтому терраформ не должен пытаться это сделать)Последний шаг - убедиться, что экземпляр монтирует том при запуске. Этого можно достичь с помощью следующего в user_data
вашей aws_instance
ресурс:
#!/bin/bash
mkdir /data #create mount point
mount /dev/xvdh /data #mount it
Чтобы все вышеперечисленное работало, вам необходимо подготовить том, создав файловую систему, но это требуется только один раз:
mkfs -t ext4 /dev/xvdh
Более подробная информация доступна в Terraform, выпуск # 2740.