Milvus on GCP用のレイヤー7ロードバランサーのセットアップ
Layer-4ロードバランサと比較すると、Layer-7ロードバランサはスマートなロードバランシングとキャッシュ機能を提供し、クラウドネイティブなサービスに最適です。
このガイドでは、Layer-4ロードバランサーの背後で既に稼働しているMilvusクラスタにLayer-7ロードバランサーを設定する手順を説明します。
始める前に
GCPアカウントにプロジェクトが既に存在している。
プロジェクトを作成するには、プロジェクトの作成と管理を参照してください。このガイドで使用するプロジェクトの名前はmilvus-testing-nonprod です。
gcloud CLI、kubectl、およびHelm をローカルにインストールしたか、代わりにブラウザベースのCloud Shellを使用することにしました。
GCP アカウント認証情報を使用してgcloud CLI を初期化しました。
Milvus設定の調整
このガイドでは、GCP上のLayer-4ロードバランサの背後にMilvusクラスタをデプロイ済みであることを前提としています。
このMilvusクラスタにLayer-7ロードバランサを設定する前に、次のコマンドを実行してLayer-4ロードバランサを削除します。
helm upgrade my-release milvus/milvus --set service.type=ClusterIP
Layer-7ロードバランサのバックエンドサービスとして、MilvusはロードバランサからのHTTP/2リクエストを理解できるように、特定の暗号化要件を満たす必要があります。そのため、以下のようにMilvusクラスタでTLSを有効にする必要があります。
helm upgrade my-release milvus/milvus -f tls.yaml
tls.yamlの内容を確認します:
extraConfigFiles:
user.yaml: |+
common:
security:
tlsMode: 1
ヘルスチェックエンドポイントの設定
サービスの可用性を確保するために、GCP上のレイヤー7ロードバランシングではバックエンドサービスのヘルスコンディションをプローブする必要がある。そのため、ヘルスチェックエンドポイントをラップするBackendConfigをセットアップし、アノテーションを通してBackendConfigとMilvusサービスを関連付ける必要がある。
以下のスニペットはBackendConfigの設定です。後で使用するためにbackendconfig.yaml
として保存してください。
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-release-backendconfig
namespace: default
spec:
healthCheck:
port: 9091
requestPath: /healthz
type: HTTP
次に以下のコマンドを実行し、ヘルスチェックエンドポイントを作成します。
kubectl apply -f backendconfig.yaml
最後に、Milvusサービスのアノテーションを更新し、後で作成するLayer-7ロードバランサーに、先ほど作成したエンドポイントを使ってヘルスチェックを行うように依頼する。
kubectl annotate service my-release-milvus \
cloud.google.com/app-protocols='{"milvus":"HTTP2"}' \
cloud.google.com/backend-config='{"default": "my-release-backendconfig"}' \
cloud.google.com/neg='{"ingress": true}' --overwrite
最初のアノテーションについて、
MilvusはHTTP/2をベースに構築されたgRPCをネイティブとしている。そのため、Layer-7ロードバランサーとMilvus間の通信プロトコルとしてHTTP/2を使うことができる。
2つ目の注釈について、
MilvusはgRPCとHTTP/1上でヘルスチェックエンドポイントを提供するだけです。ヘルスチェックエンドポイントをラップし、Milvusサービスと関連付けるBackendConfigをセットアップし、Layer-7ロードバランサーがMilvusの健康状態をこのエンドポイントにプローブするようにする必要があります。
3番目の注釈について、
Ingressの作成後にネットワークエンドポイントグループ(NEG)を作成するように求めている。NEG が GKE Ingress とともに使用される場合、Ingress コントローラーはロードバランサーのすべての側面の作成を容易にする。これには仮想IPアドレスの作成、転送ルール、ヘルスチェック、ファイアウォールルールなどが含まれる。詳しくはGoogle Cloudのドキュメントを参照してください。
TLS証明書の準備
TLSを動作させるには証明書が必要です。証明書を作成するには、自己管理型とGoogle管理型の2つの方法があります。
このガイドでは、milvusサービスにアクセスするためのドメイン名としてmy-release.milvus.ioを使用します。
自己管理型証明書の作成
以下のコマンドを実行して証明書を作成します。
# Generates a tls.key.
openssl genrsa -out tls.key 2048
# Creates a certificate and signs it with the preceding key.
openssl req -new -key tls.key -out tls.csr \
-subj "/CN=my-release.milvus.io"
openssl x509 -req -days 99999 -in tls.csr -signkey tls.key \
-out tls.crt
その後、後で使用するために、これらのファイルを使ってGKEクラスタにシークレットを作成します。
kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key
Googleマネージド証明書の作成
以下のスニペットは ManagedCertificate の設定です。後で使用するためにmanaged-crt.yaml
として保存してください。
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: my-release-milvus-tls
spec:
domains:
- my-release.milvus.io
以下のように GKE クラスタに設定を適用して、マネージド証明書を作成します:
kubectl apply -f ./managed-crt.yaml
これはしばらく続く可能性があります。を実行することで進捗を確認できます。
kubectl get -f ./managed-crt.yaml -o yaml -w
出力は以下のようになるはずです:
status:
certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e
certificateStatus: Provisioning
domainStatus:
- domain: my-release.milvus.io
status: Provisioning
certificateStatusが Activeに変わったら、ロードバランサーのセットアップは完了です。
レイヤ7ロードバランサを生成するためにIngressを作成する
以下のいずれかのスニペットで YAML ファイルを作成する。
自己管理型証明書を使う
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-release-milvus namespace: default spec: tls: - hosts: - my-release.milvus.io secretName: my-release-milvus-tls rules: - host: my-release.milvus.io http: paths: - path: / pathType: Prefix backend: service: name: my-release-milvus port: number: 19530
Google が管理する証明書を使う
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-release-milvus namespace: default annotations: networking.gke.io/managed-certificates: "my-release-milvus-tls" spec: rules: - host: my-release.milvus.io http: paths: - path: / pathType: Prefix backend: service: name: my-release-milvus port: number: 19530
次に、このファイルを GKE クラスタに適用して Ingress を作成します。
kubectl apply -f ingress.yaml
あとはGoogleがLayer-7ロードバランサーをセットアップするのを待つ。を実行することで進捗を確認できる。
kubectl -f ./config/samples/ingress.yaml get -w
出力は以下のようになるはずだ:
NAME CLASS HOSTS ADDRESS PORTS AGE
my-release-milvus <none> my-release.milvus.io 80 4s
my-release-milvus <none> my-release.milvus.io 34.111.144.65 80, 443 41m
ADDRESSフィールドに IP アドレスが表示されたら、Layer-7 ロードバランサは使用可能です。上の出力ではポート 80 とポート 443 の両方が表示されています。常にポート 443 を使用することを忘れないでください。
Layer-7 ロードバランサ経由の接続を確認する
このガイドでは、PyMilvusを使用して、先ほど作成したLayer-7ロードバランサの背後にあるMilvusサービスへの接続を検証します。詳しい手順はこちらを読んでください。
接続パラメータは、Prepare TLS certificatesで証明書を管理する方法によって異なることに注意してください。
from pymilvus import (
connections,
utility,
FieldSchema,
CollectionSchema,
DataType,
Collection,
)
# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.
connections.connect("default", host="34.111.144.65", port="443", server_pem_path="tls.crt", secure=True, server_name="my-release.milvus.io")
# For Google-managed certificates, there is not need to do so.
connections.connect("default", host="34.111.144.65", port="443", secure=True, server_name="my-release.milvus.io")
- hostとportの IP アドレスとポート番号は、Create an Ingress to generate a Layer-7 Load Balancer の最後に挙げたものと一致させる。
- ドメイン名をホストIPアドレスにマッピングするDNSレコードを設定している場合は、hostのIPアドレスをドメイン名に置き換え、server_nameを省略します。