引擎目前使用方式
引擎目前使用minio的方式是通过minio client去访问minio server来进行文件读写,这是正确的做法,但是我们还需要将远程的文件下载放到本地,比如jar包,比如前端zip包,以供引擎加载和使用,那么就涉及到需要维护两种方式访问文件的方式,一种是远程访问minio,另一种是访问本地磁盘。如果我们能够统一访问minio的方式跟访问本地磁盘一样,那么整个操作流程会变得更为简单,而且也没有在业务中先下载前端zip然后解压到本地再使用的操作,只需要在本地直接就地解压minio上面的文件即可,保证了一致性。
使用方式
k8s csi
k8s除了在资源计算、网络方面做了抽象,当然也会在存储方面进行抽象和提供统一的接口,那就是csi,具体参考官方文档:https://kubernetes-csi.github.io/docs/ ,简单来说任何实现了csi接口的其他文件系统都可以当作k8s的存储来使用。我们目前使用的 nfs 就是一种,而minio作为对象存储当然也是可以作为k8s存储的,但是需要我们做一些工作。
存储供应
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: minio-s3fs-sc
labels:
app.kubernetes.io/managed-by: Helm
annotations:
meta.helm.sh/release-name: csi-s3
meta.helm.sh/release-namespace: default
storageclass.kubesphere.io/allow-clone: 'true'
storageclass.kubesphere.io/allow-snapshot: 'true'
provisioner: minio.s3.csi.sie.com
parameters:
access-key: snest
bucket: apps
endpoint: '192.168.184.122:31179'
mounter: s3fs
secret-key: snest123
reclaimPolicy: Delete
volumeBindingMode: Immediate
如上,需要定义StorageClass,来配置我们后面需要用到的pv,包括provisioner是谁,minio的url地址,桶等相关信息。
pvc
有了 StorageClass,我们就可以创建对应的pvc来供业务使用了,我们这里创建了2个pvc: minio-apps-pvc 用于保存apps相关文件,minio-apps-frontend-pvc 用于保存前端相关文件,且可以供引擎和前端共享。
创建pvc以后,就会相应地在minio创建两个目录:
使用
有了pvc以后,我们就可以在业务中使用。
在引擎中分别挂载这2个pvc到容器内的 /apps 目录和 /apps-frontend 目录
前端容器也是一样的使用方式:
我们开始通过应用市场上传app相关文件,上传以后还是可以在minio查看到相关的文件,格式是 日期/随机数
我们继续查看前端在minio映射的文件内容,可以发现就是 /usr/share/nginx/html 的文件内容:
引擎端也是类似的:
我们继续从应用市场安装一个app,然后查看/apps/modules 目录下的内容,发现安装的app jar包已经在里面了:
继续查看 /apps-frontend/umdComps 目录下的前端文件,发现也已经保存了:
最后我们回到引擎和前端容器的内部,核查以下文件是否保存在对应的目录了,可以发现确实都已经存在了:
最终我们实现了将minio挂载到本地,像操作本地磁盘一样来操作minio。
原理
-
k8s csi,参考:https://kubernetes-csi.github.io/docs/
-
linux fuse 框架,linux内核提供了用户态的文件系统,参考:https://www.kernel.org/doc/html/latest/filesystems/fuse.html
-
s3fs 一个可以把 S3 Bucket 挂在本地的文件系统,参考:https://github.com/s3fs-fuse/s3fs-fuse