Установка Kubernetes с K3s: Лёгкая оркестрация контейнеров
Кластер Kubernetes на одном или нескольких узлах с K3s: kubectl, deployments и services, управление приложениями через Helm. Kubernetes на VPS.
Бэкап Docker volume, в том числе при работающем контейнере, скрипты автоматизации, удалённое копирование через Restic, бэкап Kubernetes с Velero и проверка.
Резервное копирование контейнерных сред требует иного подхода, чем традиционное серверное резервное копирование. Поскольку контейнеры эфемерны, резервировать нужно не сами контейнеры, а данные внутри них. В этом руководстве рассматриваются комплексные стратегии резервного копирования для 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, сетевые режимы (bridge, host, overlay), свои сети и связь между контейнерами.
Драйверы логов Docker, docker logs, логи подов Kubernetes, централизованный сбор через Loki или ELK Stack, ротация и управление логами в production.