作者:李毓
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