Updated:

4 minute read

개요

  • 사이트/GitHub
  • 모든 Kubernetes 클러스터에서 PostgreSQL 워크로드를 관리하도록 설계된 오픈소스 오퍼레이터
  • 분산 토폴로지 기능 덕분에 프라이빗, 퍼블릭, 하이브리드 및 멀티클라우드 환경에서 배포를 지원
  • 선언적 구성 및 불변 인프라와 같은 DevOps 원칙과 개념을 준수
  • 고가용성 PostgreSQL 데이터베이스 클러스터
  • primary/standby 아키텍처
  • native streaming replication 사용
  • 100% 오픈 소스이며 커뮤니티 중심
  • 모든 구성 요소는 GitHub의 Apache 2 라이선스에 따라 제공
  • PostgreSQL 클러스터를 나타내는 Cluster라는 새로운 Kubernetes 리소스를 정의
    • 고가용성과 읽기 전용 쿼리의 오프로드를 위해 단일 기본 및 선택적 복제본 수로 구성
  • 오퍼레이터가 전적으로 관리
    • 애플리케이션은 장애 조치 또는 전환 후 기본 역할의 변경에 대해 걱정할 필요 없이 PostgreSQL 데이터베이스에 액세스 가능


특징

  • Designed for Kubernetes
    • 완전히 선언적이며 Kubernetes API 서버와 직접 통합되어 클러스터 상태를 업데이트
    • 외부 장애 조치 관리 도구 불필요
  • Autopilot
    • 쿠버네티스 내에서 Postgres 데이터베이스를 배포하고 관리하고 자동 장애 조치하는 단계를 자동화
  • Data persistence
    • StatefulSet에 의존하지 않고 자체 방식을 사용하여 PGDATA가 저장된 PVC를 관리
  • Cloud Native
    • 변경 불가능한 인프라, 선언적 구성, 마이크로서비스 아키텍처와 같은 입증된 DevOps 개념을 기반으로 구축
    • Kubernetes API 서버에만 의존하여 PostgreSQL 클러스터의 상태를 유지
    • 클라우드 네이티브 기능을 제공
      • self-healing
      • high availability
      • rolling updates
      • scale up/down
      • read-only replicas
      • affinity/anti-affinity/tolerations for scheduling
      • resource management
  • Security & TLS Certificates
    • 보안 컨텍스트를 지원하고 전송 중 암호화된 TLS 연결을 구현
    • 직접 인증서를 가져오거나 cert-manager와 통합 가능
    • PostgreSQL에 대한 TLS 클라이언트 인증도 지원
    • PGAudit을 통한 감사는 선언적 방식으로 쉽게 활성화 가능
  • High Availability
    • 물리적 복제를 기반으로 구축
    • 스트리밍 복제와 파일 기반 복제를 폴백 방법으로 활용
    • 동기 복제를 조정하여 데이터 손실이 없는 복제본을 얻는 것도 가능
  • Disaster Recovery
    • 객체 저장소에서 지속적인 백업을 통해 재해 복구 목표를 정의
    • PostgreSQL의 기본 Point-In-Time-Recovery 기능을 활용하여 백업에서 지정된 타임스탬프까지 새 클러스터를 부트스트래핑
  • Monitoring
    • SQL로 작성된 사용자 정의 메트릭을 통해 구성 및 사용자 정의할 수 있는 Prometheus용 익스포터 내장
    • 데이터베이스 및 감사를 포함한 로그는 인프라 로그 관리 파이프라인과의 기본 통합을 위해 JSON 형식으로 stdout에 투명하게 전송
  • Advanced Architectures
    • 애플리케이션과 PostgreSQL 데이터베이스 사이에 PgBouncer 연결 풀러를 추가하여 기본/대기 아키텍처 확장 가능
    • 개체 저장소에서 파일 기반 WAL 전송에만 의존하거나 스트리밍 복제 연결을 사용하여 다른 지역에 하나 이상의 재해 복구 클러스터를 만들어 복제본 클러스터를 활용 가능
  • Postgres Operations
    • 대부분 Postgres 관련 작업은 슈퍼유저 자격 증명, 애플리케이션 사용자 및 애플리케이션 데이터베이스 관리를 포함하여 선언적 방식으로 수행 가능
    • 선언적 구성은 Postgres 구성 및 pg_stat_statements와 같은 일부 일반적인 확장도 포함


주요 기능

  • 외부 도구 없이 고가용성을 위해 Kubernetes API 서버와 직접 통합
  • 자체 복구 기능
    • 가장 정렬된 복제본을 승격시켜 기본 인스턴스의 장애 조치
    • 복제본의 자동 재생성
  • 선택한 복제본을 승격시켜 기본 인스턴스의 계획된 전환
  • Scale up/down 가능
  • 임의의 인스턴스 수 정의
  • 클러스터의 유일한 기본 서버에 애플리케이션을 연결하기 위한 읽기-쓰기 서비스 정의
  • 읽기 전용 서비스 정의, 읽기 워크로드를 위해 모든 인스턴스에 애플리케이션 연결
  • 클러스터 사양을 통한 특정 인기 있는 Postgres 확장을 포함한 PostgreSQL 구성의 선언적 관리
    • pgaudit, auto_explain, pg_stat_statements, pg_failover_slots
  • Postgres 역할, 사용자 및 그룹의 선언적 관리
  • PVC 템플릿을 사용한 로컬 영구 볼륨 지원
  • 재사용 포드의 영구 볼륨 저장소
  • WAL 파일 및 테이블스페이스에 대한 별도 볼륨
  • 임시 테이블스페이스를 포함한 Postgres 테이블스페이스의 선언적 관리
  • PostgreSQL 마이너 버전에 대한 롤링 업데이트
  • 운영자 업그레이드에 대한 인플레이스 또는 롤링 업데이트
  • TLS 연결 및 클라이언트 인증서 인증
  • 사용자 지정 TLS 인증서 지원(cert-manager와의 통합 포함)
  • 객체 저장소에 대한 지속적인 WAL 보관
    • AWS S3 및 S3, Azure Blob Storage, Google Cloud Storage
  • 볼륨 스냅샷에 대한 백업
  • 객체 저장소에 대한 백업
    • AWS S3 및 S3, Azure Blob Storage, Google Cloud Storage
  • 볼륨 스냅샷 또는 객체 저장소에서 기존 백업의 전체 복구 및 시점 복구
  • 기존 PostgreSQL 데이터베이스의 오프라인 가져오기
  • 기존 PostgreSQL 데이터베이스의 온라인 가져오기
    • PostgreSQL 네이티브를 통해 논리적 복제
  • 선언적 방식으로 전체 PostgreSQL 클러스터 또는 인스턴스 하위 집합의 펜싱
  • 선언적 방식으로 PostgreSQL 클러스터의 최대 절전 모드
  • 쿼럼 기반 및 우선순위 기반 동기 복제 지원
  • 클러스터 수준에서 HA 물리적 복제 슬롯 지원
  • 사용자 정의 물리적 복제 슬롯 동기화
  • 대기에서 백업
  • 백업 보존 정책
  • 데이터베이스가 고쓰기 시스템에서 WAL 생성을 따라갈 수 있도록 병렬 WAL 보관 및 복원
  • 데이터베이스가 쓰기가 많은 시스템에서 WAL 생성을 따라갈 수 있도록 병렬 WAL 보관 및 복원
  • 객체 저장소에 업로드된 백업 파일에 태그 지정을 지원하여 객체 저장소 계층에서 선택적 보존 관리를 활성화
  • 여러 Kubernetes 클러스터에 걸쳐 있는 PostgreSQL 분산 토폴로지에 대한 복제 클러스터로, 제어된 전환을 지원하는 프라이빗, 퍼블릭, 하이브리드 및 멀티 클라우드 아키텍처를 활성화
  • 지연된 복제 클러스터
  • PgBouncer를 사용한 연결 풀링
  • nodeSelector를 통한 노드 친화성 지원
  • 메트릭 포트(9187)를 통한 Prometheus의 사용자 정의 메트릭에 대한 기본 사용자 정의 내보내기
  • JSON 형식의 PostgreSQL 오류 메시지에 대한 표준 출력 로깅
  • 포드에 대한 readOnlyRootFilesystem 보안 컨텍스트를 자동으로 설정
  • kubectl용 cnpg 플러그인
  • 간단한 바인딩 및 검색+바인딩 LDAP 클라이언트 인증
  • 다중 아키텍처 형식 컨테이너 이미지
  • OLM 설치


아키텍처

  • Kubernetes에서 PostgreSQL을 배포할 때 강력한 비즈니스 연속성 전략을 구현하기 위한 주요 아키텍처 고려 사항
    • 스트레치 클러스터와 비스트레치 클러스터에서의 배포
    • postgres 작업자 노드 예약
    • 단일 Kubernetes 클러스터 내의 PostgreSQL 아키텍처
    • 재해 복구를 위한 Kubernetes 클러스터 간의 PostgreSQL 아키텍처


설치

  • HELM
    • operator-values.yaml
    • cluster-values.yaml
    • helm repo add cnpg https://cloudnative-pg.github.io/charts
             
      helm install cloudnative-pg-operator cnpg/cloudnative-pg --namespace cnpg --create-namespace --values operator-values.yaml
      sleep 15s
      helm install cloudnative-pg-cluster cnpg/cluster --namespace cnpg --create-namespace --values cluster-values.yaml
      
  • ArgoCD
  • 비고
    • cluster PodDefault에 라벨 추가 방법을 제공하지 않음
      • 메트릭 수집을 하려면 cluster PodDefault에 라벨을 추가하거나 라벨을 보지 않게 Prometheus 설정을 하거나 별도의 Prometheus 설치 필요