![](https://habrastorage.org/getpro/habr/upload_files/523/f5a/947/523f5a947050902a2866cd60cbb02240.png)
Администраторы кластеров kubernetes сталкиваются с задачей сохранить конфигурацию ресурсов из пространства имен и перенести в другой кластер, или же сделать резервную копию нестабильной тестовой площадки. С этой задачей без проблем справляется бегло написанный в терминале односторчный скрипт с утилитой kubectl, но что если надоело каждый раз тратить пару минут времени на очередное написание скрипта. Так и появилась утилита kube-dump, по сути это утилита которая умеет только одно - дампить ресурсы кластера.
![пример работы утилиты для сохранения всех ресурсов одного неймспейса пример работы утилиты для сохранения всех ресурсов одного неймспейса](https://habrastorage.org/getpro/habr/upload_files/397/82b/3c9/39782b3c9641ff9bd85fad6ef566710c.gif)
При помощи данной утилиты вы можете сохранить ресурсы кластера в виде чистого yaml манифеста без лишних метаданных.
Ключевые особенности:
Сохранение выполняется только для тех ресурсов, к которым у вас есть доступ на чтение.
На вход можно передать перечень пространств имен, в противном случае будут использованы все доступные для вашего контекста.
К сохранению подлежат как ресурсы пространств имен, так и глобальные ресурсы кластера.
Использовать утилиту можно локально как обычный скрипт или запустить в контейнере или в кластере kubernetes к примеру как CronJob.
Может создавать архивы и ротировать их за собой.
Может фиксировать состояние в git репозитории и отправлять в удаленный репозиторий.
Вы можете указать конкретный перечень ресурсов кластера для выгрузки.
Конфигурацию для утилиты передаем с помощью аргументов командной строки или при помощью экспортированных переменных окружений или прочитанных из .env файла.
Начало работы
Необходимый минимум для запуска это наличие установленного kubectl и подключенного в него кластера, а также утилит jq и yq. Более подробно описано на странице документации по локальному запуску, а аргументы командной строки описаны здесь или же доступны по ключу --help.
Запустим утилиту для сохранения всех ресурсов кластера:
./kube-dump dump
Если вы не хотите разбираться с установкой зависимостей вы можете воспользоваться контейнером. Подробнее про работу с контейнером описано в этой статье.
Получим свежий образ и запустим утилиту для сохранения пространств имен dev и prod в смонтированную директорию /dump, где для доступа к кластеру мы пробрасываем в контейнер свой конфигурационный файл от kubectl.
docker pull woozymasta/kube-dump:latest
docker run --tty --interactive --rm --volume $HOME/.kube:/.kube --volume $HOME/dump:/dump woozymasta/kube-dump:latest dump-namespaces -n dev,prod -d /dump --kube-config /.kube/config
Установка CronJob в кластер
Рассмотрим более сложный пример когда контейнер будет запущен в кластере как CronJob который будет каждую ночь снимать дамп ресурсов и фиксировать правки в git репозитории с последующей отправкой в удаленный репозиторий. Пример подробно описан в статье.
В данном примере подразумевается что у вас есть доступ к управлению ролями кластера, потому что мы будем использовать для работы ServiceAccount и стандартную роль view. Если же вам не подходит глобальная роль view, вы можете создать свою роль для пространства имен или кластера, в помощь можете взять этот пример.
Создадим пространство имен где будет работать наш CronJob и ServiceAccount который будет использовать ClusterRoleBinding для роли view:
kubectl create ns kube-dump
kubectl -n kube-dump apply -f https://raw.githubusercontent.com/WoozyMasta/kube-dump/master/deploy/cluster-role-view.yaml
В качестве примера будем использовать авторизацию в GitLab по OAuth токену, по этому создадим секрет с адресом репозитория и токеном для авторизации:\
kubectl -n kube-dump create secret generic kube-dump --from-literal=GIT_REMOTE_URL=https://oauth2:$TOKEN@corp-gitlab.com/devops/cluster-bkp.git
Перед установкой настройте переменные окружения под ваши нужды, в примере по умолчанию установлен режим копирования пространств имен dev и prod с последующей фиксацией изменений в ветке my-cluster и отправкой в удаленный репозиторий.
Настроим CronJob в которм укажем периодичность запуска задания:
spec:
schedule: "0 1 * * *"
Или же установите пример как есть и после отредактируйте его:
kubectl -n kube-dump apply -f https://github.com/WoozyMasta/kube-dump/blob/master/deploy/cronjob-git-token.yaml
kubectl -n kube-dump edit cronjobs.batch kube-dump
Планы по дальнейшему развитию
Реализовать отправку дампов в s3 совместимое хранилище;
Отправка уведомлений по электронной почте и через веб-хук;
Git-crypt для шифрования чувствительных данных;
Автодополнение в Bash/Zsh;
Поддержка OpenShift.
Также буду рад Вашим комментариям и предложениям с идеями и критикой.
kashtan404
Разве это не решается использованием подхода CasC? То есть, не кластер должен быть источником доверия, а конфиг в гите. Особенно это справедливо для разработки в тестовом кластере: поменял что-то — закоммить, чтобы потом не выгребать и не смотреть что поменялось (для этого же есть гит).
Leviy Автор
Вы абсолютно правы и в идеальном мире так и должно быть. Но ситуации бывают разные, в связи с этим и появилась потребность в данном скрипте.
Пример: имеется несколько кластеров песочниц, и у каждого разработчика есть по персональном неймспейсу с прямым доступом для проведения экспериментов. Переодически появляются запросы восстановить или откатить что-то случайно удалённое.
vainkop
China Aerospace Science and Technology Corporation? :)
IaC (Infrastructure as Code).
И "поменял что-то закоммить" должно быть крайней мерой и только для администраторов куба. И то концепция GitOps при переходе на неё меняет и это почти на 100%.
Для разработчика нормальным должно быть: заккомитил, применилось (GitOps в чистом виде).
В некоторых компаниях вижу практику, упрощённо говоря, continues apply, то есть периодически происходит apply кода манифестов куба из репозитория и это в том числе очень больно бьет по рукам тем, кто что-то вручную менял.