Установка Kubernetes с K3s: Лёгкая оркестрация контейнеров
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Резервное копирование Docker volume, состояния контейнеров, persistent volumes Kubernetes, резервное копирование K8s с Velero, автоматизированные скрипты и планирование disaster recovery.
Резервное копирование контейнерных сред требует иного подхода, чем традиционное серверное резервное копирование. Поскольку контейнеры эфемерны, резервировать нужно не сами контейнеры, а данные внутри них. В этом руководстве рассматриваются комплексные стратегии резервного копирования для Docker и Kubernetes.
| Стратегия | Подходит для | Инструмент |
|---|---|---|
| Резервное копирование volume | База данных, файловое хранилище | tar, rsync |
| Резервное копирование образа | Состояние приложения | docker save |
| Снимок | Быстрое восстановление | LVM, ZFS |
| Резервное копирование K8s | Весь кластер | Velero |
| Удалённое резервное копирование | Disaster recovery | Restic, Rclone |
# Резервное копирование volume в tar-архив
docker run --rm \
-v VOLUME_NAME:/data \
-v $(pwd):/backup \
alpine tar czf /backup/volume-backup-$(date +%Y%m%d).tar.gz -C /data .
# Пример: резервное копирование MySQL volume
docker run --rm \
-v mysql-data:/data \
-v /backups:/backup \
alpine tar czf /backup/mysql-$(date +%Y%m%d-%H%M%S).tar.gz -C /data .
# Восстановление volume
docker run --rm \
-v mysql-data:/data \
-v /backups:/backup \
alpine tar xzf /backup/mysql-20240101-120000.tar.gz -C /data
# MySQL dump (пока контейнер работает)
docker exec mysql-db mysqldump \
-u root -pStrongPass123! \
--all-databases \
--single-transaction \
> /backups/mysql-dump-$(date +%Y%m%d).sql
# PostgreSQL dump
docker exec postgres-db pg_dumpall \
-U postgres \
> /backups/postgres-dump-$(date +%Y%m%d).sql
#!/bin/bash
# /usr/local/bin/docker-backup.sh
BACKUP_DIR="/backups/docker"
DATE=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"
# Резервное копирование всех volumes
for volume in $(docker volume ls -q); do
echo "Резервное копирование: $volume"
docker run --rm \
-v "$volume":/data \
-v "$BACKUP_DIR":/backup \
alpine tar czf "/backup/${volume}-${DATE}.tar.gz" -C /data . 2>/dev/null
done
# Резервное копирование MySQL
if docker ps --format '{{.Names}}' | grep -q mysql; then
docker exec mysql-db mysqldump \
-u root -pStrongPass123! \
--all-databases \
--single-transaction \
> "$BACKUP_DIR/mysql-${DATE}.sql"
fi
# Удалить старые резервные копии
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.sql" -mtime +$RETENTION_DAYS -delete
echo "Резервное копирование завершено: $DATE"
chmod +x /usr/local/bin/docker-backup.sh
# Ежедневное резервное копирование через cron
# 0 2 * * * /usr/local/bin/docker-backup.sh >> /var/log/docker-backup.log 2>&1
# Установить Restic
apt install -y restic
# Инициализировать репозиторий
restic init --repo /backups/restic-repo
# Резервное копирование volume
restic backup /tmp/mysql-backup \
--repo /backups/restic-repo \
--password-file /etc/restic/password \
--tag mysql,docker
# Список резервных копий
restic snapshots --repo /backups/restic-repo
# Восстановление
restic restore SNAPSHOT_ID \
--repo /backups/restic-repo \
--target /tmp/restore
# Очистить старые резервные копии
restic forget \
--repo /backups/restic-repo \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 3 \
--prune
# Установить Velero CLI
wget https://github.com/vmware-tanzu/velero/releases/download/v1.12.0/velero-v1.12.0-linux-amd64.tar.gz
tar xzf velero-v1.12.0-linux-amd64.tar.gz
mv velero-v1.12.0-linux-amd64/velero /usr/local/bin/
# Резервное копирование всего кластера
velero backup create full-backup --wait
# Резервное копирование конкретного namespace
velero backup create production-backup \
--include-namespaces production \
--wait
# Список резервных копий
velero backup get
# Восстановление из резервной копии
velero restore create --from-backup full-backup
# Ежедневное резервное копирование (в 2 часа ночи)
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--ttl 168h
# Еженедельное полное резервное копирование
velero schedule create weekly-backup \
--schedule="0 1 * * 0" \
--ttl 720h
#!/bin/bash
BACKUP_FILE="$1"
if tar tzf "$BACKUP_FILE" > /dev/null 2>&1; then
echo "Файл резервной копии действителен: $BACKUP_FILE"
else
echo "ОШИБКА: Файл резервной копии повреждён: $BACKUP_FILE"
exit 1
fi
docker volume create test-restore
docker run --rm \
-v test-restore:/data \
-v $(dirname $BACKUP_FILE):/backup \
alpine tar xzf "/backup/$(basename $BACKUP_FILE)" -C /data
echo "Тест восстановления успешен"
docker volume rm test-restore
Стратегия резервного копирования контейнеров должна формироваться в соответствии с бизнес-требованиями. Резервное копирование volume + cron может быть достаточным для небольших сред, тогда как для production-кластеров Kubernetes требуются специализированные инструменты, такие как Velero. С регулярным тестированием резервного копирования и восстановления на серверах REXE вы можете обеспечить сохранность данных.
Частота резервного копирования определяется целевым показателем RPO (Recovery Point Objective). Ежечасное или более частое резервное копирование для критических баз данных, ежедневное для данных приложений, еженедельное для статического контента. Увеличение частоты резервного копирования увеличивает использование диска и нагрузку I/O — учитывайте этот баланс.
Для баз данных рекомендуется резервное копирование без остановки: mysqldump --single-transaction для MySQL, pg_dump для PostgreSQL. Для резервного копирования файловой системы может потребоваться кратковременная остановка для обеспечения согласованности. Для критических систем делайте резервные копии с read-реплики.
Проверьте статус резервной копии командой velero backup describe BACKUP_NAME. Регулярно тестируйте восстановление в тестовой среде с velero restore create --from-backup BACKUP_NAME. Velero также автоматически проверяет целостность резервных копий.
Применяйте правило 3-2-1: 3 копии, 2 разных носителя, 1 удалённое местоположение. Рекомендуется комбинация локального диска + удалённого S3-совместимого хранилища (MinIO, AWS S3, Backblaze B2). Шифруйте резервные копии (Restic шифрует по умолчанию). Избегайте хранения резервных копий на том же сервере.
Нужно сохранить две вещи: 1) файлы docker-compose.yml и .env (должны храниться в Git), 2) данные volumes (резервное копирование с tar). Для резервного копирования всего стека сохраняйте каждый volume отдельно. Для восстановления сначала запустите стек с docker-compose up, затем восстановите данные volumes.
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Типы Docker volume (named, bind mount, tmpfs), управление volumes, режимы Docker-сетей (bridge, host, overlay), создание пользовательских сетей и взаимодействие контейнеров. Полное руководство.
Драйверы логов Docker, команда docker logs, логи подов Kubernetes, централизованный сбор логов (Loki, ELK Stack), ротация логов и лучшие практики управления логами в production.