[Перевод] Эфемерные контейнеры в Kubernetes
Предисловие
С версии Kubernetes 1.16 была добавлена возможность запуска эфемерных контейнеров (Ephemeral Containers). Эта функция позволяет запускать временные контейнеры в рамках существующих Pod’ов, чтобы помочь в диагностике и отладке проблем, а также для выполнения различных задач в рамках существующего окружения.
Эфемерные контейнеры не заменяют существующие контейнеры в Pod’ах, а запускаются рядом с ними в рамках того же сетевого пространства и с теми же точками монтирования. Это означает, что эфемерные контейнеры могут легко получить доступ к ресурсам Pod’а, таким как файловая система или сетевые интерфейсы.
Нужны ли вообще эфемерные контейнеры
Как дебажить приложения в Kubernetes?
Запекать в боевой образ контейнера полный набор пользовательских утилит и инструментов отладки приведет к разросшемуся образу с добавленными векторами атак. Копировать отладочный набор в уже запущенные контейнеры слишком неудобно и не всегда возможно (как минимум, в контейнере должен быть доступен tar
). Но даже если мы получили нужные инструменты в контейнере, kubectl exec
вряд ли поможет, если контейнер застрял в цикле падений (CrashLoopBackOff).
Какие еще у нас есть варианты для отладки при отсутствии возможности менять спецификации подов?
Можно, конечно, дебажить напрямую с Kubernetes ноды, но SSH доступ не всегда в наличии. Возможно, остается не так уж и много вариантов…
Если только мы немного не ослабим требование к иммутабельности спецификации пода!
А что если можно было бы добавлять новые, немного ограниченные в своих возможностях, контейнеры к уже запущенному поду без его перезагрузки? Поды это всего лишь группы полувзаимосвязанных контейнеров, и изоляция между ними в рамках одного пода слабая. И таким образом, новый контейнер можно было бы использовать, чтобы проникать в другие контейнеры и снимать с них данные, в том числе отладочные, независимо от их состояния и содержимого.
И так родилась идея Эфемерного Контейнера — «контейнера специального назначения, который запускается на некоторое время в существующем поде, чтобы выполнить пользовательские действия, например, с целью поиска и устранения причин сбоев».