• نبذة عن ميلفوس
  • ابدأ الآن
  • المفاهيم
  • دليل المستخدم
  • النماذج
  • استيراد البيانات
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • البرامج التعليمية
  • الأسئلة الشائعة
  • API Reference

نشر مجموعة Milvus العنقودية على EKS

يصف هذا الموضوع كيفية نشر مجموعة Milvus على Amazon EKS.

المتطلبات الأساسية

  • أن يكون لديك AWS CLI مثبتًا على حاسوبك المحلي أو على Amazon EC2، والذي سيكون بمثابة نقطة النهاية للقيام بالعمليات التي يغطيها هذا المستند. بالنسبة لأمازون لينكس 2 أو أمازون لينكس 2023، فإن أدوات AWS CLI مثبتة بالفعل. لتثبيت AWS CLi على حاسوبك المحلي. راجع كيفية تثبيت AWS CLI.
  • لقد قمت بتثبيت Kubernetes وأدوات EKS المثبتة على جهاز نقطة النهاية المفضل، بما في ذلك:
  • تم منح أذونات AWS IAM بشكل صحيح. يجب أن يكون لدى مدير أمان IAM الذي تستخدمه إذن لاستخدام أدوار Amazon EKS IAM والأدوار المتعلقة بالخدمة وAWS CloudFormation وVPCs والموارد الأخرى ذات الصلة. يمكنك اتباع أي من الطريقتين التاليتين لمنح مديرك الأذونات المناسبة.
    • (غير مستحسن) ما عليك سوى تعيين سياسة الارتباط للمستخدم/الدور الذي استخدمته لسياسة 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 أو AWS CLI أو أدوات IaC، مثل Terraform. في هذا المستند، يُفضل استخدام واجهة مستخدم AWS CLI لتوضيح كيفية إعداد موارد AWS.

إنشاء دلو أمازون 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"
    

إنشاء مجموعة أمازون 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 Helm لنشر مجموعة 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  
    
  • قم بتثبيت ميلفوس.

    helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
    
  • انتظر حتى تصبح جميع الكبسولات Running.

    kubectl get pods -n milvus
    

    لا يدعم Helm جدولة ترتيب إنشاء الخدمة. من الطبيعي أن يتم إعادة تشغيل كبسولات الأعمال لمرة أو مرتين قبل 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 على السحب الأخرى:

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟