在 GKE 上部署 PostgreSQL 矢量数据库

本教程介绍如何在 Google Kubernetes Engine (GKE) 上部署 PostgreSQL 矢量数据库集群。

PostgreSQL 附带一系列模块和扩展程序,可扩展数据库的功能。在本教程中,您将在部署到 GKE 的现有 PostgreSQL 集群上安装 pgvector 扩展程序。借助 Pgvector 扩展程序,您可以将矢量类型添加到 PostgreSQL,从而将矢量存储在数据库表中。Pgvector 还可以通过运行常见 SQL 查询来提供相似性搜索。

我们首先部署 CloudnativePG 运算符以简化 PGvector 扩展程序部署,因为该运算符提供该扩展程序的捆绑版本。

本教程适用于想要在 GKE 上部署 PostgreSQL 数据库集群的云平台管理员和架构师机器学习工程师以及 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_TOKEN 使用 gcloud auth print-access-token 命令检索访问令牌,以对与各种 Google Cloud API 的交互进行身份验证
  • PROJECT_IDREGIONKUBERNETES_CLUSTER_PREFIX 是在设置环境部分中定义的环境变量,分配给您要创建的 Autopilot 集群的新相关变量。

出现提示时,请输入 yes

Terraform 会创建以下资源:

  • Kubernetes 节点的自定义 VPC 网络和专用子网。
  • 用于通过网络地址转换 (NAT) 访问互联网的 Cloud Router 路由器。
  • 专用 GKE 集群(在 us-central1 区域中)。
  • 具有集群的日志记录和监控权限的 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_TOKEN 使用 gcloud auth print-access-token 命令检索访问令牌,以对与各种 Google Cloud API 的交互进行身份验证。
  • PROJECT_IDREGIONKUBERNETES_CLUSTER_PREFIX 是在设置环境部分中定义的环境变量,分配给您要创建的标准集群的新相关变量。

出现提示时,请输入 yes。完成这些命令并使集群显示就绪状态可能需要几分钟时间。

Terraform 会创建以下资源:

  • Kubernetes 节点的自定义 VPC 网络和专用子网。
  • 用于通过网络地址转换 (NAT) 访问互联网的 Cloud Router 路由器。
  • 位于 us-central1 区域并且启用了自动扩缩功能的专用 GKE 集群(每个可用区一个到两个节点)。
  • 具有集群的日志记录和监控权限的 ServiceAccount
  • 用于集群监控和提醒的 Google Cloud Managed Service for Prometheus 配置。

输出类似于以下内容:

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

连接到集群

配置 kubectl 以提取凭据并与新的 GKE 集群通信:

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

部署 CloudNativePG 运算符

使用 Helm 图表将 CloudNativePG 部署到 Kubernetes 集群:

  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 清单描述了 Deployment:

    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. 导入来源中,选择网址

  3. 笔记本网址下方,输入以下链接:

    https://raw.githubusercontent.com/epam/kubernetes-engine-samples/internal_lb/databases/postgres-pgvector/manifests/02-notebook/vector-database.ipynb
    
  4. 点击导入

连接到运行时并运行查询

如需连接到运行时并运行查询,请执行以下操作:

  1. 在笔记本中,点击连接按钮旁边的 其他连接选项。此时会显示连接到 Vertex AI Runtime 窗格。

  2. 选择连接到运行时,然后选择连接到现有运行时

  3. 选择您启动的运行时,然后点击连接

  4. 如需运行笔记本单元,请点击每个代码单元旁边的 运行单元按钮。

该笔记本包含代码单元和用于描述每个代码块的文本。运行代码单元会执行其命令并显示输出。您可以按顺序运行单元,也可以根据需要运行单个单元。