В процессе сборки и публикации образов приложений Docker-слои создаются, но никогда не удаляются. Как следствие, хранилище стадий и репозиторий образов в Docker registry постоянно увеличивается в размерах, требуя все больше и больше ресурсов. Прерванная сборка образа также оставляет после себя образы, которые уже никогда не будут использоваться. В случае удаления ветки или тега в git, соответствующие стадии, использованные для сборки образа, также остаются в хранилище стадий и Docker registry.

Таким образом, необходимо периодически производить очистку от неиспользуемых образов как хранилища стадий, так и Docker registry.

В werf реализован эффективный многоуровневый алгоритм очистки образов, использующий следующие подходы:

  1. Очистка по политикам
  2. Ручная очистка
  3. Очистка хоста

Очистка по политикам

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

Очистка по политикам состоит из двух шагов и выполняется в следующем порядке:

  1. Очистка Docker registry очищает Docker registry от неиспользуемых, старых, неактуальных образов в соответствии с политикой очистки.
  2. Очистка хранилища стадий синхронизирует состояние хранилища стадий с состоянием репозиториев в Docker registry.

Оба указанных способа очистки объединены в команде werf cleanup, при которой сначала выполняется удаление неактуальных образов проекта из Docker registry, а затем — синхронизация хранилища стадий с Docker registry.

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

Очистка Docker registry

В werf реализована возможность автоматической очистки Docker registry, которая работает согласно определенных правил — политик очистки. Политики очистки определяют, какие образы можно удалять, а какие — нет.

Политики очистки

  • по веткам:
    • Каждый новый коммит обновляет образ соответствующий git-ветке (т.о. существует только один Docker-тег для каждой ветки git-репозитория).
    • werf удаляет образ из Docker registry в случае отсутствия в git-репозитории соответствующей ветки. Образ никогда не удаляется, пока существует соответствующая ветка в git-репозитории.
    • Политика применяется к образам, которые тегированы werf при использовании параметра запуска --tag-git-branch.
  • по коммитам:
    • werf удаляет образ из Docker registry в случае отсутствия в git-репозитории соответствующего коммита.
    • Для остальных образов применяется следующая политика:
      • git-commit-strategy-expiry-days.

        Оставлять образы в Docker registry не старше указанного количества дней с момента их публикации. Для повторно опубликованного в Docker registry образа указанное количество дней считается с момента новой публикации.

        По умолчанию: -1, т.е. лимит отключен.

        Значение может быть установлено с помощью опции запуска werf --git-commit-strategy-expiry-days, либо переменной окружения $WERF_GIT_COMMIT_STRATEGY_EXPIRY_DAYS.

      • git-commit-strategy-limit.

        Оставлять в Docker registry не более чем указанного количества образов.

        По умолчанию: -1, т.е. лимит отключен.

        Значение может быть установлено с помощью опции запуска werf --git-commit-strategy-limit, либо переменной окружения $WERF_GIT_COMMIT_STRATEGY_LIMIT.

    • Политика применяется к образам, которые тегированы werf при использовании параметра запуска --tag-git-commit.
  • по тегам:
    • werf удаляет образ из Docker registry в случае отсутствия в git-репозитории соответствующего тега.
    • Для остальных образов применяется следующая политика:
      • git-tag-strategy-expiry-days.

        Оставлять образы в Docker registry не старше указанного количества дней с момента их публикации. Для опубликованного в Docker registry повторно образа указанное количество дней считается с момента новой публикации.

        По умолчанию: -1, лимит отключен.

        Значение может быть установлено с помощью опции запуска werf --git-tag-strategy-expiry-days, либо переменной окружения $WERF_GIT_TAG_STRATEGY_EXPIRY_DAYS.

      • git-tag-strategy-limit.

        Оставлять в Docker registry не более чем указанного количества образов.

        По умолчанию: -1, лимит отключен.

        Значение может быть установлено с помощью опции запуска werf --git-tag-strategy-limit, либо переменной окружения $WERF_GIT_TAG_STRATEGY_LIMIT.

    • Политика применяется к образам, которые тегированы werf при использовании параметра запуска --tag-git-tag.

Обратите внимание, что политика очистки применяется только к образам собранным werf и тегированным werf при использовании одного из следующих параметров запуска: --tag-git-branch, --tag-git-tag or --tag-git-commit. Остальные образы в Docker registry, даже собранные с помощью werf, остаются неизменными.

Белый список образов

При очистке по политикам никогда не удаляется в Docker registry образ, пока в кластере Kubernetes существует объект использующий такой образ. Другими словами, если вы запустили что-то в вашем кластере Kubernetes, то используемые образы ни при каких условиях не будут удалены.

При запуске очистки werf сканирует следующие типы объектов в кластере Kubernetes: pod, deployment, replicaset, statefulset, daemonset, job, cronjob, replicationcontroller.

Описанное поведение, — проверка объектов в кластере при очистке, может быть отключено параметром --without-kube.

Подключение к кластеру Kubernetes

werf получает информацию о кластерах Kubernetes и способах подключения к ним из файла конфигурации kubectl — ~/.kube/config. Для сбора информации об используемых объектами образах, werf подключается ко всем кластерам Kubernetes, описанным во всех контекстах конфигурации kubectl.

Очистка хранилища стадий

Выполнение очистки хранилища стадий с помощью команды werf stages cleanup необходимо, чтобы синхронизировать его состояние с состоянием Docker registry.

Выполняя эту операцию, werf удаляет стадии, которые не относятся ни к каким образам в Docker registry.

Если первый этап очистки по политикам — выполнение команды werf images cleanup — был пропущен, , то выполнение команды werf stages cleanup не даст никакого эффекта

Ручная очистка

Ручная очистка подразумевает полное удаление за один проход образов из хранилища стадий или Docker registry (в зависимости от команды). Ручная очистка не учитывает, — используется образ в кластере Kubernetes или нет.

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

Выполнение ручной очистки возможно следующими способами:

  • Команда werf images purge. Удаляет все образы текущего проекта в Docker registry.
  • Команда werf stages purge. Удаляет все стадии текущего проекта в Docker registry.

Оба способа ручной очистки объединены в команде werf purge, при которой сначала выполняется удаление образов проекта из Docker registry (werf images purge), а затем — удаление образов из хранилища стадий (werf stages purge).

Очистка хоста

Для очистки всего хоста, на котором осуществляется работа с werf, используются следующие команды:

  • werf host cleanup. Очищает старые, неиспользуемые и неактуальные данные, включая кэш стадий во всех проектах на хосте.
  • werf host purge. Удаляет образы, стадии, кэш и другие данные (служебные папки, временные файлы) относящиеся к любому проекту werf на хосте. Т.е. удаляет все следы werf от всех проектов. Эта команда обеспечивает максимальную степень очистки. Используйте её, например, если не планируете больше использовать werf на данном хосте.