GCP에서 Milvus용 레이어 7 로드 밸런서 설정하기
레이어 4 로드 밸런서와 비교할 때, 레이어 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
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 부하 분산은 백엔드 서비스의 상태 상태를 조사해야 합니다. 따라서 상태 확인 엔드포인트를 마무리하기 위해 백엔드 컨피그를 설정하고 어노테이션을 통해 백엔드 컨피그를 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를 기본으로 합니다. 따라서 HTTP/2를 Layer-7 로드밸런서와 Milvus 간의 통신 프로토콜로 사용할 수 있습니다.
두 번째 주석에 관해서는,
Milvus는 gRPC와 HTTP/1을 통한 상태 확인 엔드포인트만 제공합니다. 상태 확인 엔드포인트를 래핑하고 이를 Milvus 서비스와 연결하여 Layer-7 로드밸런서가 이 엔드포인트에서 Milvus의 상태 상태를 조사하도록 백엔드 컨피그(BackendConfig)를 설정해야 합니다.
세 번째 어노테이션에 대해 설명합니다,
인그레스가 생성된 후 네트워크 엔드포인트 그룹(NEG)을 생성하도록 요청합니다. NEG를 GKE 인그레스와 함께 사용하면 인그레스 컨트롤러가 로드 밸런서의 모든 측면을 쉽게 생성할 수 있습니다. 여기에는 가상 IP 주소, 포워딩 규칙, 상태 확인, 방화벽 규칙 등의 생성이 포함됩니다. 자세한 내용은 Google Cloud 문서를 참조하세요.
TLS 인증서 준비
TLS를 사용하려면 인증서가 필요합니다. 인증서를 만드는 방법에는 자체 관리형과 Google 관리형 두 가지가 있습니다.
이 가이드에서는 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
인증서 상태가 활성으로 바뀌면 로드 밸런서를 설정할 준비가 된 것입니다.
인그레스를 만들어 레이어 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
그런 다음 파일을 GKE 클러스터에 적용하여 인그레스를 생성할 수 있습니다.
kubectl apply -f ingress.yaml
이제 Google이 레이어 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
주소 필드에 IP 주소가 표시되면 레이어 7 로드 밸런서를 사용할 준비가 된 것입니다. 위의 출력에는 포트 80과 포트 443이 모두 표시됩니다. 항상 포트 443을 사용해야 한다는 점을 기억하세요.
Layer-7 로드 밸런서를 통한 연결 확인
이 가이드에서는 PyMilvus를 사용하여 방금 만든 Layer-7 로드 밸런서 뒤에 있는 Milvus 서비스에 대한 연결을 확인합니다. 자세한 단계는 여기를 참조하세요.
연결 매개변수는 TLS 인증서 준비에서 인증서를 관리하는 방식에 따라 다릅니다.
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 주소와 포트 번호는 레이어 7 부하 분산 장치를 생성하려면 인그레스 생성의 끝에 나열된 것과 일치해야 합니다.
- 도메인 이름을 호스트 IP 주소에 매핑하도록 DNS 레코드를 설정한 경우 호스트의 IP 주소를 도메인 이름으로 바꾸고 server_name을 생략합니다.