Базы данных в Kubernetes (оператор)
Симптом
Цель: запустить базу данных в Kubernetes с помощью оператора; вместо голого StatefulSet использовать предоставляемые оператором автоматическую отработку отказа, постоянное хранилище и бэкапы.
1. Зачем оператор: одного StatefulSet недостаточно
Обычный StatefulSet даёт поды со стабильными идентификаторами и PVC, но не логику отработки отказа, настройки репликации, бэкапа и обновлений. Оператор упаковывает эти специфичные для БД эксплуатационные знания в контроллер + пользовательский ресурс (CRD). Вы пишете CR под названием 'Cluster', а оператор управляет стоящими за ним StatefulSet, Service, Secret и заданиями бэкапа. В production запуск баз данных через оператор, как правило, предпочтителен.
PostgreSQL
# operators for PostgreSQL:
# - CloudNativePG (CNPG)
# - Zalando postgres-operator
# - Crunchy PGO2. Выберите и установите оператор
Выберите оператор для вашего движка: CloudNativePG или Zalando postgres-operator для PostgreSQL; для MySQL и MongoDB распространены операторы Percona (Percona Operator for MySQL / for MongoDB). Установите оператор через Helm или bundle-манифест; этот шаг добавляет в кластер CRD и под контроллера.
PostgreSQL
# CloudNativePG installation
kubectl apply --server-side -f \
https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/releases/cnpg-1.24.0.yamlMySQL
# Percona Operator for MySQL (Helm)
helm install my-op percona/pxc-operatorMongoDB
# Percona Operator for MongoDB (Helm)
helm install psmdb-op percona/psmdb-operator3. Спланируйте хранилище (StorageClass / PVC)
Состояние базы данных хранится в PVC; укажите используемый StorageClass в CR. Выбирайте StorageClass с блочным хранилищем низкой задержки, в идеале локальным SSD; сетевые файловые системы (NFS) для большинства баз данных не рекомендуются. Сразу правильно задайте размер PVC и возможность расширения (allowVolumeExpansion), потому что уменьшить его сложно.
PostgreSQL
spec:
storage:
storageClass: fast-ssd
size: 50Gi4. Примените Cluster CR (реплики и автоматическая отработка отказа)
Укажите в CR число экземпляров/реплик; оператор настраивает синхронную/асинхронную репликацию и при сбое primary выполняет автоматическую отработку отказа, повышая реплику. Приложение должно подключаться к Service '-rw' (read-write), созданному оператором; этот сервис всегда указывает на текущий primary. Поэтому цель подключения при отработке отказа не меняется.
PostgreSQL
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: app-db
spec:
instances: 3
storage:
storageClass: fast-ssd
size: 50Gi
# the application connects to: app-db-rw5. Запись бэкапов в S3 через CR
Операторы также управляют бэкапами декларативно: в CR задаётся основное место назначения бэкапов (объектное хранилище/S3) и архивирование WAL. В CloudNativePG параметры S3 задаются через spec.backup.barmanObjectStore (устарело с 1.26; для новых развёртываний используйте Barman Cloud Plugin и его ресурс ObjectStore); непрерывное архивирование WAL + базовые бэкапы обеспечивают восстановление на момент времени (PITR). Учётные данные берите по ссылке из Kubernetes Secret.
PostgreSQL
spec:
backup:
barmanObjectStore:
destinationPath: s3://company-backup/app-db
s3Credentials:
accessKeyId:
name: s3-creds
key: ACCESS_KEY_ID
secretAccessKey:
name: s3-creds
key: SECRET_ACCESS_KEY6. CR для бэкапа по расписанию и восстановления
Создайте Backup CR для разового бэкапа и ScheduledBackup CR для бэкапов по расписанию; регулярно делайте базовые бэкапы по cron-выражению. Восстановление также декларативно: новый Cluster разворачивается из существующего бэкапа в объектном хранилище через 'bootstrap.recovery'. Регулярно проводите учения по восстановлению; делать бэкапы недостаточно — проверяйте восстановление.
PostgreSQL
apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
name: nightly-backup
spec:
schedule: "0 0 2 * * *"
cluster:
name: app-db