INTEGRITY Документация

Развёртывания

Как работает развёртывание

A развертывание применяет целевую конфигурацию приложения контейнера после того, как вы deploy Worker, который использует Containers. Целевая конфигурация может изменить образ, тип экземпляра, лимиты, размещение или другие настройки контейнера.

A экземпляр контейнера это один запущенный экземпляр образа вашего контейнера в сети Cloudflare. Он выполняет процесс, который запускает ваш образ (ENTRYPOINT/CMD в Dockerfile, либо значение по умолчанию из базового образа). Когда целевой образ меняется, развёртывание заменяет экземпляры контейнера копиями, использующими новый образ. Такие развёртывания не изменяют хранилище Durable Object.

Когда эффективная конфигурация уже развёрнутого контейнерного приложения меняется, wrangler deploy:

  1. Загружает и активирует новую версию Worker, включая код класса Durable Object.
  2. При необходимости собирает и отправляет образ по Dockerfile, либо использует образ из настроенного реестра.
  3. Запускает развёртывание для применения целевой конфигурации контейнера.

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

При смене образа новый код Worker может обращаться к экземплярам контейнера на предыдущем образе до завершения развёртывания. Предпочтительно вносить согласованные изменения Worker и образа, которые продолжают работать вместе в течение этого периода, либо выбрать immediate если нужно самое короткое смешанное окно, допустимое платформой.

Названия полей и допустимые значения перечислены в разделе Конфигурация Containers.

Значения по умолчанию

Параметр По умолчанию
rollout_step_percentage 100 если max_instances опущен или меньше 2; иначе [10, 100]
rollout_active_grace_period 0 секунд
Последовательность остановки при замене экземпляра контейнера SIGTERM основному процессу, затем SIGKILL через 15 минут, если он не завершился

Постепенные развёртывания

По умолчанию Wrangler запускает поэтапное развёртывание с помощью rollout_step_percentage. Если max_instances опущен или меньше 2, Wrangler использует один 100 шаг. В противном случае Wrangler запросит [10, 100]:

  1. Запрашивается развёртывание примерно 10% экземпляров контейнеров с новой конфигурацией. Платформа увеличивает этот процент при необходимости, чтобы шаг охватывал как минимум один экземпляр при настроенном max_instances.
  2. Применяет новую конфигурацию сразу к 100% экземпляров контейнера.

Настройте шаги с помощью rollout_step_percentage в Wrangler. Чтобы переопределить тарифный план по умолчанию для одного развёртывания, используйте --containers-rollout.

Как заменяется экземпляр контейнера

Когда развёртывание выбирает экземпляр контейнера для обновления:

  1. Период ожидания (если настроен). Если rollout_active_grace_period больше, чем 0, экземпляры контейнеров, которые лишь недавно подключились к своему Durable Object пропускаются, пока не пройдут это окно. По умолчанию 0 означает отсутствие дополнительного ожидания. См. Период ожидания активного развёртывания.
  2. Сигнал остановки. Платформа отправляет SIGTERM основному процессу в контейнере, чтобы он мог прекратить приём новой работы и завершить уже начатую. Обрабатывайте SIGTERM в образе, если этому процессу требуется очистка перед завершением.
  3. Дренируйте. У процесса есть до 15 минут на завершение после SIGTERM.
  4. При необходимости выполните принудительную остановку. Если процесс всё ещё выполняется через 15 минут, платформа отправляет SIGKILL.
  5. После завершения. Класс Container onStop хук может выполняться в Worker после завершения процесса контейнера.
  6. Запуск нового экземпляра контейнера с целевым образом. Диск временный если вы не храните данные вне файловой системы контейнера.

Каждый выбранный экземпляр контейнера проходит эту последовательность по собственному графику. Весь флот не перезапускается одновременно.

Запросы во время запуска экземпляра контейнера

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

Запрос, которому нужен этот экземпляр контейнера, может ждать его готовности либо завершиться ошибкой, если тайм-аут клиента или Worker короче времени запуска. Делайте работу при запуске как можно быстрее, используйте проверки готовности портов, если вы их настраиваете, и задавайте тайм-ауты с учётом времени запуска.

Период ожидания активного развёртывания

rollout_active_grace_period применяется только во время развёртывания, когда платформа выбирает, какие экземпляры контейнера заменить.

Containers являются на основе Durable Objects. Каждый запущенный экземпляр контейнера связан с экземпляром Durable Object, который запускает его и направляет ему трафик. Период ожидания определяет, как долго это соединение должно уже действовать, прежде чем развёртывание сможет остановить контейнер. Он отсчитывается не от завершения развёртывания.

Значение Эффект
0 (по умолчанию) Без дополнительной защиты. Выбранные экземпляры контейнеров могут быть заменены, как только до них дойдёт развёртывание.
Больше 0 (например, 300) Экземпляры Container, которые были подключены к своему Durable Object менее указанного числа секунд, остаются нетронутыми, пока не выйдут за пределы этого окна.

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

rollout_active_grace_period применяется в любом режиме развёртывания, включая immediate.

Режимы развёртывания

--containers-rollout применяется к wrangler deploy только. Это не относится к wrangler versions upload.

При полном развёртывании Wrangler активирует Worker до обработки образа контейнера и развёртывания. Режим развёртывания определяет, как применяется целевая конфигурация контейнера.

Режим Флаг Экземпляры Container
Постепенный (по умолчанию) без флага Используйте rollout_step_percentage, который может содержать один или несколько шагов
Immediate --containers-rollout=immediate Развёртывание на 100% экземпляров контейнера за один шаг
None --containers-rollout=none Оставить образы и запущенные экземпляры контейнеров без изменений; развернуть только код Worker

Immediate

Immediate задаёт для плана развёртывания единственный шаг, охватывающий 100% экземпляров контейнеров. Промежуточных этапов по проценту нет.

npx wrangler deploy --containers-rollout=immediate

Используйте immediate, если код Worker и образ контейнера должны оставаться совместимыми и нужно, чтобы смешанное окно было как можно короче (например, при критическом изменении в том, как Worker взаимодействует с процессом в образе).

Поведение:

None

None оставляет образы и запущенные экземпляры контейнеров без изменений и разворачивает только код Worker.

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

Пример конфигурации

rollout_active_grace_period 300 секунд (пять минут), а шаг составляет [10, 100]:

{
	"containers": [
		{
			"max_instances": 10,
			"class_name": "MyContainer",
			"image": "./Dockerfile",
			"rollout_active_grace_period": 300,
			"rollout_step_percentage": [10, 100],
		},
	],
	"durable_objects": {
		"bindings": [
			{
				"name": "MY_CONTAINER",
				"class_name": "MyContainer",
			},
		],
	},
	"migrations": [
		{
			"tag": "v1",
			"new_sqlite_classes": ["MyContainer"],
		},
	],
}
[[containers]]
max_instances = 10
class_name = "MyContainer"
image = "./Dockerfile"
rollout_active_grace_period = 300
rollout_step_percentage = [ 10, 100 ]

[[durable_objects.bindings]]
name = "MY_CONTAINER"
class_name = "MyContainer"

[[migrations]]
tag = "v1"
new_sqlite_classes = [ "MyContainer" ]