GKE에 PostgreSQL 벡터 데이터베이스 배포

이 튜토리얼에서는 Google Kubernetes Engine(GKE)에 PostgreSQL 벡터 데이터베이스 클러스터를 배포하는 방법을 보여줍니다.

PostgreSQL에는 데이터베이스의 기능을 확장하는 다양한 모듈과 확장 프로그램이 함께 제공됩니다. 이 튜토리얼에서는 GKE에 배포된 기존 PostgreSQL 클러스터에 pgvector 확장 프로그램을 설치합니다. Pgvector 확장 프로그램을 사용하면 PostgreSQL에 벡터 유형을 추가하여 데이터베이스 테이블에 벡터를 저장할 수 있습니다. Pgvector는 일반적인 SQL 쿼리를 실행하여 유사성 검색도 제공합니다.

연산자가 확장 프로그램의 번들 버전을 제공하므로 먼저 CloudnativePG 연산자를 배포하여 PGvector 확장 프로그램 배포를 단순화합니다.

이 튜토리얼은 GKE에서 PostgreSQL 데이터베이스 클러스터를 배포하는 데 관심이 있는 클라우드 플랫폼 관리자 및 설계자, ML 엔지니어, MLOps(DevOps) 전문가를 대상으로 합니다.

목표

이 튜토리얼에서는 다음을 수행하는 방법을 알아봅니다.

  • PostgreSQL용 GKE 인프라 배포
  • GKE에 배포된 PostgreSQL 클러스터에 pgvector 확장 프로그램 설치
  • Helm을 사용하여 CloudNativePG PostgreSQL 연산자 배포 및 구성
  • Jupyter 노트북으로 데모 데이터 세트 업로드 및 검색어 실행

환경 설정

Cloud Shell로 환경을 설정하려면 다음 단계를 따르세요.

  1. 프로젝트, 리전, Kubernetes 클러스터 리소스 프리픽스의 환경 변수를 설정합니다.

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=postgres
    export REGION=us-central1
    
    • PROJECT_ID를 Google Cloud프로젝트 ID로 바꿉니다.

    이 튜토리얼에서는 us-central1 리전을 사용합니다.

  2. GitHub에서 샘플 코드 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  3. postgres-pgvector 디렉터리로 이동합니다.

    cd kubernetes-engine-samples/databases/postgres-pgvector
    

클러스터 인프라 만들기

이 섹션에서는 Terraform 스크립트를 실행하여 가용성이 높은 비공개 리전 GKE 클러스터를 만들어 PostgreSQL 데이터베이스를 배포합니다.

Standard 또는 Autopilot 클러스터를 사용하여 PostgreSQL을 배포할 수 있습니다. 각 유형은 고유한 장점이 있으며 서로 다른 가격 책정 모델을 제공합니다.

Autopilot

Autopilot 클러스터 인프라를 배포하려면 Cloud Shell에서 다음 명령어를 실행합니다.

export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=../postgresql-cloudnativepg/terraform/gke-autopilot init
terraform -chdir=../postgresql-cloudnativepg/terraform/gke-autopilot apply \
-var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

GKE는 런타임 시 다음 변수를 바꿉니다.

  • GOOGLE_OAUTH_ACCESS_TOKENgcloud auth print-access-token 명령어를 사용하여 다양한 Google Cloud API와의 상호작용을 인증하는 액세스 토큰을 검색합니다.
  • PROJECT_ID, REGION, KUBERNETES_CLUSTER_PREFIX환경 설정 섹션에 정의된 환경 변수이며 생성 중인 Autopilot 클러스터의 새 관련 변수에 할당됩니다.

메시지가 표시되면 yes를 입력합니다.

Terraform에서 다음 리소스를 만듭니다.

  • Kubernetes 노드의 커스텀 VPC 네트워크 및 비공개 서브넷
  • 네트워크 주소 변환(NAT)을 통해 인터넷에 액세스하는 Cloud Router
  • us-central1 리전의 비공개 GKE 클러스터
  • 클러스터에 대한 로깅 및 모니터링 권한이 있는 ServiceAccount
  • 클러스터 모니터링 및 알림을 위한 Google Cloud Managed Service for Prometheus 구성

출력은 다음과 비슷합니다.

...
Apply complete! Resources: 11 added, 0 changed, 0 destroyed.
...

표준

Standard 클러스터 인프라를 배포하려면 Cloud Shell에서 다음 명령어를 실행합니다.

export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=../postgresql-cloudnativepg/terraform/gke-standard init
terraform -chdir=../postgresql-cloudnativepg/terraform/gke-standard apply \
-var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

GKE는 런타임 시 다음 변수를 바꿉니다.

  • GOOGLE_OAUTH_ACCESS_TOKENgcloud auth print-access-token 명령어를 사용하여 다양한 Google Cloud API와의 상호작용을 인증하는 액세스 토큰을 검색합니다.
  • PROJECT_ID, REGION, KUBERNETES_CLUSTER_PREFIX환경 설정 섹션에 정의된 환경 변수이며 만든 Standard 클러스터의 새 관련 변수에 할당됩니다.

메시지가 표시되면 yes를 입력합니다. 이러한 명령어가 완료되고 클러스터에 준비 상태가 표시되는 데 몇 분 정도 걸릴 수 있습니다.

Terraform에서 다음 리소스를 만듭니다.

  • Kubernetes 노드의 커스텀 VPC 네트워크 및 비공개 서브넷
  • 네트워크 주소 변환(NAT)을 통해 인터넷에 액세스하는 Cloud Router
  • 자동 확장이 사용 설정된 us-central1 리전의 비공개 GKE 클러스터(영역당 노드 1~2개)
  • 클러스터에 대한 로깅 및 모니터링 권한이 있는 ServiceAccount
  • 클러스터 모니터링 및 알림을 위한 Google Cloud Managed Service for Prometheus 구성

출력은 다음과 비슷합니다.

...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...

클러스터에 연결

사용자 인증 정보를 가져오고 새 GKE 클러스터와 통신하도록 kubectl을 구성합니다.

gcloud container clusters get-credentials \
    ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${REGION} --project ${PROJECT_ID}

CloudNativePG 연산자 배포

Helm 차트를 사용하여 Kubernetes 클러스터에 CloudNativePG를 배포합니다.

  1. Helm의 버전을 확인합니다.

    helm version
    

    3.13 이전인 경우 버전을 업데이트합니다.

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
  2. CloudNativePG 연산자 Helm 차트 저장소를 추가합니다.

    helm repo add cnpg https://cloudnative-pg.github.io/charts
    
  3. Helm 명령줄 도구를 사용하여 CloudNativePG 연산자를 배포합니다.

    helm upgrade --install cnpg \
        --namespace cnpg-system \
        --create-namespace \
        cnpg/cloudnative-pg
    

    출력은 다음과 비슷합니다.

    Release "cnpg" does not exist. Installing it now.
    NAME: cnpg
    LAST DEPLOYED: Fri Oct 13 13:52:36 2023
    NAMESPACE: cnpg-system
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    ...
    

PostgreSQL 벡터 데이터베이스 배포

이 섹션에서는 PostgreSQL 벡터 데이터베이스를 배포합니다.

  1. 데이터베이스의 네임스페이스 pg-ns를 만듭니다.

    kubectl create ns pg-ns
    
  2. 매니페스트를 적용하여 PostgreSQL 클러스터를 배포합니다. 클러스터 매니페스트는 pgvector 확장 프로그램을 사용 설정합니다.

    kubectl apply -n pg-ns -f manifests/01-basic-cluster/postgreSQL_cluster.yaml
    

    postgreSQL_cluster.yaml 매니페스트는 배포를 설명합니다.

    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: gke-pg-cluster
    spec:
      description: "Standard GKE PostgreSQL cluster"
      imageName: ghcr.io/cloudnative-pg/postgresql:16.2
      enableSuperuserAccess: true
      instances: 3
      startDelay: 300
      primaryUpdateStrategy: unsupervised
      postgresql:
        pg_hba:
          - host all all 10.48.0.0/20 md5
      bootstrap:
        initdb:
          postInitTemplateSQL:
            - CREATE EXTENSION IF NOT EXISTS vector;
          database: app
      storage:
        storageClass: premium-rwo
        size: 2Gi
      resources:
        requests:
          memory: "1Gi"
          cpu: "1000m"
        limits:
          memory: "1Gi"
          cpu: "1000m"
      affinity:
        enablePodAntiAffinity: true
        tolerations:
        - key: cnpg.io/cluster
          effect: NoSchedule
          value: gke-pg-cluster
          operator: Equal
        additionalPodAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app.component
                  operator: In
                  values:
                  - "pg-cluster"
              topologyKey: topology.kubernetes.io/zone
      monitoring:
        enablePodMonitor: true
  3. 클러스터의 상태를 확인합니다.

    kubectl get cluster -n pg-ns --watch
    

    다음 단계로 이동하기 전에 출력에 Cluster in healthy state 상태가 표시될 때까지 기다립니다.

Vertex AI Colab Enterprise 노트북으로 쿼리 실행

이 섹션에서는 PostgreSQL 테이블에 벡터를 업로드하고 SQL 구문을 사용하여 시맨틱 검색어를 실행합니다.

Colab Enterprise를 사용하여 PostgreSQL 데이터베이스에 연결합니다. 전용 런타임 템플릿을 사용하여 postgres-vpc에 배포하면 노트북이 GKE 클러스터의 리소스와 통신할 수 있습니다.

Vertex AI Colab Enterprise에 대한 자세한 내용은 Colab Enterprise 문서를 참조하세요.

런타임 템플릿 만들기

Colab Enterprise 런타임 템플릿을 만들려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 Colab Enterprise 런타임 템플릿 페이지로 이동하여 프로젝트가 선택되어 있는지 확인합니다.

    런타임 템플릿으로 이동

  2. 새 템플릿을 클릭합니다. 새 런타임 템플릿 만들기 페이지가 표시됩니다.

  3. 런타임 기본사항 섹션에서 다음을 수행합니다.

    • 표시 이름 필드에 pgvector-connect을 입력합니다.
    • 리전 드롭다운 목록에서 us-central1을 선택합니다. GKE 클러스터와 동일한 리전입니다.
  4. 컴퓨팅 구성 섹션에서 다음을 수행합니다.

    • 머신 유형 드롭다운 목록에서 e2-standard-2를 선택합니다.
    • 디스크 크기 필드에 30을 입력합니다.
  5. 네트워킹 및 보안 섹션에서 다음을 수행합니다.

    • 네트워크 드롭다운 목록에서 GKE 클러스터가 있는 네트워크를 선택합니다.
    • 서브네트워크 드롭다운 목록에서 해당 서브네트워크를 선택합니다.
    • 공개 인터넷 액세스 사용 설정 체크박스를 선택 취소합니다.
  6. 런타임 템플릿 만들기를 완료하려면 만들기를 클릭합니다. 런타임 템플릿이 런타임 템플릿 탭의 목록에 나타납니다.

런타임 만들기

Colab Enterprise 런타임을 만들려면 다음 안내를 따르세요.

  1. 방금 만든 템플릿의 런타임 템플릿 목록에서 작업 열에 있는 를 클릭한 후 런타임 만들기를 클릭합니다. Vertex AI 런타임 만들기 창이 표시됩니다.

  2. 템플릿을 기반으로 런타임을 만들려면 만들기를 클릭합니다.

  3. 런타임 탭이 열리면 상태가 정상으로 전환될 때까지 기다립니다.

노트북 가져오기

Colab Enterprise에서 노트북을 가져오려면 다음 안내를 따르세요.

  1. 내 노트북 탭으로 이동하여 가져오기를 클릭합니다. 노트북 가져오기 창이 표시됩니다.

  2. 가져오기 소스에서 URL을 선택합니다.

  3. 노트북 URL 아래에 다음 링크를 입력합니다.

    https://raw.githubusercontent.com/epam/kubernetes-engine-samples/internal_lb/databases/postgres-pgvector/manifests/02-notebook/vector-database.ipynb
    
  4. 가져오기를 클릭합니다.

런타임에 연결 및 쿼리 실행

런타임에 연결하고 쿼리를 실행하려면 다음 안내를 따르세요.

  1. 노트북에서 연결 버튼 옆에 있는 추가 연결 옵션을 클릭합니다. Vertex AI 런타임에 연결 창이 표시됩니다.

  2. 런타임에 연결을 선택한 후 기존 런타임에 연결을 선택합니다.

  3. 시작한 런타임을 선택하고 연결을 클릭합니다.

  4. 노트북 셀을 실행하려면 각 코드 셀 옆에 있는 셀 실행 버튼을 클릭합니다.

노트북에는 코드 셀과 각 코드 블록을 설명하는 텍스트 모두 포함되어 있습니다. 코드 셀을 실행하면 명령어가 실행되고 출력이 표시됩니다. 셀을 순서대로 실행하거나 필요에 따라 개별 셀을 실행할 수 있습니다.