為 GCP 上的 Milvus 設定第 7 層負載平衡器
與 Layer-4 負載平衡器相比,Layer-7 負載平衡器提供智慧型負載平衡和快取功能,是雲原生服務的最佳選擇。
本指南將教您如何為已在第 4 層負載平衡器後執行的 Milvus 集群設定第 7 層負載平衡器。
開始之前
您的 GCP 帳戶中已存在專案。
若要建立專案,請參閱建立和管理專案。本指南中使用的專案名稱為milvus-testing-nonprod。
您已在本機安裝gcloud CLI、kubectl 和Helm,或決定改用瀏覽器式Cloud Shell。
您已使用 GCP 帳戶憑證初始化 gcloud CLI。
調整 Milvus 配置
本指南假設您已在 GCP 的第 4 層負載平衡器後部署 Milvus 叢集。
在為此 Milvus 叢集設定 Layer-7 負載平衡器之前,請執行下列指令移除 Layer-4 負載平衡器。
helm upgrade my-release milvus/milvus --set service.type=ClusterIP
作為第 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 上的 Layer-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 原生於 gRPC,而 gRPC 是建基於 HTTP/2 的。因此,我們可以使用 HTTP/2 作為 Layer-7 負載平衡器與 Milvus 之間的通訊協定。
至於第二個註解、
Milvus 只透過 gRPC 和 HTTP/1 提供健康檢查端點。我們需要設定一個 BackendConfig 來包裝健康檢查端點,並將其與 Milvus 服務關聯,以便 Layer-7 負載平衡器探測此端點以瞭解 Milvus 的健康狀況。
至於第三個註解、
它要求在建立入口後建立網路端點群組 (NEG)。當 NEG 與 GKE Ingress 一起使用時,Ingress 控制器會促進負載平衡器各方面的建立。這包括建立虛擬 IP 位址、轉寄規則、健康檢查、防火牆規則等。如需詳細資訊,請參閱Google Cloud 文件。
準備 TLS 憑證
TLS 需要憑證才能運作。有兩種建立憑證的方法,即自我管理和 Google 管理。
本指南使用my-release.milvus.io作為存取我們 Milvus 服務的網域名稱。
建立自我管理的憑證
執行下列指令來建立證書。
# 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,您就可以設定負載平衡器了。
建立一個 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 設定第七層負載平衡器。您可以執行
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 記錄將網域名稱對應到主機 IP 位址,請以網域名稱取代host中的 IP 位址,並省略server_name。