DBAtlas · 데이터베이스 운영 아틀라스

Kubernetes 위의 데이터베이스(operator)

증상

목표: operator로 Kubernetes에서 데이터베이스를 실행한다. 순수 StatefulSet 대신 operator가 제공하는 자동 페일오버, 영구 스토리지, 백업 기능을 사용한다.

1. 왜 operator인가: StatefulSet만으로는 부족하다

일반 StatefulSet은 안정적인 ID와 PVC를 가진 pod를 제공하지만 페일오버, 복제 구성, 백업, 업그레이드 로직은 제공하지 않는다. operator는 이러한 데이터베이스별 운영 지식을 controller + custom resource(CRD)로 패키징한다. 'Cluster'라는 CR을 작성하면 operator가 그 뒤의 StatefulSet, Service, Secret, 백업 작업을 관리한다. 운영 환경에서는 일반적으로 operator로 데이터베이스를 실행하는 것이 선호된다.

PostgreSQL

# operators for PostgreSQL:
#  - CloudNativePG (CNPG)
#  - Zalando postgres-operator
#  - Crunchy PGO

2. operator를 선택하고 설치한다

엔진에 맞는 operator를 선택한다: PostgreSQL에는 CloudNativePG 또는 Zalando postgres-operator, MySQL과 MongoDB에는 Percona operator(Percona Operator for MySQL / for MongoDB)가 일반적이다. Helm 또는 bundle manifest로 operator를 설치한다. 이 단계에서 CRD와 controller pod가 클러스터에 추가된다.

PostgreSQL

# CloudNativePG installation
kubectl apply --server-side -f \
  https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/releases/cnpg-1.24.0.yaml

MySQL

# Percona Operator for MySQL (Helm)
helm install my-op percona/pxc-operator

MongoDB

# Percona Operator for MongoDB (Helm)
helm install psmdb-op percona/psmdb-operator

3. 스토리지를 계획한다(StorageClass / PVC)

데이터베이스 상태는 PVC에 저장된다. CR에서 사용할 StorageClass를 지정한다. 지연이 낮은 블록 스토리지, 이상적으로는 로컬에 가까운 SSD를 제공하는 StorageClass를 선택한다. 네트워크 파일 시스템(NFS)은 대부분의 데이터베이스에 권장되지 않는다. 축소는 어려우므로 PVC 크기와 확장 가능성(allowVolumeExpansion)은 처음부터 올바르게 설정한다.

PostgreSQL

spec:
  storage:
    storageClass: fast-ssd
    size: 50Gi

4. Cluster CR을 적용한다(replica와 자동 페일오버)

CR에서 인스턴스/replica 수를 지정한다. operator는 동기/비동기 복제를 구성하고, primary가 장애 나면 replica를 승격하여 자동 페일오버를 수행한다. 애플리케이션은 operator가 생성한 '-rw'(read-write) Service에 연결해야 하며, 이 서비스는 항상 현재 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-rw

5. CR로 S3에 백업을 기록한다

operator는 백업도 선언적으로 관리한다: CR에 기본 백업 대상(오브젝트 스토리지/S3)과 WAL 아카이빙을 정의한다. CloudNativePG에서는 spec.backup.barmanObjectStore로 S3 정보를 지정한다(1.26부터 deprecated, 새 배포에는 Barman Cloud Plugin과 ObjectStore 리소스 사용). 연속 WAL 아카이빙 + base backup으로 시점 복구가 가능하다. 자격 증명은 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_KEY

6. 예약 백업 및 복원 CR

일회성 백업에는 Backup CR을, 예약 백업에는 ScheduledBackup CR을 생성하고 cron 식으로 정기 base backup을 수행한다. 복원도 선언적이다: 'bootstrap.recovery'로 기존 오브젝트 스토리지 백업에서 새 Cluster를 bootstrap한다. 복원 훈련을 정기적으로 실행한다. 백업만으로는 부족하며 복구를 테스트해야 한다.

PostgreSQL

apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: nightly-backup
spec:
  schedule: "0 0 2 * * *"
  cluster:
    name: app-db
DBAtlas에서 열기 →