- Home »

Резервное копирование и восстановление кластера Kubernetes на DigitalOcean с Velero
Однажды у каждого админа наступает тот момент, когда он понимает – бэкапы это не роскошь, а необходимость. Особенно когда речь идёт о Kubernetes кластерах в продакшене. Если вы используете DigitalOcean для хостинга своих контейнеризованных приложений, то эта статья для вас. Мы разберём Velero – мощный инструмент для резервного копирования и восстановления кластеров Kubernetes, который может спасти не только ваши данные, но и нервы.
Velero (бывший Heptio Ark) – это open-source решение, которое создаёт снимки не только данных, но и всех ресурсов кластера. Представьте ситуацию: случайно удалили namespace с критичным приложением, или обновление кластера пошло не по плану. С Velero вы можете откатиться к стабильному состоянию за считанные минуты. Но главное – это не просто бэкап данных, а полноценное сохранение состояния всего кластера.
Как работает Velero
Velero работает по принципу “снимок + объектное хранилище”. Он создаёт резервные копии объектов Kubernetes API и persistent volumes, сохраняя их в облачном хранилище. Архитектура состоит из:
- Velero CLI – клиент для управления бэкапами
- Velero server – контроллер, работающий в кластере
- Объектное хранилище – DigitalOcean Spaces в нашем случае
- Плагины – для работы с различными типами storage
Процесс резервного копирования выглядит так: Velero обращается к Kubernetes API, получает список ресурсов, создаёт их JSON-представления и загружает в объектное хранилище. Одновременно создаются снимки persistent volumes через CSI или облачные API.
Подготовка окружения
Для начала вам понадобится рабочий кластер Kubernetes на DigitalOcean. Если у вас его ещё нет, можете воспользоваться VPS решениями для создания собственного кластера или выделенными серверами для более требовательных нагрузок.
Создаём DigitalOcean Spaces для хранения бэкапов:
# Создайте Space через веб-интерфейс DigitalOcean
# Получите API ключи для доступа
# Запишите endpoint вашего региона (например, fra1.digitaloceanspaces.com)
Устанавливаем Velero CLI:
# Linux/macOS
curl -fsSL -o velero-v1.12.1-linux-amd64.tar.gz \
https://github.com/vmware-tanzu/velero/releases/download/v1.12.1/velero-v1.12.1-linux-amd64.tar.gz
tar -xzf velero-v1.12.1-linux-amd64.tar.gz
sudo mv velero-v1.12.1-linux-amd64/velero /usr/local/bin/
# Проверяем установку
velero version --client-only
Настройка Velero в кластере
Создаём файл с credentials для DigitalOcean Spaces:
# credentials-velero
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
Устанавливаем Velero в кластер:
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.8.0 \
--bucket your-backup-bucket \
--secret-file ./credentials-velero \
--use-volume-snapshots=true \
--backup-location-config region=fra1,s3ForcePathStyle="true",s3Url=https://fra1.digitaloceanspaces.com \
--snapshot-location-config region=fra1
Проверяем статус установки:
kubectl get pods -n velero
velero backup-location get
velero snapshot-location get
Создание резервных копий
Базовый бэкап всего кластера:
# Создаём полный бэкап
velero backup create full-backup-$(date +%Y%m%d-%H%M%S)
# Бэкап конкретного namespace
velero backup create app-backup --include-namespaces production
# Бэкап с исключениями
velero backup create selective-backup \
--exclude-namespaces kube-system,velero \
--exclude-resources secrets,configmaps
# Проверяем статус
velero backup get
velero backup describe full-backup-20231215-143022
Автоматические бэкапы по расписанию:
# Ежедневные бэкапы в 2:00
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--ttl 720h
# Еженедельные полные бэкапы
velero schedule create weekly-full \
--schedule="0 1 * * 0" \
--ttl 2160h
# Просмотр расписаний
velero schedule get
Восстановление из резервных копий
Восстановление – это то, ради чего всё затевалось. Вот основные сценарии:
# Полное восстановление кластера
velero restore create --from-backup full-backup-20231215-143022
# Восстановление конкретного namespace
velero restore create app-restore \
--from-backup full-backup-20231215-143022 \
--include-namespaces production
# Восстановление с переименованием namespace
velero restore create staging-restore \
--from-backup production-backup \
--namespace-mappings production:staging
# Восстановление конкретных ресурсов
velero restore create selective-restore \
--from-backup full-backup-20231215-143022 \
--include-resources persistentvolumes,persistentvolumeclaims
Мониторинг процесса восстановления:
velero restore get
velero restore describe app-restore
velero restore logs app-restore
Практические кейсы и подводные камни
Сценарий | Решение | Подводные камни |
---|---|---|
Случайное удаление namespace | Точечное восстановление с –include-namespaces | Конфликты с существующими ресурсами |
Миграция между кластерами | Полный бэкап + восстановление в новом кластере | Различия в версиях Kubernetes и StorageClass |
Откат после неудачного обновления | Восстановление с –restore-volumes=true | Проблемы с PV, если они не были правильно сняты |
Тестирование в staging | Восстановление с namespace-mappings | Секреты и конфигурации окружения |
Продвинутые настройки
Кастомные хуки для подготовки приложений к бэкапу:
# pre-backup-hook.yaml
apiVersion: v1
kind: Pod
metadata:
name: database-backup-hook
annotations:
pre.hook.backup.velero.io/command: '["/bin/bash", "-c", "pg_dump mydb > /backup/dump.sql"]'
pre.hook.backup.velero.io/timeout: 3m
spec:
containers:
- name: postgres
image: postgres:13
Исключение временных данных из бэкапов:
# Добавляем аннотации к ресурсам
kubectl annotate pvc temp-storage backup.velero.io/backup-volumes=false
kubectl annotate pod cache-pod backup.velero.io/backup-volumes-excludes=cache-volume
Настройка resource filters:
# velero-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: velero-server-config
namespace: velero
data:
resourceFilters: |
- apiVersion: v1
kind: Secret
name: default-token-*
action: exclude
Мониторинг и алертинг
Интеграция с Prometheus для мониторинга бэкапов:
# prometheus-rule.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: velero-backup-alerts
spec:
groups:
- name: velero.rules
rules:
- alert: VeleroBackupFailed
expr: velero_backup_success_total{schedule!=""} == 0
for: 1h
labels:
severity: critical
annotations:
summary: "Velero backup failed"
description: "Velero backup {{ $labels.schedule }} failed"
Сравнение с альтернативами
Решение | Плюсы | Минусы | Лучше для |
---|---|---|---|
Velero | Нативная интеграция с K8s, богатые возможности | Сложность настройки, зависимость от облачных провайдеров | Комплексных кластеров |
Kasten K10 | GUI, enterprise функции | Коммерческий, ресурсоёмкий | Enterprise окружений |
Stash | Легковесный, простота | Ограниченные возможности | Простых приложений |
Kopia | Дедупликация, сжатие | Молодой проект, меньше интеграций | Оптимизации хранения |
Автоматизация и интеграция
Создаём Helm chart для автоматического деплоя с настройками бэкапа:
# Chart.yaml
apiVersion: v2
name: app-with-backup
version: 1.0.0
# templates/backup-schedule.yaml
apiVersion: velero.io/v1
kind: Schedule
metadata:
name: {{ .Values.app.name }}-backup
spec:
schedule: {{ .Values.backup.schedule }}
template:
includedNamespaces:
- {{ .Release.Namespace }}
ttl: {{ .Values.backup.ttl }}
CI/CD интеграция для автоматического бэкапа перед деплоем:
# .github/workflows/deploy.yml
- name: Create pre-deploy backup
run: |
velero backup create pre-deploy-$(date +%Y%m%d-%H%M%S) \
--include-namespaces ${{ env.NAMESPACE }} \
--wait
- name: Deploy application
run: |
helm upgrade --install myapp ./chart
- name: Verify deployment
run: |
kubectl rollout status deployment/myapp -n ${{ env.NAMESPACE }}
Безопасность и шифрование
Настройка client-side шифрования для чувствительных данных:
# Генерируем ключ шифрования
openssl rand -base64 32 > encryption-key
# Создаём секрет
kubectl create secret generic velero-encryption-key \
--from-file=encryption-key \
-n velero
# Настраиваем Velero
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.8.0 \
--bucket your-backup-bucket \
--secret-file ./credentials-velero \
--backup-location-config region=fra1,s3ForcePathStyle="true",s3Url=https://fra1.digitaloceanspaces.com \
--features=EnableCSI \
--uploader-type=kopia \
--default-volumes-to-fs-backup
Troubleshooting типичных проблем
Частые проблемы и их решения:
# Проблема: Backup застрял в состоянии InProgress
velero backup logs backup-name
kubectl get backups.velero.io backup-name -o yaml
# Решение: Очистка зависших ресурсов
velero backup delete backup-name
kubectl delete backups.velero.io backup-name -n velero
# Проблема: Не удаётся восстановить PV
velero restore create test-restore \
--from-backup backup-name \
--restore-volumes=true \
--wait
# Проверка логов restore
velero restore logs test-restore
Оптимизация производительности
Для больших кластеров важно оптимизировать процесс бэкапирования:
# Параллельные uploads
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.8.0 \
--bucket your-backup-bucket \
--secret-file ./credentials-velero \
--backup-location-config region=fra1,s3ForcePathStyle="true",s3Url=https://fra1.digitaloceanspaces.com \
--pod-annotations prometheus.io/scrape="true" \
--pod-annotations prometheus.io/port="8085" \
--features=EnableCSI
Настройка ресурсов для Velero pod:
# velero-deployment-patch.yaml
spec:
template:
spec:
containers:
- name: velero
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 500m
memory: 128Mi
Интересные факты и нестандартные применения
Velero можно использовать не только для disaster recovery, но и для:
- Blue-Green deployments – создание снимка перед переключением трафика
- Compliance аудитов – сохранение состояния кластера для регулярных проверок
- Development workflows – быстрое создание копий production данных для тестирования
- Cluster migrations – перенос приложений между облачными провайдерами
Интересная статистика: согласно исследованию CNCF, 73% организаций используют Kubernetes в продакшене, но только 31% имеют полноценную backup стратегию. Velero может решить эту проблему элегантно.
Новые возможности и будущее
С появлением CSI (Container Storage Interface) Velero получил новые возможности:
- Unified snapshots – работа с различными storage провайдерами через единый интерфейс
- Application-consistent backups – координация с приложениями для консистентных снимков
- Cross-region replication – автоматическая репликация бэкапов между регионами
Официальная документация доступна на https://velero.io/docs/, а исходный код на GitHub.
Заключение и рекомендации
Velero – это мощный инструмент, который должен быть в арсенале каждого Kubernetes администратора. Он решает критически важную задачу обеспечения отказоустойчивости ваших приложений. Рекомендую использовать его в следующих случаях:
- Production кластеры – обязательно, без вариантов
- Staging окружения – для тестирования backup/restore процедур
- Development – для быстрого создания копий данных
- Multi-cloud стратегии – для миграции между провайдерами
Начните с простых ежедневных бэкапов, постепенно добавляя сложные сценарии. Не забывайте регулярно тестировать процедуры восстановления – бэкап без возможности восстановления бесполезен. И помните: лучший бэкап – это тот, который вам никогда не понадобится, но он всегда готов к использованию.
Успешной автоматизации!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.