본문 바로가기
문서 목차
ORKESTRIX설치

PostgreSQL (Patroni)

Patroni (Zalando postgres operator) 기반의 고가용성 PostgreSQL 클러스터를 구성합니다. 마스터 장애 시 레플리카가 자동으로 마스터로 승격되며, 웹 UI(Patroni UI, pgAdmin)로 클러스터 상태와 데이터를 관리할 수 있습니다.

QUANTUM C&S

Patroni(Zalando postgres-operator) 기반의 고가용성 PostgreSQL 클러스터를 구성합니다. 마스터 장애 시 레플리카가 자동으로 마스터로 승격되며, 웹 UI(Patroni UI, pgAdmin)로 클러스터 상태와 데이터를 관리할 수 있습니다.

설정값

inventory/qks/group_vars/all/all-k8s.yaml:

qks_patroni_enabled: true
qks_patroni_version: "1.15.1"
qks_patroni_spilo_tag: "4.0-p3"
qks_patroni_cluster_instances: 3
qks_patroni_pg_version: "17"
qks_patroni_db_name: qks
qks_patroni_db_user: qks
qks_patroni_storage_size: 50Gi

qks_patroni_ui_fqdn: "patroni.{{ kube_default_domain }}"
qks_patroni_pgadmin_fqdn: "pg.{{ kube_default_domain }}"

실행

./install.sh ubuntu plays/qks-patroni.yaml

설치 흐름

./install.sh ubuntu plays/qks-patroni.yaml
  ├─ 1. Patroni UI/pgAdmin 접속 도메인을 각 노드 /etc/hosts에 등록
  ├─ 2. Helm 저장소 등록 ('zalando', 'zalando-ui', 'runix')
  ├─ 3. 네임스페이스 생성
  ├─ 4. Helm으로 Zalando postgres-operator 배포
  ├─ 5. Operator 준비 상태 확인
  ├─ 6. Helm으로 Patroni UI 배포
  ├─ 7. Patroni UI Ingress 매니페스트 템플릿 생성 · 적용
  ├─ 8. Helm으로 pgAdmin 배포
  ├─ 9. pgAdmin Ingress 매니페스트 템플릿 생성 · 적용
  ├─ 10. PostgreSQL 클러스터 매니페스트(CustomResource) 템플릿 생성
  └─ 11. PostgreSQL 클러스터 매니페스트 적용 → Operator가 감지해 마스터+레플리카 파드 자동 구성

설치 확인

kubectl get postgresql -n <qks_patroni_cluster_namespace>
kubectl get pods -n <qks_patroni_cluster_namespace> -l application=spilo -L spilo-role

STATUS: Running, 파드 1개는 master, 나머지는 replica 역할로 표시되어야 합니다.

실제 동작 확인

데이터관리 + 복제 확인:

PGPASS=$(kubectl get secret -n <ns> <qks_patroni_db_user>.<qks_patroni_cluster_name>.credentials.postgresql.acid.zalan.do -o jsonpath='{.data.password}' | base64 -d)

# 마스터에 쓰기
kubectl exec -n <ns> <qks_patroni_cluster_name>-0 -- env PGPASSWORD="$PGPASS" psql -U <qks_patroni_db_user> -h <qks_patroni_cluster_name> -d <qks_patroni_db_name> -c "
CREATE TABLE IF NOT EXISTS gs_test (id INT PRIMARY KEY, msg VARCHAR(50));
INSERT INTO gs_test VALUES (1, 'hello');
"

# 레플리카 서비스로 읽기
kubectl exec -n <ns> <qks_patroni_cluster_name>-0 -- env PGPASSWORD="$PGPASS" psql -U <qks_patroni_db_user> -h <qks_patroni_cluster_name>-repl -d <qks_patroni_db_name> -c "SELECT * FROM gs_test;"

레플리카 조회 결과에 방금 쓴 값이 나오면 복제가 정상입니다.

자동 장애조치 확인:

kubectl delete pod -n <ns> <qks_patroni_cluster_name>-0   # 현재 마스터를 강제 종료

# 30~40초 후
kubectl get pods -n <ns> -l application=spilo -L spilo-role

다른 파드가 자동으로 master로 승격되고, 종료됐던 파드는 replica로 재기동되면 정상입니다. 연결 주소(<qks_patroni_cluster_name> 서비스)를 바꾸지 않아도 자동으로 새 마스터에 연결됩니다.

웹 UI 확인:

curl -k -s https://<qks_patroni_ui_fqdn>/ | grep -i title
curl -k -s -o /dev/null -w "%{http_code}\n" https://<qks_patroni_pgadmin_fqdn>/

다음 단계