Home » Резервное копирование и восстановление кластера Kubernetes на DigitalOcean с Velero
Резервное копирование и восстановление кластера Kubernetes на DigitalOcean с Velero

Резервное копирование и восстановление кластера 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 стратегии – для миграции между провайдерами

Начните с простых ежедневных бэкапов, постепенно добавляя сложные сценарии. Не забывайте регулярно тестировать процедуры восстановления – бэкап без возможности восстановления бесполезен. И помните: лучший бэкап – это тот, который вам никогда не понадобится, но он всегда готов к использованию.

Успешной автоматизации!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked