GKE に Qdrant ベクトル データベースをデプロイする


このガイドでは、Google Kubernetes Engine(GKE)に Qdrant ベクトル データベース クラスタをデプロイする方法について説明します。

ベクトル データベースは、高次元ベクトルの大規模なコレクションを管理および検索するために特別に設計されたデータストアです。これらのベクトルは、テキスト、画像、音声、動画などのデータのほか、数値でエンコードできるデータを表します。完全一致に依存する従来のデータベースとは異なり、ベクトル データベースは大規模なデータセット内の類似アイテムの検索やパターンの識別に特化しています。こうした特性を持つ Qdrant は、ニューラル ネットワークまたはセマンティック ベースのマッチング、ファセット検索など、さまざまなアプリケーションに適しています。Qdrant は、ベクトル データベースとしてだけでなく、ベクトル類似性検索エンジンとしても機能します。

このチュートリアルは、GKE に Qdrant データベース クラスタをデプロイすることに関心があるクラウド プラットフォームの管理者およびアーキテクトML エンジニア、MLOps(DevOps)の専門家を対象としています。

利点

Qdrant には次のようなメリットがあります。

  • さまざまなプログラミング言語に対応している幅広いライブラリと、他のサービスと統合できるオープン API。
  • 水平スケーリングと、シャーディング / レプリケーション サポートにより、スケーリングと高可用性を簡素化。
  • 最新のクラウドネイティブ環境でのデプロイと管理を可能にするコンテナと Kubernetes のサポート。
  • 高度なフィルタリングを使用した柔軟なペイロードで、検索条件を正確に調整。
  • さまざまな量子化オプションと、インフラストラクチャの費用を抑えながらパフォーマンスを向上させるその他の最適化。

目標

このチュートリアルでは、以下の方法について学習します。

  • Qdrant 向けに GKE インフラストラクチャを計画して、デプロイする
  • StatefulHA オペレーターをデプロイして、Qdrant の高可用性を確保する。
  • Qdrant クラスタをデプロイして構成する。
  • デモ データセットをアップロードし、シンプルな検索クエリを実行する。
  • 指標を収集してダッシュボードを実行する。

Deployment のアーキテクチャ

このアーキテクチャでは、複数のアベイラビリティ ゾーンにまたがる Qdrant のフォールト トレラントでスケーラブルな GKE クラスタを設定し、ローリング アップデートとサービスの停止を最小限に抑えて稼働時間と可用性を確保します。これには、効率的なフェイルオーバー管理のための StatefulHA オペレーターの使用も含まれます。詳細については、リージョン クラスタをご覧ください。

アーキテクチャ図

次の図は、GKE クラスタ内の複数のノードとゾーンで実行されている Qdrant クラスタを示しています。

Qdrant デプロイ アーキテクチャ

このアーキテクチャでは、Qdrant StatefulSet が 3 つの異なるゾーンの 3 つのノードにデプロイされています。

  • Helm チャート値ファイルに必要な Pod のアフィニティ ルールトポロジ分散の制約を構成することで、GKE がノード間で Pod を分散する方法を制御できます。
  • 1 つのゾーンで障害が発生すると、GKE は推奨構成に基づいて新しいノードで Pod を再スケジュールします。

このチュートリアルのアーキテクチャには、データの永続性について次の特性があります。

  • データの保持には、リージョン SSD ディスク(カスタム regional-pd StorageClass)を使用します。低レイテンシと高い IOPS が得られるため、データベースにはリージョン SSD ディスクをおすすめします。
  • ディスクデータはすべてリージョン内のプライマリ ゾーンとセカンダリ ゾーン間で複製されるため、ゾーン障害に対する耐性が向上します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

このチュートリアルでは、Cloud Shell を使用してコマンドを実行します。Google Cloud Shell は、Google Cloud でホストされているリソースを管理するためのシェル環境です。これには、Google Cloud CLIkubectlHelmTerraform コマンドライン ツールがプリインストールされています。Cloud Shell を使用しない場合は、Google Cloud CLI をインストールする必要があります。

  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 Resource Manager, Compute Engine, GKE, IAM Service Account Credentials, and Backup for GKE APIs:

    gcloud services enable cloudresourcemanager.googleapis.com compute.googleapis.com container.googleapis.com iamcredentials.googleapis.com gkebackup.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 Resource Manager, Compute Engine, GKE, IAM Service Account Credentials, and Backup for GKE APIs:

    gcloud services enable cloudresourcemanager.googleapis.com compute.googleapis.com container.googleapis.com iamcredentials.googleapis.com gkebackup.googleapis.com
  12. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/storage.objectViewer, roles/container.admin, roles/iam.serviceAccountAdmin, roles/compute.admin, roles/gkebackup.admin, 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.

環境を設定する

Cloud Shell を使用して環境を設定するには、次の操作を行います。

  1. プロジェクト、リージョン、Kubernetes クラスタ リソースの接頭辞に環境変数を設定します。

    このチュートリアルでは、us-central1 リージョンを使用して Deployment リソースを作成します。

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=qdrant
    export REGION=us-central1
    
    • PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
  2. Helm のバージョンを確認します。

    helm version
    

    3.13 より古い場合は、バージョンを更新します。

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
  3. GitHub からサンプルコード リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. qdrant ディレクトリに移動して、Deployment リソースの作成を開始します。

    cd kubernetes-engine-samples/databases/qdrant
    

クラスタ インフラストラクチャを作成する

このセクションでは、Terraform スクリプトを実行して、限定公開の高可用性 GKE リージョン クラスタを作成し、Qdrant データベースをデプロイします。

Qdrant のデプロイには、Standard クラスタまたは Autopilot クラスタを使用できます。それぞれに利点があり、料金モデルも異なります。

Autopilot

次の図は、3 つの異なるゾーンにデプロイされた Autopilot リージョン GKE クラスタを示しています。

GKE Autopilot クラスタ

クラスタ インフラストラクチャをデプロイするには、Cloud Shell で次のコマンドを実行します。

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}

次の変数は実行時に置き換えられます。

  • GOOGLE_OAUTH_ACCESS_TOKEN: gcloud auth print-access-token コマンドで取得したアクセス トークンに置き換え、さまざまな Google Cloud APIs とのやり取りを認証します。
  • PROJECT_IDREGIONKUBERNETES_CLUSTER_PREFIX は、環境を設定するセクションで定義した環境変数で、作成する Autopilot クラスタの新しい関連変数に割り当てられます。

プロンプトが表示されたら、「yes」と入力します。

出力は次のようになります。

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

Outputs:

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

Terraform が次のリソースを作成します。

  • Kubernetes ノード用のカスタム VPC ネットワークとプライベート サブネット
  • ネットワーク アドレス変換(NAT)を介してインターネットにアクセスするための Cloud Router。
  • us-central1 リージョンの限定公開 GKE クラスタ。
  • クラスタのロギングとモニタリングの権限を持つ ServiceAccount
  • クラスタのモニタリングおよびアラート用の Google Cloud Managed Service for Prometheus の構成。

Standard

次の図は、3 つの異なるゾーンにデプロイされた限定公開のリージョン GKE Standard クラスタを示しています。

GKE Standard クラスタ

クラスタ インフラストラクチャをデプロイするには、Cloud Shell で次のコマンドを実行します。

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}

次の変数は実行時に置き換えられます。

  • GOOGLE_OAUTH_ACCESS_TOKEN は、gcloud auth print-access-token コマンドで取得したアクセス トークンに置き換え、さまざまな Google Cloud APIs とのやり取りを認証します。
  • PROJECT_IDREGIONKUBERNETES_CLUSTER_PREFIX は、環境を設定するセクションで定義した環境変数で、作成する Standard クラスタの新しい関連変数に割り当てられます。

プロンプトが表示されたら、「yes」と入力します。これらのコマンドが完了し、クラスタが「準備完了」ステータスになるまでに数分かかることがあります。

出力は次のようになります。

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

Outputs:

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

Terraform が次のリソースを作成します。

  • Kubernetes ノード用のカスタム VPC ネットワークとプライベート サブネット
  • ネットワーク アドレス変換(NAT)を介してインターネットにアクセスするための Cloud Router。
  • 自動スケーリングを有効にした us-central1 リージョンの限定公開 GKE クラスタ(ゾーンあたり 1~2 ノード)。
  • クラスタのロギングとモニタリングの権限を持つ ServiceAccount
  • クラスタのモニタリングおよびアラート用の Google Cloud Managed Service for Prometheus の構成。

クラスタに接続する

認証情報を取得し、新しい GKE クラスタと通信できるように kubectl を構成します。

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

Qdrant データベースをクラスタにデプロイする

このチュートリアルでは、Helm チャートを使用して、Qdrant データベース(分散モード)と Stateful HA Operator を GKE クラスタにデプロイします。

デプロイにより、次の構成で GKE クラスタが作成されます。

  • Qdrant ノードの 3 つのレプリカ。
  • Kubernetes ノード全体に適切に分散されるように、toleration、ノード アフィニティ、トポロジ分散の制約が構成されます。これにより、ノードプールとさまざまなアベイラビリティ ゾーンが利用されます。
  • SSD ディスクタイプの RePD ボリュームは、データ ストレージ用にプロビジョニングされます。
  • Stateful HA オペレーターは、フェイルオーバー プロセスを管理し、高可用性を確保するために使用されます。
  • 認証のため、データベースは API キーを含む Kubernetes Secret を作成します。

Helm チャートを使用して Qdrant データベースをデプロイするには、次の操作を行います。

  1. StatefulHA アドオンを有効にする

    Autopilot

    GKE は、クラスタの作成時に StatefulHA アドオンを自動的に有効にします。

    Standard

    次のコマンドを実行します。

    gcloud container clusters update ${KUBERNETES_CLUSTER_PREFIX}-cluster \
        --project=${PROJECT_ID} \
        --region=${REGION} \
        --update-addons=StatefulHA=ENABLED
    

    このコマンドが完了し、クラスタが準備完了ステータスになるまでに 15 分かかることがあります。

  2. GKE クラスタにデプロイする前に、Qdrant データベースの Helm チャート リポジトリを追加します。

    helm repo add qdrant https://qdrant.github.io/qdrant-helm
    
  3. データベースの Namespace qdrant を作成します。

    kubectl create ns qdrant
    
  4. マニフェストを適用して、リージョン SSD 永続ディスク StorageClass を作成します。

    kubectl apply -n qdrant -f manifests/01-regional-pd/regional-pd.yaml
    

    regional-pd.yaml マニフェストには、永続 SSD ディスク StorageClass が記述されています。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    allowVolumeExpansion: true
    metadata:
      name: ha-regional
    parameters:
      replication-type: regional-pd
      type: pd-ssd
      availability-class: regional-hard-failover
    provisioner: pd.csi.storage.gke.io
    reclaimPolicy: Retain
    volumeBindingMode: WaitForFirstConsumer
  5. Helm を使用して、metrics サイドカー構成と Qdrant クラスタを含む Kubernetes configmap をデプロイします。

    kubectl apply -n qdrant -f manifests/03-prometheus-metrics/metrics-cm.yaml
    helm install qdrant-database qdrant/qdrant -n qdrant \
    -f manifests/02-values-file/values.yaml
    

    metrics-cm.yaml マニフェストには、metrics サイドカー ConfigMap が記述されています。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx-conf
    data:
      default.conf.template: |
        server {
          listen 80;
          location / {
            proxy_pass http://localhost:6333/metrics;
            proxy_http_version 1.1;
            proxy_set_header Host $http_host;
            proxy_set_header api-key ${QDRANT_APIKEY};
            proxy_set_header X-Forwarded-For $remote_addr;
          }
        }

    values.yaml マニフェストには、Qdrant クラスタの構成が記述されています。

    replicaCount: 3
    
    config:
      service:
        enable_tls: false
      cluster:
        enabled: true
      storage:
        optimizers:
          deleted_threshold: 0.5
          vacuum_min_vector_number: 1500
          default_segment_number: 2
          max_segment_size_kb: null
          memmap_threshold_kb: null
          indexing_threshold_kb: 25000
          flush_interval_sec: 5
          max_optimization_threads: 1
    
    livenessProbe:
      enabled: true
      initialDelaySeconds: 60
    
    resources:
      limits:
        cpu: "2"
        memory: 4Gi
      requests:
        cpu: "1"
        memory: 4Gi
    
    tolerations:
      - key: "app.stateful/component"
        operator: "Equal"
        value: "qdrant"
        effect: NoSchedule
    
    affinity:
      nodeAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
            - key: "app.stateful/component"
              operator: In
              values:
              - "qdrant"
    
    topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: "topology.kubernetes.io/zone"
        whenUnsatisfiable: ScheduleAnyway
        labelSelector:
          matchLabels:
            app.kubernetes.io/name: qdrant
            app.kubernetes.io/instance: qdrant
    
    podDisruptionBudget:
      enabled: true
      maxUnavailable: 1
    
    persistence:
      accessModes: ["ReadWriteOnce"]
      size: 10Gi
      storageClassName: ha-regional
    
    apiKey: true
    
    sidecarContainers:
      - name: metrics
        image: nginx:1.27
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
        env:
        - name: QDRANT_APIKEY 
          valueFrom:
            secretKeyRef:
              name: qdrant-database-apikey          
              key: api-key
        volumeMounts:
            - name: nginx-conf
              mountPath: /etc/nginx/templates/default.conf.template
              subPath: default.conf.template
              readOnly: true
    additionalVolumes:
      - name: nginx-conf
        configMap:
          name: nginx-conf
          items:
            - key: default.conf.template
              path: default.conf.template 

    この構成により、クラスタモードが有効になり、高可用性の分散 Qdrant クラスタを設定できます。

  6. Qdrant StatefulSet にラベルを追加します。

    kubectl label statefulset qdrant-database examples.ai.gke.io/source=qdrant-guide -n qdrant
    
  7. 内部ロードバランサをデプロイして、GKE クラスタと同じ VPC で実行されている Elasticsearch データベースにアクセスします。

    kubectl apply -n qdrant -f manifests/02-values-file/ilb.yaml
    

    ilb.yaml マニフェストには、LoadBalancer Service が記述されています。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        #cloud.google.com/neg: '{"ingress": true}'
        networking.gke.io/load-balancer-type: "Internal"
      labels:
        app.kubernetes.io/name: qdrant
      name: qdrant-ilb
    spec:
      ports:
      - name: http
        port: 6333
        protocol: TCP
        targetPort: 6333
      - name: grpc
        port: 6334
        protocol: TCP
        targetPort: 6334
      selector:
        app: qdrant
        app.kubernetes.io/instance: qdrant-database
      type: LoadBalancer
  8. デプロイのステータスを確認します。

    helm ls -n qdrant
    

    qdrant データベースが正常にデプロイされると、次のように出力されます。

    NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    qdrant-database  qdrant          1               2024-02-06 20:21:15.737307567 +0000 UTC deployed        qdrant-0.7.6    v1.7.4
    
  9. GKE が必要なワークロードを開始するまで待ちます。

    kubectl wait pods -l app.kubernetes.io/instance=qdrant-database --for condition=Ready --timeout=300s -n qdrant
    

    このコマンドが正常に完了するまで数分かかる場合があります。

  10. GKE がワークロードを開始したら、GKE は Qdrant ワークロードを作成したことを確認します。

    kubectl get pod,svc,statefulset,pdb,secret -n qdrant
    
  11. Qdrant の HighAvailabilityApplication(HAA)リソースを起動します。

    kubectl apply -n qdrant -f manifests/01-regional-pd/ha-app.yaml
    

    ha-app.yaml マニフェストには、HighAvailabilityApplication リソースが記述されています。

    kind: HighAvailabilityApplication
    apiVersion: ha.gke.io/v1
    metadata:
      name: qdrant-database
      namespace: qdrant
    spec:
      resourceSelection:
        resourceKind: StatefulSet
      policy:
        storageSettings:
          requireRegionalStorage: true
        failoverSettings:
          forceDeleteStrategy: AfterNodeUnreachable
          afterNodeUnreachable:
            afterNodeUnreachableSeconds: 20 # 60 seconds total

    Qdrant クラスタ用に、次の GKE リソースが作成されます。

    • 3 つの Pod レプリカを制御する Qdrant StatefulSet
    • A PodDisruptionBudget。使用できないレプリカが最大 1 つ確保されます。
    • qdrant-database Service。ノード間のインバウンド接続とレプリケーション用に Qdrant ポートを公開します。
    • qdrant-database-headless Service。実行中の Qdrant Pod のリストを提供します。
    • qdrant-database-apikey Secret。安全なデータベース接続を容易にします。
    • Qdrant アプリケーションをアクティブにモニタリングする、ステートフル HA オペレーター Pod と HighlyAvailableApplication リソース。HighlyAvailableApplication リソースは、Qdrant に適用するフェイルオーバー ルールを定義します。
  12. フェイルオーバー ルールが適用されているかどうかを確認するには、リソースの説明を取得して Status: Message: Application is protected を確認します。

    kubectl describe highavailabilityapplication qdrant-database -n qdrant
    

    出力は次のようになります。

    Status:
    Conditions:
        Last Transition Time:  2023-11-30T09:54:52Z
        Message:               Application is protected
        Observed Generation:   1
        Reason:                ApplicationProtected
        Status:                True
        Type:                  Protected
    

データセットをアップロードして、Jupyter Notebook で検索クエリを実行する

Qdrant はベクトルとペイロードをコレクションに整理します。ベクトル エンベディングは、セマンティック関係を維持しながら単語やエンティティを数値ベクトルとして表す手法です。これは類似検索にとって重要な機能となります。完全一致ではなく意味に基づいて類似性を見つけて、検索やレコメンデーション システムなどのタスクをより効果的に、細やかに処理できるためです。

このセクションでは、新しい Qdrant コレクションベクトルをアップロードし、検索クエリを実行する方法について説明します。

この例では、さまざまなジャンルの書籍のリストを含む CSV ファイルのデータセットを使用します。Qdrant は検索エンジンとして機能し、作成した Jupyter ノートブック Pod は Qdrant データベースをクエリするクライアントとして機能します。

  1. books-dataset ConfigMap と demo-app ConfigMap を作成し、Jupyter ノートブックをデプロイします。

    kubectl create -n qdrant configmap books-dataset --from-file=manifests/04-notebook/dataset.csv
    kubectl create -n qdrant configmap notebook --from-file=manifests/04-notebook/vector-database.ipynb
    kubectl apply -n qdrant -f manifests/04-notebook/jupyter.yaml
    
    • 先ほど作成した qdrant-apikey という名前の Secret が、APIKEY という環境変数としてクライアント Pod にマウントされます。
    • books-dataset ConfigMap には、Qdrant コレクションの書籍データを含む csv ファイルが含まれています。
    • notebook ConfigMap には、books-dataset から Qdrant コレクションを作成する Jupyter ノートブックが含まれています。
  2. GKE による Jupyter Pod の起動を待ちます。

    kubectl wait pods -l app=jupyter-notebook --for condition=Ready --timeout=300s -n qdrant
    
  3. この URL を開き、vector-database.ipynb ファイルをクリックします。[実行] -> [すべてのセルを実行] を押します。Jupyter はすべてのコードを実行し、検索クエリを実行します。

    このクエリは、Qdrant の my_books コレクションに対してセマンティック検索を行い、クエリテキストに関連する一致スコアが最も高い検索結果を最大 2 件取得します。

    各結果が次のような形式で出力されます。それぞれの結果はダッシュのみの行で区切って出力されます。

    • Title: 書籍のタイトル
    • Author: 書籍の著者
    • Description: ドキュメントの description メタデータ フィールドに保存されている値
    • Published: 書籍の出版日
    • Score: Qdrant の関連性スコア

    出力は次のようになります。

    Title: Romeo and Juliet
    Author: William Shakespeare, Paul Werstine (Editor), Barbara A. Mowat (Editor),
    Paavo Emil Cajander (Translator)
    Description: In Romeo and Juliet, Shakespeare creates a violent world, in which
    two young people fall in love. It is not simply that their families disapprove;
    the Montagues and the Capulets are engaged in a blood feud.In this death-filled
    setting, the movement from love at first sight to the lovers' final union in
    death seems almost inevitable. And yet, this play set in an extraordinary world
    has become the quintessential story of young love. In part because of its exquisite
    language, it is easy to respond as if it were about all young lovers. Published: 01/01/04
    Score: 0.8935013
    -----
    Title: The Unbearable Lightness of Being
    Author: Milan Kundera, Michael Henry Heim (Translator)
    Description: In The Unbearable Lightness of Being, Milan Kundera tells the story
    of a young woman in love with a man torn between his love for her and his incorrigible
    womanizing and one of his mistresses and her humbly faithful lover. This magnificent
    novel juxtaposes geographically distant places, brilliant and playful reflections,
    and a variety of styles, to take its place as perhaps the major achievement of
    one of the world's truly great writers. Published: 10/27/09
    Score: 0.8931863
    -----
    

クラスタの Prometheus 指標を表示する

GKE クラスタは Google Cloud Managed Service for Prometheus で構成されており、Prometheus 形式での指標の収集が可能です。このサービスは、モニタリングとアラート用のフルマネージド ソリューションを提供し、クラスタとそのアプリケーションからの指標の収集、保存、分析を可能にします。

次の図は、Prometheus がクラスタの指標を収集する方法を示しています。

Prometheus 指標の収集

この図の GKE 限定公開クラスタには、次のコンポーネントが含まれています。

  • パス / とポート 80 で指標を公開する Qdrant Pod。これらの指標は、metrics というサイドカー コンテナによって提供されます。
  • Qdrant Pod からの指標を処理する Prometheus ベースのコレクタ。
  • Cloud Monitoring に指標を送信する PodMonitoring リソース

指標をエクスポートして表示する手順は次のとおりです。

  1. labelSelector で指標を収集する PodMonitoring リソースを作成します。

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

    pod-monitoring.yaml マニフェストには、PodMonitoring リソースが記述されています。

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: qdrant
    spec:
      selector:
        matchLabels:
          app: qdrant
          app.kubernetes.io/instance: qdrant-database
      endpoints:
      - port: 80
        interval: 30s
        path: / 
  2. dashboard.json で定義された構成を使用して、Cloud Monitoring ダッシュボードを作成します。

    gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
    
  3. コマンドが正常に実行されたら、Cloud Monitoring のダッシュボードに移動します。

    ダッシュボードの概要に移動

  4. ダッシュボードのリストで、Qdrant Overview ダッシュボードを開きます。指標の収集と表示には 1~2 分かかる場合があります。

    ダッシュボードには、次の主要な指標のカウントが表示されます。

    • コレクション
    • 埋め込みベクトル
    • 保留中のオペレーション
    • 実行中のノード

クラスタ構成をバックアップする

Backup for GKE 機能を使用すると、デプロイされたワークロードとそのデータを含む GKE クラスタ構成全体の定期的なバックアップ スケジュールを設定できます。

このチュートリアルでは、Secret と Volume を含むすべてのワークロードのバックアップを毎日午前 3 時に実行するように、GKE クラスタのバックアップ プランを構成します。ストレージ管理を効率的に行うため、3 日以上経過したバックアップは自動的に削除されます。

バックアップ プランを構成する手順は次のとおりです。

  1. クラスタで Backup for GKE 機能を有効にします。

    gcloud container clusters update ${KUBERNETES_CLUSTER_PREFIX}-cluster \
    --project=${PROJECT_ID} \
    --region=${REGION} \
    --update-addons=BackupRestore=ENABLED
    
  2. クラスタ内のすべての Namespace の日次スケジュールでバックアップ プランを作成します。

    gcloud beta container backup-restore backup-plans create ${KUBERNETES_CLUSTER_PREFIX}-cluster-backup \
    --project=${PROJECT_ID} \
    --location=${REGION} \
    --cluster="projects/${PROJECT_ID}/locations/${REGION}/clusters/${KUBERNETES_CLUSTER_PREFIX}-cluster" \
    --all-namespaces \
    --include-secrets \
    --include-volume-data \
    --cron-schedule="0 3 * * *" \
    --backup-retain-days=3
    

    このコマンドは、実行時に関連する環境変数を使用します。

    クラスタ名の形式は、プロジェクトとリージョンに対して相対的です。

    projects/PROJECT_ID/locations/REGION/clusters/CLUSTER_NAME
    

    プロンプトが表示されたら、「y.」と入力します。出力は次のようになります。

    Create request issued for: [qdrant-cluster-backup]
    Waiting for operation [projects/PROJECT_ID/locations/us-central1/operations/operation-1706528750815-610142ffdc9ac-71be4a05-f61c99fc] to complete...⠹
    

    このオペレーションが正常に完了するまで数分かかることがあります。実行が完了すると、出力は次のようになります。

    Created backup plan [qdrant-cluster-backup].
    
  3. 新しく作成したバックアップ プラン qdrant-cluster-backup が Backup for GKE コンソールに表示されます。

    Backup for GKE に移動

保存したバックアップ構成を復元する場合は、バックアップを復元するをご覧ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

課金が発生しないようにする最も簡単な方法は、このチュートリアル用に作成したプロジェクトを削除することです。

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

プロジェクトを削除すると、クリーンアップが完了します。プロジェクトを削除していない場合は、個々のリソースを削除します。

リソースを個別に削除する

  1. 環境変数を設定します。

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=qdrant
    export REGION=us-central1
    
  2. terraform destroy コマンドを実行します。

    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}
    

    作成した GKE クラスタのタイプに応じて、FOLDERgke-autopilot または gke-standard に置き換えます。

    プロンプトが表示されたら、「yes」と入力します。

  3. アタッチされていないすべてのディスクを検索します。

    export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,region)")
    
  4. ディスクを削除します。

    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 リポジトリを削除します。

    rm -r ~/kubernetes-engine-samples/
    

次のステップ