\346\214\202\350\275\275minio\345\210\260\346\234\254\345\234\260.md
... ...
@@ -0,0 +1,95 @@
1
+### 引擎目前使用方式
2
+
3
+引擎目前使用minio的方式是通过minio client去访问minio server来进行文件读写,这是正确的做法,但是我们还需要将远程的文件下载放到本地,比如jar包,比如前端zip包,以供引擎加载和使用,那么就涉及到需要维护两种方式访问文件的方式,一种是远程访问minio,另一种是访问本地磁盘。如果我们能够统一访问minio的方式跟访问本地磁盘一样,那么整个操作流程会变得更为简单,而且也没有在业务中先下载前端zip然后解压到本地再使用的操作,只需要在本地直接就地解压minio上面的文件即可,保证了一致性。
4
+
5
+### 使用方式
6
+
7
+#### k8s csi
8
+k8s除了在资源计算、网络方面做了抽象,当然也会在存储方面进行抽象和提供统一的接口,那就是csi,具体参考官方文档:https://kubernetes-csi.github.io/docs/ ,简单来说任何实现了csi接口的其他文件系统都可以当作k8s的存储来使用。我们目前使用的 nfs 就是一种,而minio作为对象存储当然也是可以作为k8s存储的,但是需要我们做一些工作。
9
+
10
+#### 存储供应
11
+
12
+ ```yaml
13
+ kind: StorageClass
14
+ apiVersion: storage.k8s.io/v1
15
+ metadata:
16
+ name: minio-s3fs-sc
17
+ labels:
18
+ app.kubernetes.io/managed-by: Helm
19
+ annotations:
20
+ meta.helm.sh/release-name: csi-s3
21
+ meta.helm.sh/release-namespace: default
22
+ storageclass.kubesphere.io/allow-clone: 'true'
23
+ storageclass.kubesphere.io/allow-snapshot: 'true'
24
+ provisioner: minio.s3.csi.sie.com
25
+ parameters:
26
+ access-key: snest
27
+ bucket: apps
28
+ endpoint: '192.168.184.122:31179'
29
+ mounter: s3fs
30
+ secret-key: snest123
31
+ reclaimPolicy: Delete
32
+ volumeBindingMode: Immediate
33
+
34
+ ```
35
+如上,需要定义StorageClass,来配置我们后面需要用到的pv,包括provisioner是谁,minio的url地址,桶等相关信息。
36
+
37
+#### pvc
38
+
39
+有了 StorageClass,我们就可以创建对应的pvc来供业务使用了,我们这里创建了2个pvc: minio-apps-pvc 用于保存apps相关文件,minio-apps-frontend-pvc 用于保存前端相关文件,且可以供引擎和前端共享。
40
+
41
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/1.jpg]]
42
+
43
+创建pvc以后,就会相应地在minio创建两个目录:
44
+
45
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/2.jpg]]
46
+
47
+#### 使用
48
+
49
+有了pvc以后,我们就可以在业务中使用。
50
+
51
+在引擎中分别挂载这2个pvc到容器内的 /apps 目录和 /apps-frontend 目录
52
+
53
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/3.jpg]]
54
+
55
+前端容器也是一样的使用方式:
56
+
57
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/4.jpg]]
58
+
59
+我们开始通过应用市场上传app相关文件,上传以后还是可以在minio查看到相关的文件,格式是 日期/随机数
60
+
61
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/5.jpg]]
62
+
63
+我们继续查看前端在minio映射的文件内容,可以发现就是 /usr/share/nginx/html 的文件内容:
64
+
65
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/6.jpg]]
66
+
67
+引擎端也是类似的:
68
+
69
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/7.jpg]]
70
+
71
+
72
+我们继续从应用市场安装一个app,然后查看/apps/modules 目录下的内容,发现安装的app jar包已经在里面了:
73
+
74
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/8.jpg]]
75
+
76
+继续查看 /apps-frontend/umdComps 目录下的前端文件,发现也已经保存了:
77
+
78
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/9.jpg]]
79
+
80
+最后我们回到引擎和前端容器的内部,核查以下文件是否保存在对应的目录了,可以发现确实都已经存在了:
81
+
82
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/10.jpg]]
83
+
84
+[[http://iidp.chinasie.com:9999/iidpminio/csi-s3/11.jpg]]
85
+
86
+最终我们实现了将minio挂载到本地,像操作本地磁盘一样来操作minio。
87
+
88
+
89
+#### 原理
90
+
91
+1, linux fuse 框架,linux内核提供了用户态的文件系统,参考:[[https://www.kernel.org/doc/html/latest/filesystems/fuse.html]]
92
+
93
+2,s3fs 一个可以把 S3 Bucket 挂在本地的文件系统,参考:[[https://github.com/s3fs-fuse/s3fs-fuse]]
94
+
95
+