نشر مجموعة 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 المطلوبة، بما في ذلك دلو 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 على السحب الأخرى: