Собственный исполнитель облачных задач - вариант для тех, у кого требования к сети и данным не позволяют пользоваться управляемым сервисом. Официально поддерживаются пулы, отдельные машины и оркестрация контейнеров, очередь ожидающих запросов видна через программный интерфейс, а состояние парка - и там, и в панели управления. Для большинства команд рекомендация обратная - начинать с управляемого облака и переходить на своё только под конкретное, сформулированное требование.
Эта рекомендация не маркетинговая, и её стоит принять всерьёз. Собственный runtime переносит на вас всё, что раньше делал провайдер: обновления образов, ёмкость, наблюдаемость, изоляцию запусков друг от друга, реагирование на инциденты и уборку. Ни одна из этих обязанностей не выглядит тяжёлой по отдельности, а вместе они складываются в постоянную работу. Непропатченный привилегированный исполнитель у вас в сети опаснее управляемой машины с узкой сетевой политикой, и это не парадокс, а обычная арифметика эксплуатации: защищённость считается по слабому звену, а не по месту размещения.
Полезно один раз свести варианты в таблицу с колонкой операционной цены. Ниже такая карта: управляемое облако, собственный пул, приватная связность через сетевой сервис облачного провайдера и туннель. Ценность в правой колонке: она называет не преимущества, а обязанности, которые придут вместе с выбором. Читать её стоит как список будущих дежурств, а не как список возможностей.
| Выбор | Сильная сторона | Операционная цена |
|---|---|---|
| Управляемое облако | Готовая изоляция, ёмкость и артефакты | Данные и исходящий трафик идут через настроенную границу |
| Собственный пул | Исполнение внутри вашей инфраструктуры | Обновления, ёмкость, наблюдаемость, изоляция и инциденты - ваши |
| Приватная связность провайдера | Частный трафик к репозиториям и реестрам | Балансировщики, точки подключения, DNS, регионы |
| Туннель | Только исходящее соединение без входящих правил | Жизненный цикл токенов и эксплуатация клиента туннеля |
Приватная связность нужна тогда, когда репозитории и реестры пакетов недоступны из интернета. Поддерживаются два основных пути, и у обоих есть жёсткие требования: защищённое соединение на стандартном порту, публично доверенный сертификат и подтверждённое владение доменом. Самоподписанные сертификаты, незашифрованные соединения, доступ по протоколу удалённой оболочки, нестандартные порты и точки, доступные только по новой версии сетевого протокола, в этих сценариях не поддерживаются.
Эти ограничения полезно знать до проектирования, а не после. Типичная схема во внутренней сети как раз и построена на самоподписанных сертификатах и нестандартных портах: внутри периметра так проще, и годами никто не жалуется. Именно она и не подойдёт. Значит, подключение внутреннего репозитория потребует не только сетевой работы, но и приведения его к требованиям: нормальный сертификат, нормальный порт, нормальное имя, подтверждённое владение доменом. Эту работу лучше запланировать заранее, чем обнаружить её в день внедрения.
Сравнивать варианты стоит по полной системе, а не по одному свойству. Изоляция, происхождение образов, хранение секретов, исходящий трафик, обновления, журналы, уборка и дежурство - вот из чего складывается реальная безопасность. Слово self-hosted само по себе не улучшает ни один из этих пунктов; оно лишь переносит ответственность за них на вашу команду. Управляемое облако не отменяет ни одного из них - оно закрывает их за вас, и это ровно та услуга, за которую вы платите.
Операционная цена звучит абстрактно, пока не разложить её на конкретные дежурства. Кто обновляет базовые образы и с какой периодичностью. Кто следит за тем, чтобы запуски не видели друг друга. Кто убирает за завершёнными задачами - контейнеры, артефакты, временные каталоги. Кто хранит журналы и сколько. Кто отвечает ночью, если исполнители перестали брать работу. У последнего пункта есть видимый признак: очередь ожидающих запросов начинает расти, а задачи стоят. В управляемом облаке это чужая проблема ёмкости, у себя - ваша, и решать её надо в момент, когда команда ждёт результата.
Само решение стоит принимать по написанному требованию, а не по ощущению. Если требование звучит как данные определённого класса не покидают наш периметр или сборка должна идти в сети, недоступной снаружи, - собственный исполнитель уместен. Если оно звучит как хочется больше контроля, это не требование, а предпочтение, и оно обойдётся дороже, чем кажется. Полезно помнить и о том, что два решения независимы: где живёт исполнитель и как он дотягивается до закрытых ресурсов. Управляемое облако вместе с приватной связностью к внутреннему репозиторию закрывает многие случаи, ради которых команды берутся поднимать свой runtime целиком.
Инженерный вывод простой: выбирайте собственный runtime тогда, когда у вас есть кому его эксплуатировать. Если ответ на вопрос кто патчит образы и кто дежурит по инцидентам звучит неуверенно, управляемое облако с узкой политикой окажется и безопаснее, и дешевле. А приватную связность разворачивают под конкретное требование, а не на всякий случай: у неё тоже есть своя цена в виде сетевой обвязки, имён и жизненного цикла токенов.
Типичные провалы предсказуемы. Считать собственный исполнитель безопаснее по определению. Спроектировать приватный доступ на самоподписанных сертификатах и нестандартных портах. Развернуть пул без владельца, мониторинга и плана обновления. Не заметить, что очередь растёт, пока команда ждёт. И перенести в свою инфраструктуру то, что прекрасно жило в управляемой среде, ради ощущения контроля.