[cloud native][database] CloudNativePG
Updated:
개요
- 사이트/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
- without Prometheus
- with Prometheus
- 비고
- cluster PodDefault에 라벨 추가 방법을 제공하지 않음
- 메트릭 수집을 하려면 cluster PodDefault에 라벨을 추가하거나 라벨을 보지 않게 Prometheus 설정을 하거나 별도의 Prometheus 설치 필요
- cluster PodDefault에 라벨 추가 방법을 제공하지 않음