Desplegar un clúster Milvus en EKS
Este tema describe cómo desplegar un clúster Milvus en Amazon EKS.
Requisitos previos
- Tiene AWS CLI instalado en su PC local o en un Amazon EC2, que le servirá como punto final para realizar las operaciones que se tratan en este documento. En el caso de Amazon Linux 2 o Amazon Linux 2023, las herramientas de AWS CLI ya están instaladas. Para instalar AWS CLi en su PC local. Consulte Cómo instalar AWS CLI.
- Ha instalado las herramientas de Kubernetes y EKS instaladas en el dispositivo de punto final preferido, incluido:
- Los permisos de AWS IAM se han concedido correctamente. El principal de seguridad de IAM que está utilizando debe tener permiso para utilizar los roles de IAM de Amazon EKS, los roles relacionados con el servicio, AWS CloudFormation, las VPC y otros recursos relacionados. Puede seguir cualquiera de las siguientes formas para conceder a su entidad de seguridad los permisos adecuados.
- (No recomendado) Simplemente establezca la política de asociación del usuario/rol que utilizó en la política administrada de AWS
AdministratorAccess
. - (Muy recomendado) Para implementar el principio de mínimo privilegio, haz lo siguiente:
Para configurar el permiso para
eksctl
, consulte Permiso mínimo paraeksctl
.Para configurar el permiso para crear/eliminar buckets AWS S3, consulte la siguiente configuración de permisos:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3BucketManagement", "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:PutBucketAcl", "s3:PutBucketOwnershipControls", "s3:DeleteBucket" ], "Resource": [ "arn:aws:s3:::milvus-bucket-*" ] } ] }
Para configurar permisos para crear/eliminar políticas IAM, consulte la siguiente configuración de permisos. Sustituya
YOUR_ACCOUNT_ID
por el suyo propio.{ "Version": "2012-10-17", "Statement": [ { "Sid": "IAMPolicyManagement", "Effect": "Allow", "Action": [ "iam:CreatePolicy", "iam:DeletePolicy" ], "Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite" } ] }
- (No recomendado) Simplemente establezca la política de asociación del usuario/rol que utilizó en la política administrada de AWS
Configurar los recursos de AWS
Puede configurar los recursos de AWS necesarios, incluido un bucket de AWS S3 y un clúster de EKS, utilizando la consola de administración de AWS, la CLI de AWS o herramientas de IaC, como Terraform. En este documento, se prefiere la CLI de AWS para demostrar cómo configurar los recursos de AWS.
Crear un bucket de Amazon S3
Cree un bucket de AWS S3.
Lee Bucket Naming Rules y observa las reglas de nomenclatura al nombrar tu bucket de 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/"
Cree una política IAM para leer y escribir objetos dentro del bucket creado anteriormente. Sustituye el nombre del bucket por el tuyo propio.
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" # } # }
Adjunta la política a tu usuario de AWS.
aws iam attach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::<your-iam-account-id>:policy/MilvusS3ReadWrite"
Crear un clúster de Amazon EKS
Prepare un archivo de configuración de clúster como se indica a continuación y nómbrelo
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
Ejecute el siguiente comando para crear un clúster EKS.
eksctl create cluster -f eks_cluster.yaml
Obtenga el archivo kubeconfig.
aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'
Verifique el clúster EKS.
kubectl cluster-info kubectl get nodes -A -o wide
Crear una StorageClass
Milvus utiliza etcd
como meta almacenamiento y necesita confiar en la StorageClass gp3
para crear y gestionar 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
Establezca la StorageClass gp2 original como no predeterminada.
kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
Instalar AWS LoadBalancer Controller
Añadir Helm chars repo.
helm repo add eks https://aws.github.io/eks-charts helm repo update
Instalar AWS Load Balancer Controller.
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
Verificar la instalación
kubectl get deployment -n kube-system aws-load-balancer-controller
Implementar Milvus
En esta guía, utilizaremos Milvus Helm Charts para desplegar un cluster Milvus. Puede encontrar los gráficos aquí.
Añada el repositorio de Milvus Helm Chart.
helm repo add milvus https://zilliztech.github.io/milvus-helm/ helm repo update
Prepare el archivo de configuración de Milvus
milvus.yaml
, y reemplace<bucket-name> <s3-access-key> <s3-secret-key>
con el suyo.- Para configurar HA para su Milvus, consulte esta calculadora para más información. Puede descargar las configuraciones relacionadas directamente desde la calculadora, y debería eliminar las configuraciones relacionadas con MinIO.
- Para implementar despliegues multireplicativos de coordinadores, configure
xxCoordinator.activeStandby.enabled
comotrue
.
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
Instale Milvus.
helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
Espere hasta que todos los pods estén
Running
.kubectl get pods -n milvus
Helm no soporta la programación del orden de creación de servicios. Es normal que los pods de negocio se reinicien una o dos veces antes de que
etcd
ypulsar
estén en marcha en la fase inicial.Obtenga la dirección del servicio Milvus.
kubectl get svc -n milvus
Verificar la instalación
Puede seguir esta sencilla guía para verificar la instalación. Para más detalles, consulte este ejemplo.
Descargue el código de ejemplo.
wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
Cambie el argumento
host
del código de ejemplo por la dirección del servicio Milvus indicada anteriormente.
```python
...
connections.connect("default", host="milvus-service-06b515b1ce9ad10.elb.us-east-2.amazonaws.com", port="19530")
...
```
Ejecute el código de ejemplo.
python3 hello_milvus.py
El resultado debería ser similar al siguiente:
=== 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 limpieza funciona
En caso de que necesite restaurar el entorno desinstalando Milvus, destruyendo el clúster EKS y eliminando los buckets S3 de AWS y las políticas IAM relacionadas.
Desinstale Milvus.
helm uninstall milvus-demo -n milvus
Destruya el clúster EKS.
eksctl delete cluster --name milvus-eks-cluster --region us-east-2
Elimine el bucket de AWS S3 y las políticas de IAM relacionadas.
Debe sustituir el nombre del bucket y el ARN de la política por los suyos propios.
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'
Lo que sigue
Si desea aprender a desplegar Milvus en otras nubes: