פריסת מסד נתונים וקטורי של PostgreSQL ב-GKE

במדריך הזה נסביר איך לפרוס אשכול של מסד נתונים וקטורי של PostgreSQL ב-Google Kubernetes Engine ‏ (GKE).

PostgreSQL מגיע עם מגוון מודולים ותוספים שמרחיבים את הפונקציונליות של מסד הנתונים. במדריך הזה נסביר איך להתקין את התוסף pgvector באשכול PostgreSQL קיים שנפרס ב-GKE. התוסף Pgvector מאפשר לאחסן וקטורים בטבלאות של מסד הנתונים על ידי הוספת סוגי וקטורים ל-PostgreSQL. בנוסף, pgvector מספקת חיפושים של דמיון על ידי הפעלת שאילתות SQL נפוצות.

כדי לפשט את הפריסה של התוסף PGvector, אנחנו פורסים קודם את האופרטור CloudnativePG, כי האופרטור מספק גרסה של התוסף שכלולה בחבילה.

המדריך הזה מיועד לאדמינים ומומחי Cloud Architect של פלטפורמות ענן, למהנדסי ML ולמומחי MLOps (DevOps) שרוצים לפרוס אשכולות של מסדי נתונים של PostgreSQL ב-GKE.

מטרות

במדריך הזה תלמדו איך:

  • פריסת תשתית GKE ל-PostgreSQL.
  • מתקינים את התוסף pgvector באשכול PostgreSQL שנפרס ב-GKE.
  • פורסים ומגדירים את האופרטור CloudNativePG PostgreSQL באמצעות Helm.
  • העלאה של מערך נתונים לדוגמה והרצת שאילתות חיפוש באמצעות Jupyter Notebook.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

במדריך הזה משתמשים ב-Cloud Shell כדי להריץ פקודות. ‫Cloud Shell היא סביבת מעטפת לניהול משאבים שמתארחים ב- Google Cloud. הוא מגיע עם כלי שורת הפקודה Google Cloud CLI, ‏ kubectl,‏ Helm ו- Terraform. אם אתם לא משתמשים ב-Cloud Shell, אתם צריכים להתקין את Google Cloud CLI.

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את ממשקי Cloud Resource Manager,‏ Compute Engine,‏ GKE ו-IAM Service Account Credentials API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable cloudresourcemanager.googleapis.com compute.googleapis.com container.googleapis.com iamcredentials.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את ממשקי Cloud Resource Manager,‏ Compute Engine,‏ GKE ו-IAM Service Account Credentials API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable cloudresourcemanager.googleapis.com compute.googleapis.com container.googleapis.com iamcredentials.googleapis.com
  14. מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM: roles/compute.securityAdmin, roles/compute.viewer, roles/container.clusterAdmin, roles/container.admin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט.
    • USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה, myemail@example.com.
    • ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.

מגדירים את הסביבה

כדי להגדיר את הסביבה באמצעות Cloud Shell:

  1. מגדירים משתני סביבה לפרויקט, לאזור ולקידומת של משאב אשכול Kubernetes:

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=postgres
    export REGION=us-central1
    
    • מחליפים את PROJECT_ID במזהה הפרויקט ב- Google Cloud.

    במדריך הזה נעשה שימוש באזור 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.

אפשר לבחור לפרוס את 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_ID,‏ REGION ו-KUBERNETES_CLUSTER_PREFIX הם משתני הסביבה שמוגדרים בקטע הגדרת הסביבה ומוקצים למשתנים הרלוונטיים החדשים עבור אשכול Autopilot שאתם יוצרים.

כשמופיעה בקשה, כותבים yes.

‫Terraform יוצר את המשאבים הבאים:

  • רשת VPC בהתאמה אישית ותת-רשת פרטית לצמתים של Kubernetes.
  • ‫Cloud Router כדי לגשת לאינטרנט דרך תרגום כתובות רשת (NAT).
  • אשכול GKE פרטי באזור us-central1.
  • ServiceAccount עם הרשאות רישום ביומן ומעקב עבור האשכול.
  • הגדרת השירות המנוהל של Google Cloud ל-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_ID, ‏REGION ו-KUBERNETES_CLUSTER_PREFIX הם משתני הסביבה שמוגדרים בקטע הגדרת הסביבה ומוקצים למשתנים הרלוונטיים החדשים עבור אשכול Standard שאתם יוצרים.

כשמופיעה בקשה, כותבים yes. יכול להיות שיחלפו כמה דקות עד שהפקודות האלה יסתיימו והאשכול יציג סטטוס מוכן.

‫Terraform יוצר את המשאבים הבאים:

  • רשת VPC בהתאמה אישית ותת-רשת פרטית לצמתים של Kubernetes.
  • ‫Cloud Router כדי לגשת לאינטרנט דרך תרגום כתובות רשת (NAT).
  • אשכול GKE פרטי באזור us-central1 עם התאמה אוטומטית לעומס (node אחד עד שני צמתים לכל אזור).
  • ServiceAccount עם הרשאות רישום ביומן ומעקב עבור האשכול.
  • הגדרת השירות המנוהל של Google Cloud ל-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

פורסים את CloudNativePG באשכול Kubernetes באמצעות תרשים Helm:

  1. בודקים את הגרסה של Helm:

    helm version
    

    אם הגרסה ישנה יותר מ-3.13, צריך לעדכן אותה:

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
  2. מוסיפים את מאגר התרשימים של CloudNativePG operator Helm:

    helm repo add cnpg https://cloudnative-pg.github.io/charts
    
  3. פורסים את האופרטור CloudNativePG באמצעות כלי שורת הפקודה Helm:

    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.

מתחברים למסד הנתונים של PostgreSQL באמצעות Colab Enterprise. משתמשים בתבנית ייעודית של זמן ריצה כדי לפרוס ל-postgres-vpc, כדי שמחברת ה-notebook תוכל לתקשר עם משאבים באשכול GKE.

מידע נוסף על Vertex AI Colab Enterprise זמין במאמרי העזרה של Colab Enterprise.

יצירת תבנית בזמן ריצה

כדי ליצור תבנית של סביבת זמן ריצה ב-Colab Enterprise:

  1. במסוף Google Cloud , עוברים לדף Runtime Templates של Colab Enterprise ומוודאים שהפרויקט שלכם נבחר:

    עוברים אל Runtime Templates

  2. לוחצים על תבנית חדשה. מופיע הדף יצירת תבנית חדשה של זמן ריצה.

  3. בקטע Runtime basics:

    • בשדה שם מוצג, מזינים pgvector-connect.
    • ברשימה הנפתחת אזור, בוחרים באפשרות us-central1. זהו אותו אזור כמו באשכול GKE.
  4. בקטע Configure compute (הגדרת מחשוב):

    • ברשימה הנפתחת סוג המכונה בוחרים באפשרות e2-standard-2.
    • בשדה גודל הדיסק, מזינים 30.
  5. בקטע רשתות ואבטחה:

    • ברשימה הנפתחת רשת, בוחרים את הרשת שבה נמצא אשכול GKE.
    • ברשימה הנפתחת Subnetwork (רשת משנה), בוחרים את רשת המשנה המתאימה.
    • מבטלים את הסימון בתיבת הסימון הפעלת גישה ציבורית לאינטרנט.
  6. כדי לסיים את יצירת התבנית בזמן ריצה, לוחצים על יצירה. התבנית של סביבת זמן הריצה מופיעה ברשימה בכרטיסייה תבניות של סביבת זמן הריצה.

יצירת סביבת ריצה

כדי ליצור סביבת זמן ריצה ב-Colab Enterprise:

  1. ברשימת תבניות זמן הריצה של התבנית שיצרתם, בעמודה פעולות, לוחצים על ואז על יצירת זמן ריצה. מופיעה החלונית Create Vertex AI Runtime.

  2. כדי ליצור סביבת ריצה על סמך התבנית, לוחצים על יצירה.

  3. בכרטיסייה Runtimes (זמני ריצה) שנפתחת, מחכים שהסטטוס ישתנה ל-Healthy (תקין).

ייבוא המחברת

כדי לייבא את ה-notebook ב-Colab Enterprise:

  1. עוברים לכרטיסייה המחברות שלי ולוחצים על ייבוא. החלונית Import notebooks תופיע.

  2. בקטע מקור לייבוא, בוחרים באפשרות כתובת URL.

  3. בקטע כתובות URL של מחברות, מזינים את הקישור הבא:

    https://raw.githubusercontent.com/epam/kubernetes-engine-samples/internal_lb/databases/postgres-pgvector/manifests/02-notebook/vector-database.ipynb
    
  4. לוחצים על Import.

התחברות לסביבת זמן הריצה והרצת שאילתות

כדי להתחבר לסביבת זמן הריצה ולהריץ שאילתות:

  1. במחברת, ליד הלחצן Connect (התחברות), לוחצים על Additional connection options (אפשרויות חיבור נוספות). מופיעה החלונית Connect to Vertex AI Runtime (התחברות לסביבת זמן ריצה של Vertex AI).

  2. בוחרים באפשרות Connect to a runtime (התחברות לסביבת זמן ריצה) ואז באפשרות Connect to an existing Runtime (התחברות לסביבת זמן ריצה קיימת).

  3. בוחרים את זמן הריצה שהפעלתם ולוחצים על Connect (חיבור).

  4. כדי להריץ את התאים ב-notebook, לוחצים על הלחצן Run cell לצד כל תא קוד.

הנוטבוק מכיל תאי קוד וטקסט שמתאר כל בלוק קוד. כשמריצים תא קוד, הפקודות שבו מופעלות ומוצג פלט. אפשר להריץ את התאים לפי הסדר, או להריץ תאים ספציפיים לפי הצורך.

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.

מחיקת הפרויקט

הדרך הכי קלה להימנע מחיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק Google Cloud פרויקט:

gcloud projects delete PROJECT_ID

אם מחקתם את הפרויקט, סיימתם את הניקוי. אם לא מחקתם את הפרויקט, צריך למחוק את המשאבים בנפרד.

מחיקת משאבים בודדים

  1. מגדירים משתני סביבה.

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=postgres
    export REGION=us-central1
    
  2. מריצים את הפקודה terraform destroy:

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

    מחליפים את FOLDER ב-gke-autopilot או ב-gke-standard, בהתאם לסוג אשכול GKE שיצרתם.

    כשמופיעה בקשה, כותבים yes.

המאמרים הבאים