Weaviate-Vektordatenbank in GKE bereitstellen


In dieser Anleitung wird beschrieben, wie Sie einen Weaviate-Vektordatenbankcluster in Google Kubernetes Engine (GKE) bereitstellen.

Weaviate ist eine Open-Source-Vektordatenbank mit einer Leistung bei niedriger Latenz und grundlegender Unterstützung für verschiedene Medientypen wie Text und Bilder. Sie unterstützt die semantische Suche, die Beantwortung von Fragen und die Klassifizierung. Weaviate basiert vollständig auf Go und speichert sowohl Objekte als auch Vektoren. So können die Vektorsuche, die Keyword-Suche und eine Kombination aus beiden als Hybridsuche verwendet werden. Aus Sicht der Infrastruktur ist Weaviate eine cloudnative und fehlertolerante Datenbank. Die Fehlertoleranz wird durch eine führungslose Architektur erreicht, bei der jeder Knoten des Datenbankclusters Lese- und Schreibanfragen bearbeiten kann. Dadurch wird ein Single Point of Failure ausgeschlossen.

Diese Anleitung richtet sich an Cloud Platform-Administratoren und -Architekten, ML-Entwickler und MLOps-Experten (DevOps), die an der Bereitstellung von Vektordatenbankclustern auf GKE interessiert sind.

Vorteile

Weaviate bietet folgende Vorteile:

  • Bibliotheken für verschiedene Programmiersprachen und eine offene API zur Einbindung in andere Dienste.
  • Horizontale Skalierung.
  • Ein Gleichgewicht zwischen Wirtschaftlichkeit und Abfragegeschwindigkeit, insbesondere bei großen Datenmengen. Sie können festlegen, wie viele Daten im Arbeitsspeicher und wie viele auf dem Laufwerk gespeichert werden.

Ziele

In dieser Anleitung erfahren Sie mehr über die folgenden Themen:

  • GKE-Infrastruktur für Weaviate planen und bereitstellen.
  • Weaviate-Datenbank in einem GKE-Cluster bereitstellen und konfigurieren.
  • Führen Sie ein Notebook aus, um Beispielvektoreinbettungen in Ihrer Datenbank zu generieren und zu speichern, und führen Sie vektorbasierte Suchanfragen aus.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

In dieser Anleitung verwenden Sie Cloud Shell zum Ausführen von Befehlen. Cloud Shell ist eine Shell-Umgebung für die Verwaltung von Ressourcen, die in Google Cloud gehostet werden. Es ist bei Google Cloud CLI, kubectl, Helm und Terraform-Befehlszeilentools vorinstalliert. Wenn Sie Cloud Shell nicht verwenden, müssen Sie die Google Cloud CLI installieren.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Cloud Resource Manager, Compute Engine, GKE, and IAM Service Account Credentials APIs:

    gcloud services enable cloudresourcemanager.googleapis.com compute.googleapis.com container.googleapis.com iamcredentials.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Cloud Resource Manager, Compute Engine, GKE, and IAM Service Account Credentials APIs:

    gcloud services enable cloudresourcemanager.googleapis.com compute.googleapis.com container.googleapis.com iamcredentials.googleapis.com
  12. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/compute.securityAdmin, roles/compute.viewer, roles/container.clusterAdmin, roles/container.admin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/monitoring.viewer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

Umgebung einrichten

So richten Sie Ihre Umgebung mit Cloud Shell ein:

  1. Legen Sie Umgebungsvariablen für Ihr Projekt, Ihre Region und ein Kubernetes-Clusterressourcenpräfix fest:

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=weaviate
    export REGION=us-central1
    

    Ersetzen Sie PROJECT_ID durch die Google Cloud-Projekt-ID.

    In dieser Anleitung wird die Region us-central1 verwendet, um Ihre Bereitstellungsressourcen zu erstellen.

  2. Prüfen Sie die Helm-Version:

    helm version
    

    Aktualisieren Sie die Version, wenn sie älter als 3.13 ist:

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
  3. Klonen Sie das Beispielcode-Repository aus GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Rufen Sie das Verzeichnis weaviate auf:

    cd kubernetes-engine-samples/databases/weaviate
    

Clusterinfrastruktur erstellen

In diesem Abschnitt führen Sie ein Terraform-Skript aus, um einen privaten, hochverfügbaren regionalen GKE-Cluster zum Bereitstellen Ihrer Weaviate-Datenbank zu erstellen.

Sie können Weaviate mit einem Standard- oder Autopilot-Cluster bereitstellen. Jede hat ihre eigenen Vorteile und unterschiedliche Preismodelle.

Autopilot

Das folgende Diagramm zeigt einen im Projekt bereitgestellten Autopilot-GKE-Cluster.

GKE Autopilot-Cluster

Führen Sie die folgenden Befehle in Cloud Shell aus, um die Clusterinfrastruktur bereitzustellen:

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

GKE ersetzt die folgenden Variablen zur Laufzeit:

  • GOOGLE_OAUTH_ACCESS_TOKEN ruft mit dem Befehl gcloud auth print-access-token ein Zugriffstoken ab, das Interaktionen mit verschiedenen Google Cloud APIs authentifiziert.
  • PROJECT_ID, REGION und KUBERNETES_CLUSTER_PREFIX sind die im Abschnitt Umgebung einrichten definierten Umgebungsvariablen und den neuen relevanten Variablen für den Autopilot-Cluster zugewiesen, den Sie erstellen.

Geben Sie bei Aufforderung yes ein.

Die Ausgabe sieht in etwa so aus:

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

Outputs:

kubectl_connection_command = "gcloud container clusters get-credentials weaviate-cluster --region us-central1"

Terraform erstellt die folgenden Ressourcen:

  • Ein benutzerdefiniertes VPC-Netzwerk und ein privates Subnetz für die Kubernetes-Knoten
  • Ein Cloud Router für den Zugriff auf das Internet über Network Address Translation (NAT).
  • Ein privater GKE-Cluster in der Region us-central1.
  • Ein ServiceAccount mit Logging- und Monitoring-Berechtigungen für den Cluster.
  • Google Cloud Managed Service for Prometheus-Konfiguration für Clustermonitoring und Benachrichtigungen.

Standard

Das folgende Diagramm zeigt einen privaten Standard-GKE-Cluster, der in drei verschiedenen Zonen bereitgestellt wird.

GKE-Standardcluster

Führen Sie die folgenden Befehle in Cloud Shell aus, um die Clusterinfrastruktur bereitzustellen:

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

GKE ersetzt die folgenden Variablen zur Laufzeit:

  • GOOGLE_OAUTH_ACCESS_TOKEN ruft mit dem Befehl gcloud auth print-access-token ein Zugriffstoken ab, das Interaktionen mit verschiedenen Google Cloud APIs authentifiziert.
  • PROJECT_ID, REGION und KUBERNETES_CLUSTER_PREFIX sind die im Abschnitt Umgebung einrichten definierten Umgebungsvariablen und den neuen relevanten Variablen für den Standard-Cluster zugewiesen, den Sie erstellen.

Geben Sie bei Aufforderung yes ein. Es kann einige Minuten dauern, bis diese Befehle abgeschlossen sind und der Cluster den Status „Bereit“ anzeigt.

Die Ausgabe sieht in etwa so aus:

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

Outputs:

kubectl_connection_command = "gcloud container clusters get-credentials weaviate-cluster --region us-central1"

Terraform erstellt die folgenden Ressourcen:

  • Ein benutzerdefiniertes VPC-Netzwerk und ein privates Subnetz für die Kubernetes-Knoten
  • Ein Cloud Router für den Zugriff auf das Internet über Network Address Translation (NAT).
  • Ein privater GKE-Cluster in der Region us-central1 mit aktiviertem Autoscaling (ein bis zwei Knoten pro Zone).
  • Ein ServiceAccount mit Logging- und Monitoring-Berechtigungen für den Cluster.
  • Google Cloud Managed Service for Prometheus-Konfiguration für Clustermonitoring und Benachrichtigungen.

Mit dem Cluster verbinden

Konfigurieren Sie kubectl so, dass Anmeldedaten abgerufen und mit Ihrem neuen GKE-Cluster kommuniziert wird:

gcloud container clusters get-credentials \
    ${KUBERNETES_CLUSTER_PREFIX}-cluster --region ${REGION}

Weaviate-Datenbank in Ihrem Cluster bereitstellen

So stellen Sie die Weaviate-Datenbank mithilfe eines Helm-Diagramms in Ihrem GKE-Cluster bereit:

  1. Fügen Sie das Helm-Diagramm-Repository der Weaviate-Datenbank hinzu, bevor Sie es in Ihrem GKE-Cluster bereitstellen können:

    helm repo add weaviate https://weaviate.github.io/weaviate-helm
    
  2. Erstellen Sie den Namespace weaviate für die Datenbank:

    kubectl create ns weaviate
    
  3. Erstellen Sie ein Secret zum Speichern des API-Schlüssels:

    kubectl create secret generic apikeys --from-literal=AUTHENTICATION_APIKEY_ALLOWED_KEYS=$(openssl rand -base64 32) -n weaviate
    
  4. Stellen Sie einen internen Load Balancer bereit, um von innerhalb des virtuellen Netzwerks auf Weaviate zuzugreifen:

    kubectl apply -n weaviate -f manifests/05-ilb/ilb.yaml
    

    Das ilb.yaml-Manifest beschreibt den Load Balancer-Dienst:

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        #cloud.google.com/neg: '{"ingress": true}'
        networking.gke.io/load-balancer-type: "Internal"
      labels:
        app.kubernetes.io/name: weaviate
      name: weaviate-ilb
    spec:
      ports:
      - name: http
        port: 8080
        protocol: TCP
        targetPort: 8080
      - name: grpc
        port: 50051
        protocol: TCP
        targetPort: 50051
      selector:
        app: weaviate
      type: LoadBalancer
  5. Wenden Sie das Manifest an, um den Weaviate-Cluster bereitzustellen:

    helm upgrade --install "weaviate" weaviate/weaviate \
    --namespace "weaviate" \
    --values ./manifests/01-basic-cluster/weaviate_cluster.yaml
    

    Das weaviate_cluster.yaml-Manifest beschreibt das Deployment:

    initContainers:
      sysctlInitContainer:
        enabled: false
      extraInitContainers: {}
    resources: 
       requests:
         cpu: '1'
         memory: '4Gi'
       limits:
         cpu: '2'
         memory: '4Gi'
    replicas: 3
    storage:
      size: 10Gi
      storageClassName: "premium-rwo"
    service:
      name: weaviate
      ports:
        - name: http
          protocol: TCP
          port: 80
      type: ClusterIP
    grpcService:
      enabled: true
      name: weaviate-grpc
      ports:
        - name: grpc
          protocol: TCP
          port: 50051
      type: ClusterIP
    authentication:
      anonymous_access:
        enabled: false
    authorization:
      admin_list:
        enabled: true
        users:
          - admin@example.com
    modules:
      text2vec-palm:
        enabled: true
    env:
      AUTHENTICATION_APIKEY_ENABLED: 'true'
      AUTHENTICATION_APIKEY_USERS: 'admin@example.com'
      PROMETHEUS_MONITORING_ENABLED: true
    envSecrets:
      AUTHENTICATION_APIKEY_ALLOWED_KEYS: apikeys
    tolerations:
      - key: "app.stateful/component"
        operator: "Equal"
        value: "weaviate"
        effect: NoSchedule

    Warten Sie einige Minuten, bis der Weaviate-Cluster vollständig gestartet wurde.

  6. Prüfen Sie den Bereitstellungsstatus:

    kubectl get weaviate -n weaviate --watch
    

    Wenn die weaviate-Datenbank erfolgreich bereitgestellt wurde, sieht die Ausgabe in etwa so aus:

    NAME: weaviate
    LAST DEPLOYED: Tue Jun 18 13:15:53 2024
    NAMESPACE: weaviate
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    
  7. Warten Sie, bis Kubernetes die Ressourcen startet:

    kubectl wait pods -l app.kubernetes.io/name=weaviate --for condition=Ready --timeout=300s -n weaviate
    

Abfragen mit dem Vertex AI Colab Enterprise-Notebook ausführen

In diesem Abschnitt wird beschrieben, wie Sie mit Colab Enterprise eine Verbindung zu Ihrer Weaviate-Datenbank herstellen. Sie können eine spezielle Runtime-Vorlage auf dem weaviate-vpc bereitzustellen, damit das Notebook mit Ressourcen im GKE-Cluster kommunizieren kann.

Laufzeitvorlage erstellen.

So erstellen Sie eine Laufzeitvorlage:

  1. Rufen Sie in der Google Cloud Console die Seite Laufzeitvorlagen von Colab Enterprise auf und prüfen Sie, ob Ihr Projekt ausgewählt ist:

    Laufzeitvorlagen aufrufen

  2. Klicken Sie auf  Neue Vorlage. Die Seite Neue Laufzeitvorlage erstellen wird angezeigt.

  3. Im Abschnitt Laufzeitgrundlagen:

    • Geben Sie im Feld Anzeigename den Wert weaviate-connect ein.
    • Wählen Sie in der Drop-down-Liste Region us-central1 aus. Dies ist dieselbe Region wie Ihr GKE-Cluster.
  4. Im Abschnitt Computing konfigurieren:

    • Wählen Sie in der Drop-down-Liste Maschinentyp die Option e2-standard-2 aus.
    • Geben Sie im Feld Laufwerkgröße den Wert 30 ein.
  5. Im Abschnitt Netzwerk und Sicherheit:

    • Wählen Sie in der Drop-down-Liste Netzwerk ein Netzwerk aus, in dem sich Ihr GKE-Cluster befindet.
    • Wählen Sie in der Drop-down-Liste Subnetzwerk ein entsprechendes Subnetzwerk aus.
    • Entfernen Sie das Häkchen bei Öffentlichen Internetzugriff aktivieren.
  6. Klicken Sie auf Erstellen, um die Erstellung der Laufzeitvorlage abzuschließen. Ihre Laufzeitvorlage wird auf dem Tab Laufzeitvorlagen in der Liste angezeigt.

Laufzeit erstellen

So erstellen Sie eine Laufzeit:

  1. Klicken Sie in der Liste der Laufzeitvorlagen für die Vorlage, die Sie gerade erstellt haben, in der Spalte Aktionen auf  und dann auf Laufzeit erstellen. Der Bereich Vertex AI-Laufzeit erstellen wird angezeigt.

  2. Klicken Sie auf Erstellen, um eine Laufzeit basierend auf Ihrer Vorlage zu erstellen.

  3. Warten Sie auf dem Tab Laufzeiten, bis der Status zu Fehlerfrei wechselt.

Notebook importieren

So importieren Sie das Notebook:

  1. Rufen Sie den Tab Notebooks auf und klicken Sie auf Notebook aus URLs importieren.

  2. Wählen Sie unter Importquelle die Option URL aus.

  3. Fügen Sie unter Notebook-URLs den folgenden Link ein: raw.githubusercontent.com/epam/kubernetes-engine-samples/Weaviate/databases/weaviate/manifests/02-notebook/vector-database.ipynb

  4. Klicken Sie auf Importieren.

Verbindung zur Laufzeit herstellen und Abfragen ausführen

So stellen Sie eine Verbindung zur Laufzeit her und führen Abfragen aus:

  1. Klicken Sie im Notebook neben der Schaltfläche Verbinden auf das  Zusätzliche Verbindungsoptionen. Der Bereich Mit Vertex AI-Laufzeit verbinden wird angezeigt.

  2. Wählen Sie Mit einer Laufzeit verbinden und dann Mit einer vorhandenen Laufzeit verbinden aus.

  3. Wählen Sie die gestartete Laufzeit aus und klicken Sie auf Verbinden.

  4. Klicken Sie links neben jeder Codezelle auf die Schaltfläche Zelle ausführen, um die Notebookzellen auszuführen.

Das Notebook enthält Codezellen und Text, der die einzelnen Codeblöcke beschreibt. Wenn Sie eine Codezelle ausführen, werden die darin enthaltenen Befehle ausgeführt und eine Ausgabe angezeigt. Sie können die Zellen nacheinander oder nach Bedarf einzeln ausführen.

Weitere Informationen zu Vertex AI Colab Enterprise finden Sie in der Colab Enterprise-Dokumentation.

Prometheus-Messwerte für Ihren Cluster aufrufen

Der GKE-Cluster wird mit Google Cloud Managed Service for Prometheus konfiguriert, der die Erfassung von Messwerten im Prometheus-Format ermöglicht. Dieser Dienst bietet eine vollständig verwaltete Lösung für Monitoring und Benachrichtigungen, die die Erfassung, Speicherung und Analyse von Messwerten aus dem Cluster und seinen Anwendungen ermöglicht.

Das folgende Diagramm zeigt, wie Prometheus Messwerte für Ihren Cluster erfasst:

Prometheus-Messwerterhebung

Der private GKE-Cluster im Diagramm enthält die folgenden Komponenten:

  • Weaviate-Pods, die Messwerte für den Pfad /metrics und den Port 2112 verfügbar machen.
  • Prometheus-basierte Collectors, die die Messwerte aus den Weaviate-Pods verarbeiten.
  • Eine PodMonitoring-Ressource, die Messwerte an Cloud Monitoring sendet.

So exportieren Sie die Messwerte und zeigen sie an:

  1. Erstellen Sie die PodMonitoring-Ressource, um Messwerte nach labelSelector zu extrahieren:

    kubectl apply -n weaviate -f manifests/03-prometheus-metrics/pod-monitoring.yaml
    

    Das pod-monitoring.yaml-Manifest beschreibt die PodMonitoring-Ressource:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: weaviate
    spec:
      selector:
        matchLabels:
          app: weaviate
      endpoints:
      - port: 2112
        interval: 30s
        path: /metrics
  2. So importieren Sie ein benutzerdefiniertes Cloud Monitoring-Dashboard mit den in dashboard.json definierten Konfigurationen:

    gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
    
  3. Nachdem der Befehl erfolgreich ausgeführt wurde, rufen Sie die Cloud Monitoring-Dashboards auf:

    Zur Dashboard-Übersicht

  4. Öffnen Sie in der Liste der Dashboards das Weaviate Overview-Dashboard. Es kann einige Zeit dauern, bis Messwerte erfasst und angezeigt werden. Das Dashboard zeigt die Anzahl der Shards, Vektoren und die Latenz von Vorgängen an.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

Sie vermeiden weitere Kosten am einfachsten, wenn Sie das für die Anleitung erstellte Projekt löschen.

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

Wenn Sie das Projekt gelöscht haben, ist die Bereinigung abgeschlossen. Wenn Sie das Projekt nicht gelöscht haben, fahren Sie mit dem Löschen der einzelnen Ressourcen fort.

Einzelne Ressourcen löschen

  1. Umgebungsvariablen festlegen

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=weaviate
    export REGION=us-central1
    
  2. Führen Sie den Befehl terraform destroy aus:

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

    Ersetzen Sie FOLDER je nach Typ des von Ihnen erstellten GKE-Clusters durch gke-autopilot oder gke-standard.

    Geben Sie bei Aufforderung yes ein.

  3. Alle nicht angehängten Laufwerke suchen:

    export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,region)")
    
  4. Laufwerke löschen:

    for i in $disk_list; do
     disk_name=$(echo $i| cut -d'|' -f1)
     disk_region=$(echo $i| cut -d'|' -f2|sed 's|.*/||')
     echo "Deleting $disk_name"
     gcloud compute disks delete $disk_name --region $disk_region --quiet
    done
    
  5. GitHub-Repository löschen:

    rm -r ~/kubernetes-engine-samples/
    

Nächste Schritte