Docker — Запекание Неизменяемых Изображений

  • Автор темы Yingl25hco
  • Обновлено
  • 22, Oct 2024
  • #1

Я работаю над проектом, и мы пытаемся испечь неизменяемые изображения в контейнерах как IaC. Эти образы могут содержать приложения J2EE, .NET или Python. К этому образу следует часто применять все исправления ОС, а также обновлять обновления приложений для этих готовых к запуску образов.

При этом обсуждаемый нами вариант включает Terraform для подготовки и Packer для создания образов. Многие интернет-ресурсы дополнительно используют Ansible, Chef или Puppet. Мой вопрос, почему Packer недостаточно для покрытия изображений для выпечки, почему мне нужно дополнительно рассмотреть Ansible/Chef/Puppet? Что Пакер не может сделать, а другие могут для удовлетворения этих требований?

Yingl25hco


Рег
27 Jan, 2011

Тем
72

Постов
179

Баллов
559
  • 25, Oct 2024
  • #2

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

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

Пакер предназначен в качестве строительного блока для неизменный инфраструктура. Он предназначен для организации создания настраиваемых образов, которые немедленно загружаются в желаемое состояние. Если неизменяемая инфраструктура подходит для вашего случая использования (что не обязательно так!), тогда действительно такие инструменты, как Ansible, Chef и Puppet. может быть ненужным.

Однако запуск этих инструментов в «однократном» режиме (например, Шеф-повар Соло) с Packer часто может быть полезен для нетривиальных образов: эти инструменты обычно предоставляют более мощные абстракции, чем предоставляет только Packer, что упрощает такие действия, как настройка системы инициализации для запуска определенных служб или создание учетных записей пользователей. В этом случае инструмент управления конфигурацией будет работать как поставщик в Packer создает необходимую конфигурацию внутри образа, но не участвует в текущем обслуживании экземпляров, загружаемых из образа.

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

 

GepTwelvephem


Рег
07 May, 2020

Тем
79

Постов
190

Баллов
655
  • 25, Oct 2024
  • #3

Генерация и распространение изображений быстро возрастает до O(n^2) или выше, а поскольку terraform явно ориентирован на создание экземпляров, он полагается на внешние поставщики внутреннего состояния.

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

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

Например, предположим, что вы хотите развернуть новую версию модуля Python. Если у вас есть колесо или файл требований.txt, вы можете развернуть его у облачного провайдера a,b,c в версиях ОС c и d. Но при использовании полностью запеченных изображений вам придется создавать и тестировать изображения a_c, b_c, c_c, a_d, b_d,c_d. Если вам придется делать это за итерацию, затраты на продуктивность разработчиков вырастут очень быстро.

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

Поскольку контейнеры в целом сейчас работают по доверенной модели, и для любого процесса или человека, имеющего доступ к запуску машины в таких средах, как Docker, довольно просто вносить произвольные изменения во что-либо в системе (каждый пользователь API является пользователем root, даже на хосте для докера) это непредвиденная ситуация, которую вы хотите учитывать.

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

Если вы поддерживаете конфигурацию terraform для GCE, AWS и Azure, конфигурацию упаковщика для каждой ОС, а затем метод развертывания приложения отдельно, это может увеличить первоначальную сложность, но эти затраты быстро окупятся в течение всего жизненного цикла проекта.

Лично я нахожу такой инструмент, как ansible, который можно запускать без централизованной инфраструктуры и который может вносить организованные изменения на основе состояния, чтобы быть более гибким в чистой модели развертывания, но в какой-то момент мне всегда приходилось модифицировать ту или иную форму управления конфигурацией. .

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

 

Zuw370skestSoky


Рег
28 May, 2011

Тем
75

Постов
168

Баллов
583
  • 25, Oct 2024
  • #4

Я не вижу связи между упаковщиком и ansible/chef/puppet так, как вы. Packer может дать вам возможность заявить, что вы создаете образ, но если вы не собираетесь использовать что-то вроде ansible/chef/etc для загрузки того, что вам нужно в этот образ, то как вы предлагаете поместить этот материал в изображение?

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

Я некоторое время работал над проектом, в котором мы приняли сознательное решение вообще не писать сценарии оболочки, даже там, где это немного менее удобно, мы пишем все на четко определенном, предпочтительно декларативном языке, который кто-то другой поддерживает стандарты (т. е. нам не нужно быть уверенным, что ansible может делать то, что нам нужно, мы позволяем разработчикам делать это, вместо того, чтобы писать все сценарии и писать все подробные действия самостоятельно ).

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

 

Рауль Ягудин


Рег
24 Oct, 2020

Тем
71

Постов
223

Баллов
608
Тем
403,760
Комментарии
400,028
Опыт
2,418,908