Distribuzione di un cluster Milvus su EKS
Questo argomento descrive come distribuire un cluster Milvus su Amazon EKS.
Prerequisiti
- AWS CLI è installato sul PC locale o su un Amazon EC2, che servirà come endpoint per eseguire le operazioni descritte in questo documento. Per Amazon Linux 2 o Amazon Linux 2023, gli strumenti AWS CLI sono già installati. Per installare AWS CLi sul PC locale. Fare riferimento a Come installare AWS CLI.
- Gli strumenti Kubernetes e EKS sono stati installati sul dispositivo endpoint preferito:
- Le autorizzazioni AWS IAM sono state concesse correttamente. Il principale di sicurezza IAM utilizzato deve avere l'autorizzazione a utilizzare i ruoli IAM di Amazon EKS, i ruoli relativi ai servizi, AWS CloudFormation, le VPC e altre risorse correlate. È possibile seguire uno dei seguenti metodi per concedere le autorizzazioni corrette al proprio principal.
- (Sconsigliato) Impostare semplicemente il criterio di associazione dell'utente/ruolo utilizzato sul criterio gestito da AWS
AdministratorAccess
. - (fortemente consigliato) Per implementare il principio del minimo privilegio, procedere come segue:
Per impostare i permessi per
eksctl
, fare riferimento a Permessi minimi pereksctl
.Per impostare le autorizzazioni per la creazione/eliminazione dei bucket AWS S3, fare riferimento alle seguenti impostazioni di autorizzazione:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3BucketManagement", "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:PutBucketAcl", "s3:PutBucketOwnershipControls", "s3:DeleteBucket" ], "Resource": [ "arn:aws:s3:::milvus-bucket-*" ] } ] }
Per impostare le autorizzazioni per la creazione/eliminazione dei criteri IAM, fare riferimento alle seguenti impostazioni di autorizzazione. Sostituire
YOUR_ACCOUNT_ID
con il proprio.{ "Version": "2012-10-17", "Statement": [ { "Sid": "IAMPolicyManagement", "Effect": "Allow", "Action": [ "iam:CreatePolicy", "iam:DeletePolicy" ], "Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite" } ] }
- (Sconsigliato) Impostare semplicemente il criterio di associazione dell'utente/ruolo utilizzato sul criterio gestito da AWS
Impostazione delle risorse AWS
È possibile impostare le risorse AWS necessarie, tra cui un bucket AWS S3 e un cluster EKS, utilizzando AWS Management Console, AWS CLI o strumenti IAC, come Terraform. In questo documento si preferisce utilizzare la AWS CLI per dimostrare come impostare le risorse AWS.
Creare un bucket Amazon S3
Creare un bucket AWS S3.
Leggete le regole di denominazione dei bucket e osservate le regole di denominazione per il vostro bucket 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/"
Creare un criterio IAM per la lettura e la scrittura di oggetti all'interno del bucket creato in precedenza. Sostituire il nome del bucket con il proprio.
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" # } # }
Allegare il criterio al proprio utente AWS.
aws iam attach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::<your-iam-account-id>:policy/MilvusS3ReadWrite"
Creare un cluster Amazon EKS
Preparare un file di configurazione del cluster come segue e nominarlo
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
Eseguire il seguente comando per creare un cluster EKS.
eksctl create cluster -f eks_cluster.yaml
Ottenere il file kubeconfig.
aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'
Verificare il cluster EKS.
kubectl cluster-info kubectl get nodes -A -o wide
Creare una StorageClass
Milvus utilizza etcd
come meta-spazio di archiviazione e deve fare affidamento sulla StorageClass gp3
per creare e gestire il 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
Impostare la StorageClass originale gp2 su non-default.
kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
Installare il controllore AWS LoadBalancer
Aggiungere il repo Helm chars.
helm repo add eks https://aws.github.io/eks-charts helm repo update
Installare il controllore AWS Load Balancer.
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
Verificare l'installazione
kubectl get deployment -n kube-system aws-load-balancer-controller
Distribuire Milvus
In questa guida, utilizzeremo i grafici di Milvus Helm per distribuire un cluster Milvus. I grafici sono disponibili qui.
Aggiungere il repo di Milvus Helm Chart.
helm repo add milvus https://zilliztech.github.io/milvus-helm/ helm repo update
Preparare il file di configurazione di Milvus
milvus.yaml
e sostituire<bucket-name> <s3-access-key> <s3-secret-key>
con il proprio.- Per configurare HA per Milvus, consultare questa calcolatrice per maggiori informazioni. È possibile scaricare le relative configurazioni direttamente dalla calcolatrice e si consiglia di rimuovere le configurazioni relative a MinIO.
- Per implementare distribuzioni multireplica di coordinatori, impostare
xxCoordinator.activeStandby.enabled
sutrue
.
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
Installare Milvus.
helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
Attendere che tutti i pod siano
Running
.kubectl get pods -n milvus
Helm non supporta la programmazione dell'ordine di creazione dei servizi. È normale che i pod aziendali si riavviino una o due volte prima che
etcd
epulsar
siano attivi nella fase iniziale.Ottenere l'indirizzo del servizio Milvus.
kubectl get svc -n milvus
Verifica dell'installazione
Per verificare l'installazione è possibile seguire la semplice guida riportata di seguito. Per maggiori dettagli, fate riferimento a questo esempio.
Scaricare il codice di esempio.
wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
Cambiate l'argomento
host
nel codice di esempio con l'indirizzo del servizio Milvus di cui sopra.
```python
...
connections.connect("default", host="milvus-service-06b515b1ce9ad10.elb.us-east-2.amazonaws.com", port="19530")
...
```
Eseguire il codice di esempio.
python3 hello_milvus.py
L'output dovrebbe essere simile al seguente:
=== 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` ===
La pulizia funziona
Nel caso sia necessario ripristinare l'ambiente disinstallando Milvus, distruggendo il cluster EKS ed eliminando i bucket AWS S3 e i relativi criteri IAM.
Disinstallare Milvus.
helm uninstall milvus-demo -n milvus
Distruggere il cluster EKS.
eksctl delete cluster --name milvus-eks-cluster --region us-east-2
Eliminare il bucket AWS S3 e i relativi criteri IAM.
Il nome del bucket e l'ARN della policy vanno sostituiti con i propri.
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'
Cosa fare dopo
Se volete imparare a distribuire Milvus su altri cloud: