🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная
  • Руководство по администрированию
  • Home
  • Docs
  • Руководство по администрированию

  • Развертывание

  • На облаках

  • Развертывание на AWS

Развертывание кластера Milvus на EKS

В этой теме описывается развертывание кластера Milvus на Amazon EKS.

Необходимые условия

  • У вас установлен AWS CLI на локальном компьютере или на Amazon EC2, который будет служить конечной точкой для выполнения операций, описанных в этом документе. Для Amazon Linux 2 или Amazon Linux 2023 инструменты AWS CLI уже установлены. Чтобы установить 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 S3 и кластер EKS, используя AWS Management Console, AWS CLI или инструменты IaC, такие как Terraform. В этом документе для демонстрации настройки ресурсов 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 LoadBalancer

  • Добавьте репо Helm chars.

    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

В этом руководстве мы будем использовать диаграммы Milvus Helm Charts для развертывания кластера Milvus. Графики можно найти здесь.

  • Добавьте репо Milvus Helm Chart.

    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    helm repo update
    
  • Подготовьте файл конфигурации Milvus milvus.yaml, а также замените <bucket-name> <s3-access-key> <s3-secret-key> на свой собственный.

    • Чтобы настроить HA для вашего Milvus, обратитесь к этому калькулятору для получения дополнительной информации. Вы можете загрузить соответствующие конфигурации прямо из калькулятора, и вам следует удалить конфигурации, связанные с 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
    

    Helm не поддерживает планирование порядка создания сервисов. Вполне нормально, что бизнес-подсистемы перезапускаются один или два раза, прежде чем etcd и pulsar будут запущены на ранней стадии.

  • Получите адрес службы Milvus.

    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 в других облаках:

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?