milvus-logo
LFAI
Home
  • Guía de administración

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, haga lo siguiente:
      • Para configurar el permiso para eksctl, consulte Permiso mínimo para eksctl.

      • 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"
            }
          ]
        }    
        

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 como 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  
    
  • 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 y pulsar 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:

Traducido porDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

¿Fue útil esta página?