在 EKS 上部署 Milvus 集群
本主题描述如何在 Amazon EKS 上部署 Milvus 集群。
本教程主要关注部署。要了解更多关于设置,请参考 配置。
前提条件
软件要求
云安全
- 访问 AWS Web Console
- 确保您的 AWS 账户具有以下权限:
- AmazonEC2FullAccess
- AmazonEKSClusterPolicy
- AmazonEKSWorkerNodePolicy
- AmazonEKS_CNI_Policy
- AmazonEKSServicePolicy
我们强烈建议您使用 IAM 用户 而不是根用户来访问 AWS 服务。
设置 AWS 资源
创建 S3 bucket
-
登录 AWS S3 控制台。
-
点击 创建 bucket。
-
输入 bucket 名称。在本指南中,我们使用
milvus-bucket-039dd013c0712f085d60e21f
作为 bucket 名称。 -
选择您想要创建 bucket 的 AWS 区域。在本指南中,我们使用
us-east-2
作为区域。 -
点击 创建 bucket 完成创建。
创建 IAM 策略
-
登录 AWS IAM 控制台。
-
在导航窗格中,选择 策略,然后点击 创建策略。
-
选择 JSON 选项卡,复制并粘贴以下策略定义。记得将
<bucket-name>
替换为您的实际 bucket 名称。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucket-name>"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::<bucket-name>/*"
]
}
]
}
-
点击 下一步:标签,根据需要添加标签。
-
点击 下一步:审查。
-
输入策略名称。在本指南中,我们使用
MilvusS3ReadWrite
作为策略名称。 -
点击 创建策略 完成创建。
创建访问密钥
-
在 AWS IAM 控制台 中,在导航窗格中选择 用户,然后点击您的用户名。
-
选择 安全凭证 选项卡,然后点击 创建访问密钥。
-
选择 第三方服务,勾选确认复选框,然后点击 下一步。
-
设置描述标签值,然后点击 创建访问密钥。
-
点击 显示 查看访问密钥,然后复制并保存访问密钥 ID 和秘密访问密钥。
将策略附加到用户
-
在 AWS IAM 控制台 中,在导航窗格中选择 用户,然后点击您的用户名。
-
点击 添加权限,然后选择 直接附加策略。
-
搜索并选择您在上一步中创建的策略。在本指南中,策略名称是
MilvusS3ReadWrite
。 -
点击 添加权限 完成附加。
创建 EKS 集群
在本指南中,我们使用 eksctl
创建 EKS 集群。
eksctl create cluster --name milvus-eks-cluster --region us-east-2 --node-type m5.2xlarge --nodes-min 1 --nodes-max 4 --managed
上述命令创建一个具有以下设置的 EKS 集群:
- 集群名称:
milvus-eks-cluster
- 区域:
us-east-2
- 节点类型:
m5.2xlarge
- 节点数量:1 到 4 之间
- 创建 EKS 集群大约需要 10 到 15 分钟。
- 在上述命令中,默认的 Kubernetes 版本是 1.18。您可以使用
--version
参数指定 Kubernetes 版本。支持的 Kubernetes 版本请参考 Amazon EKS Kubernetes 版本。
集群准备就绪后,运行以下命令更新 kubeconfig 文件。
aws eks update-kubeconfig --region us-east-2 --name milvus-eks-cluster
设置存储类
安装 EBS CSI 驱动程序
Amazon EKS 集群需要 Amazon EBS CSI 驱动程序 来管理 EBS 卷的生命周期。
-
检查您的 EKS 集群的 Kubernetes 版本。EBS CSI 驱动程序版本必须与您的 Kubernetes 版本兼容。
kubectl version --short
-
创建 Amazon EBS CSI 驱动程序 IAM 角色。将
111122223333
替换为您的账户 ID,将my-cluster
替换为您的集群名称。eksctl create iamserviceaccount \
--name ebs-csi-controller-sa \
--namespace kube-system \
--cluster milvus-eks-cluster \
--region us-east-2 \
--attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
--approve \
--override-existing-serviceaccounts -
安装 Amazon EBS CSI 驱动程序。将
v1.13.0-eksbuild.3
替换为最新版本。eksctl create addon --name aws-ebs-csi-driver --cluster milvus-eks-cluster --region us-east-2 --service-account-role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/AmazonEKS_EBS_CSI_DriverRole --version v1.13.0-eksbuild.3 --force
创建 StorageClass
创建一个 StorageClass 来配置 EBS 卷。
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 Controller
-
添加 Helm charts 仓库。
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 集群。您可以在 这里 找到这些 charts。
-
添加 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>
替换为您自己的。- 要为您的 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 配置
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 服务地址。...
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 bucket 和相关 IAM 策略来恢复环境。
-
卸载 Milvus。
helm uninstall milvus-demo -n milvus
-
销毁 EKS 集群。
eksctl delete cluster --name milvus-eks-cluster --region us-east-2
-
删除 AWS S3 bucket 和相关 IAM 策略。
您应该将 bucket 名称和策略 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: