← Назад к вопросам

Как организовать бэкап в Kubernetes

2.2 Middle🔥 193 комментариев
#Kubernetes

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Организация резервного копирования в Kubernetes: комплексный подход

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

1. Определение объектов для резервного копирования

Ключевые объекты делятся на две категории:

  • Ресурсы Kubernetes (декларативное состояние):
    *   **Custom Resource Definitions (CRDs)** и объекты операторов
    *   Манифесты Deployments, StatefulSets, Services, ConfigMaps, Secrets
    *   Сетевые политики (NetworkPolicies), политики безопасности (PodSecurityPolicies)
    *   Роли и привязки RBAC (Roles, RoleBindings)

  • Данные приложений (персистентное состояние):
    *   Тома **PersistentVolumes (PV)**, привязанные к StatefulSets или Deployments
    *   Данные внутри контейнеров (если не вынесены в тома)

2. Стратегия и инструменты

Я рекомендую разделять инструменты для этих двух задач.

Для резервного копирования ресурсов Kubernetes: Velero

Velero — это стандартный инструмент в индустрии. Он создает точки восстановления (Backup) и может переносить ресурсы между кластерами (Restore и Migration).

Пример установки и базовой настройки Velero (с S3-совместимым хранилищем):

# Установка CLI (пример для macOS)
brew install velero

# Установка в кластер (MinIO в качестве хранилища)
velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.7.0 \
    --bucket velero-backups \
    --secret-file ./credentials-minio \
    --use-volume-snapshots=true \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.example.com:9000 \
    --snapshot-location-config region=minio

Пример расписания ежедневного бэкапа всего кластера, кроме системных namespace:

velero schedule create daily-full-backup \
    --schedule="0 2 * * *" \
    --include-namespaces="*" \
    --exclude-namespaces="kube-system,kube-public,kube-node-lease" \
    --ttl 720h

Для резервного копирования данных приложений: комбинированный подход

Здесь нет одного универсального решения. Стратегия зависит от типа данных и СХД.

  1. Использование снапшотов Velero: Velero может координировать создание снапшотов дисков облачного провайдера (AWS EBS, GCP PD) через свои VolumeSnapshotLocation. Это самый "чистый" способ, но он работает только с облачными managed-дисками.

    # Пример VolumeSnapshotClass для CSI драйвера
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: velero-snapshot-class
    driver: ebs.csi.aws.com
    deletionPolicy: Retain
    
  2. Снапшоты на уровне СХД (Storage Arrays): Для enterprise-хранилищ (NetApp, Portworx, Ceph RBD) используются их собственные механизмы снапшотов, которые могут быть интегрированы через CSI-драйвер или внешние скрипты.

  3. Приложения с собственным механизмом бэкапа: Базы данных (PostgreSQL, MongoDB) часто требуют использования своих утилит (pg_dump, mongodump). Для этого я запускаю специальные Job'ы в Kubernetes, которые выполняют дамп и загружают его в объектное хранилище (S3). Это можно организовать через CronJob.

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: postgres-daily-backup
    spec:
      schedule: "30 1 * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: backup
                image: postgres:15-alpine
                command:
                - /bin/sh
                - -c
                - |
                  pg_dump -h $PG_HOST -U $PG_USER $PG_DB > /backup/dump.sql
                  aws s3 cp /backup/dump.sql s3://my-backup-bucket/postgres/$(date +%Y%m%d).sql
                env:
                - name: PG_HOST
                  value: "postgres-svc"
                - name: PG_USER
                  valueFrom:
                    secretKeyRef:
                      name: postgres-creds
                      key: username
                - name: PG_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: postgres-creds
                      key: password
                volumeMounts:
                - name: backup-volume
                  mountPath: /backup
              restartPolicy: OnFailure
              volumes:
              - name: backup-volume
                emptyDir: {}
    

3. Критически важные практики

  • Принцип 3-2-1: Минимум 3 копии данных, на 2 разных типах носителя, 1 копия географически удаленная. Velero-бэкапы должны храниться не только в S3, но и реплицироваться в другой регион или на другой облачный провайдер.
  • Регулярное тестирование восстановления (Disaster Recovery Drill): Резервная копия без проверенного восстановления бесполезна. Не реже раза в квартал нужно проводить процедуру:
    1.  Восстановление в изолированный namespace (`velero restore create --from-backup daily-backup --include-namespaces prod --namespace-mappings prod:prod-test`).
    2.  Полноценное восстановление в standby-кластер в другом регионе.
  • Резервное копирование etcd: Для полного аварийного восстановления кластера с нуля необходим снапшот etcd. Это делается либо через штатные инструменты (etcdctl), либо через снапшоты управляемого сервиса (GKE, AKS, EKS).
    # Пример ручного снапшота etcd (для self-managed кластера)
    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    --cert=/etc/kubernetes/pki/etcd/server.crt \
    --key=/etc/kubernetes/pki/etcd/server.key \
    snapshot save /var/lib/etcd/backup/snapshot-$(date +%Y%m%d).db
    
  • Хранение Secrets: Никогда не полагайтесь только на бэкап зашифрованных в etcd Secrets. Используйте external secret stores (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) или инструменты типа Sealed Secrets от Bitnami. Их конфигурация должна быть частью бэкапа инфраструктуры как код (IaC).
  • Идемпотентность и GitOps: Все основные манифесты приложений должны храниться в репозитории (Git) и разворачиваться через GitOps-оператор (Argo CD, Flux). Git становится вашим основным источником истины, а бэкап Velero — дополнительной страховкой и средством для быстрого восстановления runtime-состояния.

Заключение

Организация бэкапа в Kubernetes — это создание многослойной отказоустойчивой системы. Ядром является Velero для ресурсов Kubernetes, дополненное стратегией для данных приложений (снапшоты или job-based дампы). Ключ к успеху — автоматизация (расписания, CronJobs), верификация (регулярные DR-тесты) и принцип 3-2-1. Все это должно быть задокументировано в Runbook по аварийному восстановлению.