在 EKS 上部署 Milvus 群集
本主題描述如何在Amazon EKS 上部署 Milvus 叢集。
先決條件
- 您已在本機電腦或 Amazon EC2 上安裝 AWS CLI,這將作為您執行本文件所涵蓋的作業的端點。對於 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 管理主控台、AWS CLI 或 IaC 工具(如 Terraform)設定所需的 AWS 資源,包括 AWS S3 桶和 EKS 群集。在本文件中,我們建議使用 AWS CLI 來示範如何設定 AWS 資源。
建立 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 repo。
helm repo add eks https://aws.github.io/eks-charts helm repo update
安裝 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
驗證安裝
kubectl get deployment -n kube-system aws-load-balancer-controller
部署 Milvus
在本指南中,我們將使用 Milvus Helm Charts 部署 Milvus 集群。您可以在這裡找到圖表。
新增 Milvus Helm Chart repo。
helm repo add milvus https://zilliztech.github.io/milvus-helm/ helm repo update
準備好 Milvus 配置檔案
milvus.yaml
,並用你自己的檔案取代<bucket-name> <s3-access-key> <s3-secret-key>
。- 要為您的 Milvus 設定 HA,請參考此計算器以獲得更多資訊。您可以直接從計算器下載相關組態,並應移除 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
等到所有 Pod 都
Running
。kubectl get pods -n milvus
Helm 不支援排程服務建立的順序。在
etcd
和pulsar
上線初期,業務 pod 重新啟動一到兩次是正常的。取得 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 buckets 及相關 IAM 策略來還原環境。
解除安裝 Milvus。
helm uninstall milvus-demo -n milvus
銷毀 EKS 叢集。
eksctl delete cluster --name milvus-eks-cluster --region us-east-2
刪除 AWS S3 容量桶和相關的 IAM 政策。
您應該將水桶名稱和政策 ARN 替換為您自己的名稱和政策 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: