团队新开发的区域医疗平台包含一个课件上传与播放模块,其实际的业务包含如下的步骤:
1. 县级和乡镇卫生院的医生们通过在线视频参加培训、并录制视频。
2. 医生上传视频,并共享课件。
3. 平台上的其他医生可以在课件学习栏目学习录制的培训会议。
通常,课件的上传和保存我们都是通过对象存储做的,对象存储的好处显而易见:不担心文件丢失(三份备份), 不担心容量(云服务商集群),https/http访问, 数据安全(对象访问签名); 但是这个平台需要部署到区域医疗机构的机房里,多数情况下是没有对象存储的,外购对象存储也成本过高, 所以我们采用了折中的方案,存储系统换为NFS, 只需要一个大存储量的机器就可以了,大概服务如下:
我们开发了一个uploader服务,用于上传文件,同时使用Nginx提供http/https服务,两个服务之间共享存储,使用NFS存储挂载给他们。
这里我们来看看怎么给microk8s上的pod挂载NFS存储。
首先,我们需要安装NFS server 用于测试
我们使用ubuntu来进行测试,先执行命令:sudo apt install nfs-kernel-server
这个命令将安装服务器端,以及所有相关的包:
在home目录下创建一个nfsshare的文件夹用作共享目录。然后我们来编辑nfs配置文件,配置该共享目录,默认允许所有IP段挂在:
启动nfs: sudo /etc/init.d/nfs-kernel-server start
可以使用服务命令查看服务状态: service nfs-kernel-server status
使用ip addr命令查看以下当前主机的IP:
现在我们来使用nfsclient端测试一下:
sudo mount 10.0.2.15:/home/nfsshare /mnt
查询 /mnt 目录,可以看到在 /home/nsshare下面创建的文件和子目录
测试完后umount 挂载点: sudo umount -v /mnt
现在我们已经完成了nfs的搭建,现在我们需要编写k8s部署需要的文件
1. 先写一个PV, 用来表示可以挂载的NFS存储:
2. 接着写一个PVC,用于绑定PV:
3. 然后写包装了nginx的存储服务的deployment文件:
4. 最后写存储服务对应的service文件:
完成了所有配置文件,使用microk8s kubectl apply -f 命令,依次创建资源对象。
查询创建的pod:
使用exec 登陆docker,
查询/usr/share/storage目录,如下图,nfs已经挂载好了,可以看见我们在test目录下创建了几个文件:
最后,我们来验证一下http方式访问文件
现在storage的nfs目录下创建两个子目录,attachement、video , 对应docker的挂在路径为: /usr/share/storage/atttachment、/usr/share/storage/video。
在两个文件夹下面,分别创建两个文件 helloA.txt helloB.txt, 并随意写写内容。
完成后我们通过30080端口,从microk8s节点的浏览器访问两个文件:
至此,在k8s下,给pod挂在nfs的工作,并通过http访问的任务就完了。另外:
1. 后续需要考虑,通过Lua写一个脚本和nginx集成,实现访问资源签名验证,这个机制可以很容易的参考对象存储的验证。
2. 这里没有讨论,如何写upload和制作storage服务的镜像,upload服务也需要挂载nfs,原理是一样的,所以就不再讨论。 storage服务是基于Nginx镜像实现,下面的附录了带上了可参考的配置文件。
==============================================================
附录A: storageservice服务中,nginx的配置文件storage.conf
附录B: storageservice服务中dockerfile文件
附录C: Storageservice的build.gradle文件
参考一个Springboot项目的build.gradle和Dockerfile, 这里的buiild.gradle文件不需要java build, 仅需要用来生成新docker镜像。