В настоящее время я использую кластер Kubernetes, работающий на голых металлических узлах с Ansible. Есть планы перейти в облако, и я читаю о Terraform и Packer, готовясь к этому. Если оставить в стороне миграцию данных, похоже, что для нас существует довольно простой путь миграции:
- Создайте образ с помощью Packer, используя наши существующие скрипты Ansible
- Разверните созданный образ в облаке с помощью Terraform
- Разверните наши ресурсы Kubernetes с помощью наших текущих инструментов
Все отлично. Теперь у нас есть неизменная инфраструктура с использованием самых современных инструментов.
Я изо всех сил пытаюсь понять, как образуются версии образов, созданных с помощью Packer. Где-то в будущем нам придется обновить некоторое программное обеспечение в этих образах. Иногда сценарии Ansible меняются, но иногда это просто вопрос наличия последних обновлений безопасности в образе. В любом случае Packer должен будет создать для нас новый образ, и нам придется развернуть его с помощью Terraform. Если новое изображение вызывает проблемы, нам придется вернуться к старому.
Я могу представить, как это можно сделать вручную, отредактировав шаблон перед его запуском, а затем отредактировав конфигурацию terraform, чтобы выбрать новую версию, но это не сработает для конвейера CI / CD. Другая проблема в том, что мы можем перемещаться между разными регионами и поставщиками. Таким образом, версия изображения может присутствовать в одной области, но не в другой, и в идеале конвейер должен создавать изображение, если оно не существует, и использовать существующее, если оно уже существует. Это может привести к тому, что образы в разных регионах или облаках будут разными, особенно потому, что они могут быть созданы в разные дни и иметь разные обновления безопасности.
Все это встроено в рабочий процесс Docker, но с Packer далеко не очевидно, что делать. Я не нашел никакой документации или руководств по этой теме. Есть ли в Packer и Terraform какие-либо встроенные функции управления версиями? Может ли Terraform вызвать Packer, если изображение отсутствует? Есть ли какая-нибудь передовая практика?
Я могу представить себе автоматизацию этого, используя API от облачного провайдера для проверки наличия необходимых изображений и вызова Packer для любых отсутствующих изображений перед запуском Terraform. Это сработает, но я бы не хотел писать индивидуальную интеграцию для каждого облачного провайдера, и это похоже на то, что уже должно быть предоставлено Terraform. Я раньше не использовал Terraform, поэтому, может быть, я просто не знаю, где искать, и, может быть, это не так сложно реализовать в Terraform, но тогда почему нет никаких руководств, показывающих мне, как?