在阿里云ACK部署Milvus生产集群的坑

在阿里云ACK部署Milvus生产集群的坑

因工作需要,需在阿里云ACK部署Milvus生产集群,但依照官方文档 Install Milvus Cluster with Milvus Operator 安装的时候,遇到几个坑,在此记录下。

一、准备工作

1.1 准备资源

可先参考 Environment Checklist for Milvus Milvus on Kubernetes 在云上购买和配置相关的资源。

本人购买的云资源是

  • ACK托管版
  • K8S版本 1.24.6-aliyun.1
  • 3台 16vCPU 32GB ecs.c6e.4xlarge
  • 1台 64vCPU 64GB ecs.ic5.16xlarge

因为读多写少,主要是查询任务,计划是3台16核32G的ECS用于部署QueryNode外的所有负载,先部署1台64核64G用作QueryNode,后续有需求再横向扩展。

1.2 配置存储类

这些配置并不在Milvus的安装文档内,但不执行的话,后续安装过程会出错。创建好ACK资源后,在阿里云控制台创建新的存储类,主要是指定type和zoneId。我的配置如下:

存储卷类型 云盘
存储驱动 CSI
参数添加 key是"type",值是"cloud_essd",key是"zoneId",值是"cn-shanghai-g"
回收策略 和 绑定模式 可用默认的

type指定cloud_essd的原因是这是性能最好的云盘类型,但需要特别注意节点的主机所支持的存储是否支持pvc要求的类型,否则会导致负载启动不成功的问题,一直在容器创建状态。

指定zoneId是因为有时候pvc自动创建的pv有可能跑到其他可用区去,进而造成pod一直在 Pending 状态,提示node affinity conflict。类似“0/13 nodes are available: 2 node(s) were unschedulable, 3 node(s) had volume node affinity conflict, 8 node(s) didn’t match Pod’s node affinity/selector.”这样的报错。这时候你查看pv的yaml会发现pv的zoneId和pod所在的节点不在一个可用区。

创建完成后,执行

kubectl patch storageclass {你创建的存储类的名称,不需要花括弧} -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

可执行kubectl get sc验证。

参考文档:

  • 云盘存储卷概述
  • 使用云盘动态存储卷
  • 实例规格族

二、安装 Milvus

安装过程基本上按照教程即可,但我希望Milvus单独使用节点池里面的所有节点,不希望和其他负载共享,所以会配置节点亲和性。我的亲和性配置是:3台16vCPU 32GB ECS的节点池,设置节点标签,键:“milvus”,值:“components”,1台64vCPU 64GB ECS的节点池,设置节点标签 键:“milvus”,值:“querynode”。

2.1 安装 cert-manager

参考 Install cert-manager

遇到不能访问github.com,也可先在别的机器下载再复制过来。 安装后,会出现新的命名空间"cert-manager"。确认安装成功后,在阿里云控制台更改cert-manager命名空间下负载的节点亲和性,设置为必须满足,标签名是""milvus:,操作符: “In”,标签值:“components”。

2.2 安装 Milvus Operator

参考 Install Milvus Operator

安装后,会出现新的命名空间"milvus-operator"。确认安装成功后,在阿里云控制台更改milvus-operator命名空间下负载的节点亲和性,同样设置为必须满足,标签名是""milvus:,操作符: “In”,标签值:“components”。

2.3 安装 Milvus cluster

参考 Install a Milvus cluster!

创建新的命名空间 milvus,并切换到新的命名空间kubectl config set-context $(kubectl config current-context) --namespace=milvus。下载官方的"milvus_cluster_default.yaml"并修改,配置如下:

apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: my-release
  labels:
    app: milvus
spec:
  mode: cluster
  dependencies: {}
  components:
    affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: milvus
                operator: In
                values:
                - components
    dataCoord:
      replicas: 1
    dataNode:
      replicas: 1
    indexNode:
      replicas: 1
    proxy:
      replicas: 1
    indexCoord:
      replicas: 1
    queryNode:
      replicas: 1
      resources:
        limits:
          cpu: '60'
        requests:
          cpu: '60'
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: milvus
                operator: In
                values:
                - querynode
    rootCoord:
      replicas: 1
  config: {}

配置的重点在于明确各个负载的副本数,并特别设置了queryNode的节点亲和性,资源占用与限制,因为承载queryNode的节点是64核,所以cpu设置为60,如果你的机器不是64核,此处需修改。yaml也明确了query node的副本数,横向扩展时,可以修改此处,并重新kubectl apply

而后执行安装kubectl apply -f ./milvus_cluster_default_modify.yaml,稍等一会儿kubectl get pods,会发现etcd无法启动成功,这是因为官方设置etcd的PVC总量是10G,而阿里云essd,需要至少20G才能初始化。修改etcd的yaml文件,将storage由原来的10Gi改为20Gi,部分yaml代码如下:

spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: alicloud-disk-essd-shanghai-g
  volumeMode: Filesystem

依次 kubectl apply 修改三个etcd的pvc总量,而后pv可成功初始化,etcd亦可成功运行。所有pod成功启动后,更改milvus 命名空间下所有有状态负载的节点亲和性。到这里,milvus本身就安装好了。

这里注意下,milvus自身的组件是带"my-release-milvus-"前缀的,且都在无状态负载下,不要手动修改这些组件的包括亲和性、资源限制在内的任何配置,因为修改了也没用,如果刚没修改,可在"milvus_cluster_default_modify.yaml"修改,并重新kubectl apply -f ./milvus_cluster_default_modify.yaml

2.4 创建 Milvus 连接端口

在阿里云ACK控制台->网络->服务中创建服务,配置如下:

类型 负载均衡 私网访问 标准型I(slb.s2.small)
关联 my-release-milvus-proxy
外部流量策略 Local
端口映射 19530 和 9091

外部流量策略,需要关注下网络插件类型,如果是 Terway ,选择 Local 亲测没问题。如果是 Flannel ,出现连接不上的情况,可选择 Cluster 试试看。

2.5 测试

可在 官方 Hello Milvus 代码 ,下载并测试milvus是否可以正常连接并使用。

注意下,Milvus的身份验证功能需要手动配置开启,默认是无用户名密码也可连接,即使你设置了用户名和密码。参考 身份验证

查看原文

你可能感兴趣的:(阿里云,milvus,算法,数据库)