跳到主要内容

在 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 不支持调度服务创建的顺序。在早期阶段,在 etcdpulsar 启动之前,业务 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: