Настройка балансировщика нагрузки Layer-7 для Milvus на GCP
По сравнению с балансировщиком нагрузки уровня 4, балансировщик нагрузки уровня 7 предлагает интеллектуальную балансировку нагрузки и возможности кэширования и является отличным выбором для облачных нативных сервисов.
В этом руководстве вы узнаете, как настроить балансировщик нагрузки уровня 7 для кластера Milvus, уже работающего за балансировщиком нагрузки уровня 4.
Перед началом работы
В вашей учетной записи GCP уже существует проект.
Чтобы создать проект, обратитесь к разделу Создание и управление проектами. Название проекта, используемого в этом руководстве, - milvus-testing-nonprod.
Вы локально установили gcloud CLI, kubectl и Helm или решили использовать браузерную оболочку Cloud Shell.
Вы инициализировали gcloud CLI с помощью учетных данных учетной записи GCP.
Вы развернули кластер Milvus за балансировщиком нагрузки Layer-4 на GCP.
Настройка конфигураций Milvus
Это руководство предполагает, что вы уже развернули кластер Milvus за балансировщиком нагрузки Layer-4 на GCP.
Перед настройкой балансировщика нагрузки Layer-7 для этого кластера Milvus выполните следующую команду, чтобы удалить балансировщик нагрузки Layer-4.
helm upgrade my-release milvus/milvus --set service.type=ClusterIP
Как внутренняя служба балансировщика нагрузки Layer-7, Milvus должен отвечать определенным требованиям к шифрованию, чтобы он мог понимать HTTP/2-запросы от балансировщика нагрузки. Поэтому вам необходимо включить TLS на кластере Milvus следующим образом.
helm upgrade my-release milvus/milvus -f tls.yaml
содержимое tls.yaml:
extraConfigFiles:
user.yaml: |+
common:
security:
tlsMode: 1
Настройка конечной точки проверки работоспособности
Чтобы обеспечить доступность сервиса, балансировка нагрузки Layer-7 на GCP требует проверки состояния здоровья внутреннего сервиса. Поэтому нам нужно создать 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, который построен на 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 станет активным, вы будете готовы к настройке балансировщика нагрузки.
Создание ингресса для генерации балансировщика нагрузки уровня 7
Создайте 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
Затем вы можете создать Ingress, применив этот файл к кластеру GKE.
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 для проверки соединения с сервисом Milvus за балансировщиком нагрузки Layer-7, который мы только что создали. Подробные шаги описаны здесь.
Обратите внимание, что параметры соединения зависят от выбранного вами способа управления сертификатами в 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")
- IP-адрес и номер порта в параметрах host и port должны совпадать с теми, что указаны в конце раздела Create an Ingress to generate a Layer-7 Load Balancer.
- Если вы настроили DNS-запись для сопоставления доменного имени с IP-адресом хоста, замените IP-адрес в host на доменное имя и опустите server_name.