k8spg — автоматические бекапы и восстановление для PostgreSQL в Kubernetes

Представляю вашему вниманию свой проект k8spg — автоматическое создание и восстановление резервных копий для PostgreSQL в Kubernetes. k8spg призван решить следующие задачи:

  • Удобное создание бекапов в k8s;
  • Легкое восстановление для Disaster Recovery или синхронизации тестовых площадок;
  • Использование официального Docker-образа PostgreSQL в качестве основы, можно перебазировать любой образ с postgres:11 на k8spg;
  • Никаких абстракций для конфигурации, вы можете использовать все возможности конфигурационного файла PostgreSQL;
  • Использование готовых, проверенных средств для бекапа (WAL-G).

Задачи, которые k8spg НЕ решает:

  • Репликация;
  • High Availability;
  • Failover.

k8spg был разработан и успешно применен мной для проекта Storiqa. С его помощью удалось организовать:

  • Резервное копирование БД в AWS S3
  • Синхронизацию тестовых окружений с продом (тем самым проверяя целостность бекапов).

Почему нельзя было просто использовать Amazon RDS?

Для работы требовалось использование плагина, не входящего в поставку Amazon PostgreSQL — decoderbufs.

Почему нельзя было использовать существующие решения, например patroni или stolon?

Данные инструменты решают задачу создания высокодоступного (HA) PostgreSQL, а не обеспечения Disaster Recovery. Более того, patroni использует собственный нестандартный образ postgresql, который сложно дополнить плагинами (несовместим с официальным). Также для настройки PostgreSQL используются абстракции, генерирующие конфигурационный файл PostgreSQL, поддерживающие только ограниченный набор директив конфигурационного файла PostgreSQL. Это создает сложности, если для работы проекта требуются настройки не поддерживаемые данными инструментами.

Как работает k8spg?

Под k8spg состоит из трех контейнеров:

  1. (initContainer) Скрипт восстановления из заданного бекапа;
  2. PostgreSQL — собственно база данных;
  3. Cron — планировщик, запускающий по расписанию бекапы и (в ближайшем будущем) их ротацию.

Общие ресурсы для всех контейнеров:

  1. ConfigMap, содержащий конфигурационные файлы для PostgreSQL, WAL-G и скриптов архивации, восстановления;
  2. Директория с данными PostgreSQL.

WAL-G запускается по заданному расписанию, делает бекапы и загружает их на S3-совместимое облако (AWS S3, DigitalOcean Spaces, Minio, etc.). PostgreSQL также загружает WAL в то же самое облако для обеспечения возможности восстановления в произвольной точке во времени.

Пример использования

Восстановление БД на определенную точку во времени

Для того, чтобы восстановить БД по состоянию на два часа назад, необходимо:

    1. Открыть ConfigMap «k8spg»: kubectl edit configmap k8spg;
    2. Убедиться, что восстановление на старте включено: export RESTORE_ON_START="true";
    3. Вставить в значение на строке export RESTORE_DATE="" желаемую дату, на которую необходимо восстановиться, например: export RESTORE_DATE="2 hours ago";
    4. Перезапустить под: kubectl delete pod k8spg-0;
    5. Дождаться восстановления БД из бекапа: kubectl logs -f k8spg-0 --container=restore;
    6. Выставить export RESTORE_ON_START="false", чтобы при случайном рестарте пода не произошло восстановление.

Готово, БД восстановлена!

Таким же образом можно синхронизировать тестовые окружения с продом (кроме последнего шага): достаточно выставить указанные параметры и просто при необходимости или по расписанию перезапускать (удалять) под. При этом необходимо на тестовых окружениях выставить параметр BACKUP_ENABLED в false, чтобы на них не создавались бекапы.

Добавление расширений к PostgreSQL

Для того чтобы добавить расширение для официального образа PostgreSQL достаточно перебазировать его на образе k8spg вместо postgres.

Пример для postgis:

FROM k8spg:11
MAINTAINER Mike Dillon <mike@appropriate.io>

ENV POSTGIS_MAJOR 2.5
ENV POSTGIS_VERSION 2.5.2+dfsg-1~exp1.pgdg90+1

RUN apt-get update \
      && apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
      && apt-get install -y --no-install-recommends \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION \
           postgis=$POSTGIS_VERSION \
      && rm -rf /var/lib/apt/lists/*

RUN mkdir -p /docker-entrypoint-initdb.d
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/postgis.sh
COPY ./update-postgis.sh /usr/local/bin

Ближайшие планы

На текущий момент, k8spg полностью поддерживает создание и восстановление резервных копий при использовании AWS S3 и представлен в виде YAML манифестов Kubernetes. Ближайшие планы по развитию включают в себя:

  1. Helm чарт;
  2. Поддержка ротации бекапов и WAL;
  3. Поддержка GCE для хранения бекапов;

Добавить комментарий