Configurare un bilanciatore di carico Layer-7 per Milvus su GCP
Rispetto a un bilanciatore di carico Layer-4, un bilanciatore di carico Layer-7 offre funzionalità intelligenti di bilanciamento del carico e di caching ed è un'ottima scelta per i servizi cloud-nativi.
Questa guida illustra la configurazione di un bilanciatore di carico Layer-7 per un cluster Milvus già in esecuzione dietro un bilanciatore di carico Layer-4.
Prima di iniziare
Nel vostro account GCP esiste già un progetto.
Per creare un progetto, consultare la sezione Creazione e gestione dei progetti. Il nome del progetto utilizzato in questa guida è milvus-testing-nonprod.
Avete installato localmente gcloud CLI, kubectl e Helm o avete deciso di utilizzare la Cloud Shell basata su browser.
Avete inizializzato la gcloud CLI con le credenziali del vostro account GCP.
Avete distribuito un cluster Milvus dietro un bilanciatore di carico Layer-4 su GCP.
Modificare le configurazioni di Milvus
Questa guida presuppone che abbiate già implementato un cluster Milvus dietro un bilanciatore di carico Layer-4 su GCP.
Prima di configurare un bilanciatore di carico Layer-7 per questo cluster Milvus, eseguire il seguente comando per rimuovere il bilanciatore di carico Layer-4.
helm upgrade my-release milvus/milvus --set service.type=ClusterIP
Come servizio backend del bilanciatore di carico Layer-7, Milvus deve soddisfare alcuni requisiti di crittografia per poter comprendere le richieste HTTP/2 del bilanciatore di carico. Pertanto, è necessario abilitare TLS sul cluster Milvus come segue.
helm upgrade my-release milvus/milvus -f tls.yaml
il contenuto di tls.yaml:
extraConfigFiles:
user.yaml: |+
common:
security:
tlsMode: 1
Impostare un endpoint di controllo dello stato di salute
Per garantire la disponibilità del servizio, il bilanciamento del carico Layer-7 su GCP richiede di sondare le condizioni di salute del servizio backend. Pertanto, è necessario impostare un BackendConfig per avvolgere l'endpoint di controllo dello stato di salute e associare il BackendConfig al servizio Milvus tramite annotazioni.
Il seguente frammento è l'impostazione di BackendConfig. Salvarlo come backendconfig.yaml
per utilizzarlo in seguito.
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-release-backendconfig
namespace: default
spec:
healthCheck:
port: 9091
requestPath: /healthz
type: HTTP
Eseguire quindi il comando seguente per creare l'endpoint di controllo dello stato di salute.
kubectl apply -f backendconfig.yaml
Infine, aggiornare le annotazioni del servizio Milvus per chiedere al bilanciatore di carico Layer-7 che creeremo in seguito di eseguire i controlli sullo stato di salute usando l'endpoint appena creato.
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
Per quanto riguarda la prima annotazione,
Milvus è nativo di gRPC, che si basa su HTTP/2. Pertanto, è possibile utilizzare HTTP/2. Pertanto, possiamo usare HTTP/2 come protocollo di comunicazione tra il bilanciatore di carico Layer-7 e Milvus.
Per quanto riguarda la seconda annotazione,
Milvus offre solo l'endpoint di controllo dello stato di salute tramite gRPC e HTTP/1. Dobbiamo impostare un BackendConfig per avvolgere l'endpoint di controllo dello stato di salute e associarlo al servizio Milvus, in modo che il bilanciatore di carico Layer-7 sondi questo endpoint per le condizioni di salute di Milvus.
Per quanto riguarda la terza annotazione,
Chiede la creazione di un gruppo di endpoint di rete (NEG) dopo la creazione di un Ingress. Quando si utilizzano i NEG con GKE Ingress, il controller Ingress facilita la creazione di tutti gli aspetti del bilanciatore di carico. Ciò include la creazione dell'indirizzo IP virtuale, delle regole di inoltro, dei controlli di salute, delle regole del firewall e altro ancora. Per i dettagli, consultare i documenti di Google Cloud.
Preparare i certificati TLS
TLS richiede certificati per funzionare. Esistono due modi per creare i certificati: quelli autogestiti e quelli gestiti da Google.
Questa guida utilizza my-release.milvus.io come nome di dominio per accedere al servizio Milvus.
Creare certificati autogestiti
Eseguire i seguenti comandi per creare un certificato.
# 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
Quindi create un segreto nel vostro cluster GKE con questi file per un uso successivo.
kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key
Creare certificati gestiti da Google
Il seguente frammento è un'impostazione di ManagedCertificate. Salvarlo come managed-crt.yaml
per un uso successivo.
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: my-release-milvus-tls
spec:
domains:
- my-release.milvus.io
Creare un certificato gestito applicando l'impostazione al cluster GKE come segue:
kubectl apply -f ./managed-crt.yaml
L'operazione potrebbe durare un po'. È possibile verificare i progressi eseguendo
kubectl get -f ./managed-crt.yaml -o yaml -w
L'output dovrebbe essere simile al seguente:
status:
certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e
certificateStatus: Provisioning
domainStatus:
- domain: my-release.milvus.io
status: Provisioning
Quando certificateStatus diventa Active, si è pronti a configurare il bilanciatore di carico.
Creare un Ingress per generare un bilanciatore di carico Layer-7
Creare un file YAML con uno dei seguenti snippet.
Utilizzo di certificati autogestiti
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
Utilizzo di certificati gestiti da 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
Quindi è possibile creare l'Ingress applicando il file al cluster GKE.
kubectl apply -f ingress.yaml
A questo punto, attendere che Google imposti il bilanciatore di carico Layer-7. È possibile verificare i progressi eseguendo
kubectl -f ./config/samples/ingress.yaml get -w
L'output dovrebbe essere simile al seguente:
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
Una volta visualizzato un indirizzo IP nel campo ADDRESS, il bilanciatore di carico Layer-7 è pronto all'uso. Nell'output di cui sopra sono visualizzate sia la porta 80 che la porta 443. Ricordare che si dovrebbe sempre usare la porta 443 per il proprio bene.
Verifica della connessione attraverso il bilanciatore di carico Layer-7
Questa guida utilizza PyMilvus per verificare la connessione al servizio Milvus dietro il bilanciatore di carico Layer-7 appena creato. Per i passi dettagliati, leggete qui.
Si noti che i parametri di connessione variano a seconda del modo in cui si sceglie di gestire i certificati in 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")
- L'indirizzo IP e il numero di porta in host e porta devono corrispondere a quelli elencati alla fine di Creare un ingresso per generare un bilanciatore di carico Layer-7.
- Se si è impostato un record DNS per mappare il nome di dominio all'indirizzo IP dell'host, sostituire l'indirizzo IP in host con il nome di dominio e omettere nome_server.