因工作需要,需在阿里云ACK部署Milvus生产集群,但依照官方文档 Install Milvus Cluster with Milvus Operator 安装的时候,遇到几个坑,在此记录下。
可先参考 Environment Checklist for Milvus Milvus on Kubernetes 在云上购买和配置相关的资源。
本人购买的云资源是
因为读多写少,主要是查询任务,计划是3台16核32G的ECS用于部署QueryNode外的所有负载,先部署1台64核64G用作QueryNode,后续有需求再横向扩展。
这些配置并不在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单独使用节点池里面的所有节点,不希望和其他负载共享,所以会配置节点亲和性。我的亲和性配置是:3台16vCPU 32GB ECS的节点池,设置节点标签,键:“milvus”,值:“components”,1台64vCPU 64GB ECS的节点池,设置节点标签 键:“milvus”,值:“querynode”。
参考 Install cert-manager
遇到不能访问github.com,也可先在别的机器下载再复制过来。 安装后,会出现新的命名空间"cert-manager"。确认安装成功后,在阿里云控制台更改cert-manager命名空间下负载的节点亲和性,设置为必须满足,标签名是""milvus:,操作符: “In”,标签值:“components”。
参考 Install Milvus Operator
安装后,会出现新的命名空间"milvus-operator"。确认安装成功后,在阿里云控制台更改milvus-operator命名空间下负载的节点亲和性,同样设置为必须满足,标签名是""milvus:,操作符: “In”,标签值:“components”。
参考 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
在阿里云ACK控制台->网络->服务中创建服务,配置如下:
类型 负载均衡 私网访问 标准型I(slb.s2.small)
关联 my-release-milvus-proxy
外部流量策略 Local
端口映射 19530 和 9091
外部流量策略,需要关注下网络插件类型,如果是 Terway ,选择 Local 亲测没问题。如果是 Flannel ,出现连接不上的情况,可选择 Cluster 试试看。
可在 官方 Hello Milvus 代码 ,下载并测试milvus是否可以正常连接并使用。
注意下,Milvus的身份验证功能需要手动配置开启,默认是无用户名密码也可连接,即使你设置了用户名和密码。参考 身份验证
查看原文