본문 바로가기
WIKI 기술 지식 베이스

애플리케이션에서 연결하기

원문 보기 위키 갱신

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으로 다른 시크릿을 지정하지 않은 경우)

각 시크릿에는 다음이 포함돼요:

URI에 사용되는 FQDN은 KUBERNETES_CLUSTER_DOMAIN 구성 파라미터에 지정된 Kubernetes 클러스터 도메인을 사용해 계산돼요. 자세한 내용은 오퍼레이터 구성 문서를 참고해 주세요.

-app 자격 증명은 PostgreSQL 클러스터에 연결하는 애플리케이션이 사용해야 하는 것으로, 데이터베이스를 *소유(owning)*한 사용자에 해당해요.

-superuser 자격 증명은 관리 목적으로만 사용해야 하며, postgres 사용자에 해당해요.

:::info[Important] 네트워크를 통한 수퍼유저 접근은 기본적으로 비활성화되어 있어요. :::

더 알아보기 (Learn more)