基于 Kubernetes 部署千亿级数据搜索引擎 Milvus

作者:李毓

Milvus 旨在帮助用户实现海量非结构化数据的近似检索和分析。单个 Milvus 实例可处理十亿级数据规模,而对于百亿或者千亿级数据,则需要一个 Milvus 集群实例。Kubernetes 是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,方便了声明式配置和自动化。

如果我们希望在 Kubernetes 集群中一个存储卷可以被多个 Pod 同时挂载,多个 Pod 同时修改相同数据,这时便需要共享存储。目前常见的共享资源协议有 NFS 和 CIFS 等。下面,我们将演示如何搭建 NFS 存储资源并在 Kubernetes 中部署 NFS Server。

加载nfs模块到主机内核并且利用 docker 搭建 NFS 存储资源

docker run -d --privileged --restart=always \
-v /tmp:/nfs \
-e NFS_EXPORT_DIR_1=/nfs \
-e NFS_EXPORT_DOMAIN_1=\* \
-e NFS_EXPORT_OPTIONS_1=rw,insecure,no_subtree_check,no_root_squash,fsid=1 \
-p 111:111 -p 111:111/udp \
-p 2049:2049 -p 2049:2049/udp \
-p 32765:32765 -p 32765:32765/udp \
-p 32766:32766 -p 32766:32766/udp \
-p 32767:32767 -p 32767:32767/udp \
fuzzle/docker-nfs-server:latest

赋权:chown -R nfsnobody:nfsnobody /nfs

在所有节点都安装客户端

yum -y install nfs-utils rpcbind
systemctl start nfs
systemctl start rpcbind

systemctl enable nfs
systemctl enable rpcbind

在client端看一下server端的nfs

[root@adm-master ~]# showmount -e 192.168.0.53
Export list for 192.168.0.53:
/nfs *

[root@adm-master ~]# mkdir -pv /data/nfs
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/nfs’

挂载

mount -t nfs -o rw,nfsvers=3 192.168.1.31:/nfs /data/nfs

查看挂载信息

[root@adm-master ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.9M  900M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/mapper/centos-root   47G  4.1G   43G   9% /
/dev/sda1               1014M  150M  865M  15% /boot
192.168.0.53:/nfs         47G  4.4G   43G  10% /data/nfs

利用helm配置stroageclass

拉取源代码

git clone https://github.com/helm/charts.git
cd charts/stable/nfs-client-provisioner
image:
  repository: willdockerhub/nfs-client-provisioner
  tag: latest
  pullPolicy: IfNotPresent

nfs:
  server: 192.168.0.107
  path: /nfs
  mountOptions:
    - rw
    - nfsvers=3

chart 为预先配置好的安装包资源,类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。当 chart 安装到 Kubernetes 中后就会创建一个 release。

NFS Client Provisioner 是用于自动创建 Kubernetes PV 的自动化插件。它可以根据已配置好的 NFS Server,自动创建 Kubernetes PV。

[root@adm-master nfs-client-provisioner]# helm install nfs-client .
NAME: nfs-client
LAST DEPLOYED: Fri Sep 18 00:10:25 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

检查部署状态

[root@adm-master ~]# helm list
NAME                            NAMESPACE   REVISION    UPDATED                                 STATUS      CHART                           APP VERSION  
nfs-client                      default     1           2020-09-19 21:44:42.329849841 +0800 CST deployed    nfs-client-provisioner-1.2.9    3.1.0      

查看pod

[root@adm-master nfs-client-provisioner]# kubectl get pods
NAME                                                READY   STATUS    RESTARTS   AGE
nfs-client-nfs-client-provisioner-f4d4786f5-8knw5   1/1     Running   0          3m46s

利用kubectl部署milvus
下载源代码

git clone -b 0.10.0 https://github.com/milvus-io/milvus-helm.git
cd milvus-helm

部署milvus

helm install --set cluster.enabled=true --set persistence.enabled=true --set mysql.enabled=true my-release  .

查看 Milvus release 是否安装成功:

[root@adm-master milvus-helm]# helm list
NAME        NAMESPACE   REVISION    UPDATED                                 STATUS      CHART                        APP VERSION
my-release  default     1           2020-09-20 22:56:07.656378683 +0800 CST deployed    milvus-0.10.0                0.10.0     
nfs-client  default     1           2020-09-20 22:49:26.461326654 +0800 CST deployed    nfs-client-provisioner-1.2.9 3.1.0      

这里有个坑,官网没有把配置写全。后面是空的,要加上storageClass的名字,两个valus.yaml都要加。

storageClass: "nfs-client"

还有就是配置里面的CPU和内存都要根据自己机器的实际情况设置,不要直接照抄,会导致启动失败。

查看pod是否启动成功

[root@adm-master milvus-helm]# kubectl get pods
NAME                                                READY   STATUS    RESTARTS   AGE
my-release-milvus-mishards-659496c4f4-nnj9s         1/1     Running   0          9m40s
my-release-milvus-readonly-85c94bbbf5-z7jg7         1/1     Running   0          9m40s
my-release-milvus-writable-549676655-mw649          1/1     Running   0          9m40s
my-release-mysql-8688668cd-xsqd4                    1/1     Running   0          9m40s
nfs-client-nfs-client-provisioner-f4d4786f5-ztd5h   1/1     Running   0          96m

此时,Milvus 服务已成功部署到 Kubernetes 上。但是,Kubernetes 的默认服务为 ClusterIP,集群内的其它应用可以访问该服务,而集群外部无法进行访问。所以,如果我们想在 Internet 或者生产环境中使用集群,我们需要更换 Service 以暴露应用。Kubernetes 的两种可以暴露服务的 Service 类型为:NodePort 和 LoadBalancer。下面我们将介绍如何使用 NodePort 服务在外部访问集群。

暴露服务

vim vales.yaml

service:
  type: NodePort
  port: 19530
  annotations: {}
  labels: {}

更新milvus release

helm upgrade --set cluster.enabled=true --set persistence.enabled=true --set mysql.enabled=true my-release --set web.enabled=true  .

可以看到,服务端口已经暴露出来。这样就算安装完成了。

[root@adm-master milvus-helm]# kubectl get svc
NAME                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)               AGE
kubernetes                   ClusterIP   10.1.0.1       <none>        443/TCP               60d
my-release-milvus            NodePort    10.1.222.188   <none>        19530:30631/TCP       19m
my-release-milvus-readonly   ClusterIP   10.1.231.35    <none>        19530/TCP,19121/TCP   19m
my-release-milvus-writable   ClusterIP   10.1.95.189    <none>        19530/TCP,19121/TCP   19m
my-release-mysql             ClusterIP   10.1.204.65    <none>        3306/TCP              19m
上一篇:.NET Core + K8S + Loki 玩转日志聚合


下一篇:Gitlab+Jenkins Pipeline+Docker+k8s+Helm自动化部署实践(干货!)