애플리케이션에서 연결하기
CloudNativePG가 만드는 서비스는 같은 Kubernetes 클러스터 안에서 동작하는 애플리케이션과 함께 쓰도록 설계됐어요. 애플리케이션 입장에서 데이터베이스에 어떻게 연결하면 좋은지, 그리고 인증 정보는 어디서 가져오는지 정리해 드릴게요.
출처: 문서
본문
애플리케이션은 같은 Kubernetes 클러스터 안에서 CloudNativePG가 생성한 서비스를 사용하도록 설계돼 있어요.
서비스와 이를 관리하는 방법에 대한 자세한 내용은 "Service management" 섹션을 참고해 주세요.
:::tip[Hint] 애플리케이션에서 이 서비스들을 사용하는 것을 강력히 권장해요. 특정 PostgreSQL 인스턴스에 직접 연결하는 것은 피하세요. 인스턴스는 클러스터 수명 동안 변경될 수 있기 때문이에요. :::
애플리케이션에서 다음 두 가지 방법으로 이 서비스들을 사용할 수 있어요:
- DNS 해석(DNS resolution)
- 환경 변수(environment variables)
PostgreSQL에 연결하기 위한 자격 증명은 오퍼레이터가 생성한 시크릿(secret)을 사용할 수 있어요.
:::note[Connection Pooling] PgBouncer를 커넥션 풀러로 활용하고 애플리케이션과 PostgreSQL 클러스터 사이에 접근 계층을 만드는 방법은 "Connection Pooling" 섹션을 참고해 주세요. :::
DNS 해석(DNS resolution)
Kubernetes DNS 서비스를 사용해 특정 서버를 가리킬 수 있어요. Kubernetes DNS 서비스는 오퍼레이터에 필요해요. 애플리케이션이 PostgreSQL 클러스터와 같은 네임스페이스에 배포되어 있다면 서비스 이름을 사용하면 돼요. PostgreSQL 클러스터가 다른 네임스페이스에 있다면 전체 한정자(FQDN)를 사용할 수 있어요: service-name.namespace-name.
DNS는 가장 선호되고 권장되는 디스커버리 방법이에요.
환경 변수(Environment variables)
애플리케이션을 PostgreSQL 클러스터가 있는 네임스페이스에 배포한다면 환경 변수로 데이터베이스에 연결할 수도 있어요.
예를 들어, PostgreSQL 클러스터 이름이 pg-database라고 가정해 볼게요. 애플리케이션에서 다음과 같은 환경 변수를 사용할 수 있어요:
-
PG_DATABASE_R_SERVICE_HOST: 읽기 전용 워크로드를 위해 모든 PostgreSQL 인스턴스를 가리키는 서비스의 IP 주소 -
PG_DATABASE_RO_SERVICE_HOST: 클러스터의 모든 핫 스탠바이 복제본을 가리키는 서비스의 IP 주소 -
PG_DATABASE_RW_SERVICE_HOST: 클러스터의 프라이머리(primary) 인스턴스를 가리키는 서비스의 IP 주소
시크릿(Secrets)
PostgreSQL 오퍼레이터는 배포하는 모든 PostgreSQL 클러스터에 대해 최대 두 개의 basic-auth 타입 시크릿을 생성해요:
[cluster name]-app(.spec.bootstrap.initdb.secret.name을 통해 기존 시크릿을 제공하지 않은 경우)[cluster name]-superuser(.spec.enableSuperuserAccess가true로 설정되어 있고.spec.superuserSecret으로 다른 시크릿을 지정하지 않은 경우)
각 시크릿에는 다음이 포함돼요:
- username
- password
- RW 서비스의 hostname
- port 번호
- database 이름
- 동작하는
.pgpass file - uri
- jdbc-uri
- fqdn-uri
- fqdn-jdbc-uri
URI에 사용되는 FQDN은 KUBERNETES_CLUSTER_DOMAIN 구성 파라미터에 지정된 Kubernetes 클러스터 도메인을 사용해 계산돼요. 자세한 내용은 오퍼레이터 구성 문서를 참고해 주세요.
-app 자격 증명은 PostgreSQL 클러스터에 연결하는 애플리케이션이 사용해야 하는 것으로, 데이터베이스를 *소유(owning)*한 사용자에 해당해요.
-superuser 자격 증명은 관리 목적으로만 사용해야 하며, postgres 사용자에 해당해요.
:::info[Important] 네트워크를 통한 수퍼유저 접근은 기본적으로 비활성화되어 있어요. :::