EKS에 Milvus 클러스터 배포하기
이 항목에서는 Amazon EKS에 Milvus 클러스터를 배포하는 방법에 대해 설명합니다.
전제 조건
- 이 문서에서 다루는 작업을 수행할 엔드포인트 역할을 하는 로컬 PC 또는 Amazon EC2에 AWS CLI가 설치되어 있어야 합니다. Amazon Linux 2 또는 Amazon Linux 2023의 경우, AWS CLI 도구가 이미 설치되어 있습니다. 로컬 PC에 AWS CLi를 설치하려면 다음과 같이 하세요. AWS CLI 설치 방법을 참조하세요.
- 선호하는 엔드포인트 장치에 Kubernetes 및 EKS 도구를 설치했습니다:
- AWS IAM 권한이 올바르게 부여되었습니다. 사용 중인 IAM 보안 주체는 Amazon EKS IAM 역할, 서비스 관련 역할, AWS CloudFormation, VPC 및 기타 관련 리소스를 사용할 수 있는 권한을 가지고 있어야 합니다. 다음 방법 중 하나를 사용하여 보안 담당자에게 적절한 권한을 부여할 수 있습니다.
- (권장하지 않음) 사용 중인 사용자/역할의 연결 정책을 AWS 관리 정책에 설정하기만 하면 됩니다
AdministratorAccess
. - (적극 권장) 최소 권한 원칙을 구현하려면 다음과 같이 하세요:
eksctl
에 대한 권한을 설정하려면eksctl
에 대한 최소 권한을 참조하세요.AWS S3 버킷을 생성/삭제하기 위한 권한을 설정하려면 다음 권한 설정을 참조하세요:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3BucketManagement", "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:PutBucketAcl", "s3:PutBucketOwnershipControls", "s3:DeleteBucket" ], "Resource": [ "arn:aws:s3:::milvus-bucket-*" ] } ] }
IAM 정책을 생성/삭제하기 위한 권한을 설정하려면 다음 권한 설정을 참조하세요.
YOUR_ACCOUNT_ID
을 자신의 것으로 바꾸세요.{ "Version": "2012-10-17", "Statement": [ { "Sid": "IAMPolicyManagement", "Effect": "Allow", "Action": [ "iam:CreatePolicy", "iam:DeletePolicy" ], "Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite" } ] }
- (권장하지 않음) 사용 중인 사용자/역할의 연결 정책을 AWS 관리 정책에 설정하기만 하면 됩니다
AWS 리소스 설정
AWS 관리 콘솔, AWS CLI 또는 Terraform과 같은 IaC 도구를 사용하여 AWS S3 버킷 및 EKS 클러스터를 포함한 필수 AWS 리소스를 설정할 수 있습니다. 이 문서에서는 AWS 리소스를 설정하는 방법을 설명하기 위해 AWS CLI를 선호합니다.
Amazon S3 버킷 만들기
AWS S3 버킷을 생성합니다.
버킷 이름 지정 규칙을 읽고 AWS S3 버킷의 이름을 지정할 때 이름 지정 규칙을 준수하세요.
milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)" aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2' # Output # # "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
위에서 생성한 버킷 내에서 오브젝트 읽기 및 쓰기를 위한 IAM 정책을 생성합니다. 버킷 이름을 자신의 이름으로 바꾸세요.
echo '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::<bucket-name>", "arn:aws:s3:::<bucket-name>/*" ] } ] }' > milvus-s3-policy.json aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json # Get the ARN from the command output as follows: # { # "Policy": { # "PolicyName": "MilvusS3ReadWrite", # "PolicyId": "AN5QQVVPM1BVTFlBNkdZT", # "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite", # "Path": "/", # "DefaultVersionId": "v1", # "AttachmentCount": 0, # "PermissionsBoundaryUsageCount": 0, # "IsAttachable": true, # "CreateDate": "2023-11-16T06:00:01+00:00", # "UpdateDate": "2023-11-16T06:00:01+00:00" # } # }
정책을 AWS 사용자에 첨부합니다.
aws iam attach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::<your-iam-account-id>:policy/MilvusS3ReadWrite"
Amazon EKS 클러스터 생성
다음과 같이 클러스터 구성 파일을 준비하고 이름을
eks_cluster.yaml
으로 지정합니다.apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: 'milvus-eks-cluster' region: 'us-east-2' version: "1.27" iam: withOIDC: true serviceAccounts: - metadata: name: aws-load-balancer-controller namespace: kube-system wellKnownPolicies: awsLoadBalancerController: true managedNodeGroups: - name: milvus-node-group labels: { role: milvus } instanceType: m6i.4xlarge desiredCapacity: 3 privateNetworking: true addons: - name: vpc-cni version: latest attachPolicyARNs: - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy - name: coredns version: latest - name: kube-proxy version: latest - name: aws-ebs-csi-driver version: latest wellKnownPolicies: ebsCSIController: true
다음 명령어를 실행하여 EKS 클러스터를 생성합니다.
eksctl create cluster -f eks_cluster.yaml
kubeconfig 파일을 가져옵니다.
aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'
EKS 클러스터를 확인합니다.
kubectl cluster-info kubectl get nodes -A -o wide
스토리지 클래스 생성
Milvus는 etcd
를 메타 스토리지로 사용하며, gp3
StorageClass를 사용하여 PVC를 생성하고 관리해야 합니다.
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-gp3-sc
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
type: gp3
EOF
원래 gp2 StorageClass를 기본값이 아닌 것으로 설정합니다.
kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
AWS 로드밸런서 컨트롤러를 설치한다.
헬름 문자 리포지토리를 추가한다.
helm repo add eks https://aws.github.io/eks-charts helm repo update
AWS 로드밸런서 컨트롤러를 설치한다.
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName='milvus-eks-cluster' \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
설치 확인
kubectl get deployment -n kube-system aws-load-balancer-controller
밀버스 배포
이 가이드에서는 밀버스 헬름 차트를 사용하여 밀버스 클러스터를 배포한다. 차트는 여기에서 찾을 수 있습니다.
Milvus 헬름 차트 리포지토리를 추가한다.
helm repo add milvus https://zilliztech.github.io/milvus-helm/ helm repo update
Milvus 구성 파일
milvus.yaml
을 준비하고<bucket-name> <s3-access-key> <s3-secret-key>
을 사용자 구성 파일로 바꿉니다.- Milvus에 대한 HA를 구성하려면 이 계산기를 참조하여 자세한 정보를 확인하세요. 관련 구성은 계산기에서 직접 다운로드할 수 있으며, MinIO 관련 구성은 제거해야 합니다.
- 코디네이터의 멀티 레플리카 배포를 구현하려면
xxCoordinator.activeStandby.enabled
을true
으로 설정합니다.
cluster: enabled: true service: type: LoadBalancer port: 19530 annotations: service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-name: milvus-service service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip minio: enabled: false externalS3: enabled: true host: "s3.us-east-2.amazonaws.com" port: "443" useSSL: true bucketName: "<bucket-name>" useIAM: false cloudProvider: "aws" iamEndpoint: "" accessKey: "<s3-access-key>" secretKey: "<s3-secret-key>" region: "us-east-2" # HA Configurations rootCoordinator: replicas: 2 activeStandby: enabled: true resources: limits: cpu: 1 memory: 2Gi indexCoordinator: replicas: 2 activeStandby: enabled: true resources: limits: cpu: "0.5" memory: 0.5Gi queryCoordinator: replicas: 2 activeStandby: enabled: true resources: limits: cpu: "0.5" memory: 0.5Gi dataCoordinator: replicas: 2 activeStandby: enabled: true resources: limits: cpu: "0.5" memory: 0.5Gi proxy: replicas: 2 resources: limits: cpu: 1 memory: 2Gi
Milvus를 설치합니다.
helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
모든 파드가
Running
이 될 때까지 기다린다.kubectl get pods -n milvus
헬름은 서비스 생성 순서를 예약하는 기능을 지원하지 않는다. 초기 단계에서
etcd
와pulsar
가 가동되기 전에 비즈니스 파드를 한두 번 재시작하는 것이 일반적이다.밀버스 서비스 주소를 가져온다.
kubectl get svc -n milvus
설치 확인
아래의 간단한 가이드에 따라 설치를 확인할 수 있습니다. 자세한 내용은 이 예제를 참조하세요.
예제 코드를 다운로드합니다.
wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
예제 코드의
host
인수를 위의 Milvus 서비스 주소로 변경합니다.
```python
...
connections.connect("default", host="milvus-service-06b515b1ce9ad10.elb.us-east-2.amazonaws.com", port="19530")
...
```
예제 코드를 실행합니다.
python3 hello_milvus.py
출력은 다음과 유사해야 합니다:
=== start connecting to Milvus === Does collection hello_milvus exist in Milvus: False === Create collection `hello_milvus` === === Start inserting entities === Number of entities in Milvus: 3000 === Start Creating index IVF_FLAT === === Start loading === === Start searching based on vector similarity === hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911 hit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561 hit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304 hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482 hit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062 hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368 search latency = 0.4693s === Start querying with `random > 0.5` === query result: -{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851} search latency = 0.9407s query pagination(limit=4): [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}] query pagination(offset=1, limit=3): [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}] === Start hybrid searching with `random > 0.5` === hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911 hit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661 hit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507 hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368 hit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499 hit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955 search latency = 0.4652s === Start deleting with expr `pk in ["0" , "1"]` === query before delete by expr=`pk in ["0" , "1"]` -> result: -{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'} -{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'} query after delete by expr=`pk in ["0" , "1"]` -> result: [] === Drop collection `hello_milvus` ===
정리 작업
Milvus를 제거하고, EKS 클러스터를 삭제하고, AWS S3 버킷 및 관련 IAM 정책을 삭제하여 환경을 복원해야 하는 경우.
Milvus를 제거합니다.
helm uninstall milvus-demo -n milvus
EKS 클러스터를 삭제합니다.
eksctl delete cluster --name milvus-eks-cluster --region us-east-2
AWS S3 버킷 및 관련 IAM 정책을 삭제합니다.
버킷 이름과 정책 ARN을 사용자 이름으로 바꿔야 합니다.
aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive aws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2 aws iam detach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite" aws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
다음 단계
다른 클라우드에 Milvus를 배포하는 방법을 배우려면 다음과 같이 하세요: