c8d9f3c9742942b63568fbbf7854e6d41acbd40b
\345\206\205\347\275\256app\350\260\203\346\225\264.md
... | ... | @@ -0,0 +1,109 @@ |
1 | +### 方案设计文档 |
|
2 | + |
|
3 | +#### 背景和目标 |
|
4 | +本方案旨在优化现有系统的内置应用管理方式,通过外置化内置应用、精简 Dockerfile 以及调整应用市场功能,来实现减小镜像大小、简化工程维护,并增强内置应用的灵活性和可维护性。 |
|
5 | + |
|
6 | +#### 主要调整内容 |
|
7 | + |
|
8 | +1. **内置应用外置化** |
|
9 | +2. **精简 Dockerfile** |
|
10 | +3. **应用市场调整** |
|
11 | +4. **通过 MinIO 挂载方式加载应用** |
|
12 | + |
|
13 | +--- |
|
14 | + |
|
15 | +### 详细方案 |
|
16 | + |
|
17 | +#### 1. 内置应用外置化 |
|
18 | + |
|
19 | +**目标:** |
|
20 | +- 将内置应用与普通应用一样,通过挂载的方式统一加载到 `apps` 目录下。 |
|
21 | + |
|
22 | +**好处:** |
|
23 | +- 减小镜像大小。 |
|
24 | +- 减少引擎代码工程中内置应用的 jar 包维护,使项目工程更简洁。 |
|
25 | +- 可直接沿用已有的apps目录作为挂载点。 |
|
26 | + |
|
27 | + |
|
28 | +#### 2. 精简 Dockerfile |
|
29 | + |
|
30 | +**目标:** |
|
31 | +- 去掉 Dockerfile 中的 `cp` 命令,不再需要拷贝源码中的内置应用到镜像中。 |
|
32 | + |
|
33 | +**实现步骤:** |
|
34 | +- 删除 Dockerfile 中与内置应用相关的 `COPY` 和 `CMD` 命令。 |
|
35 | + |
|
36 | + |
|
37 | +#### 3. 应用市场调整 |
|
38 | + |
|
39 | +**目标:** |
|
40 | +- 调整应用市场功能,允许安装内置应用,并通过种子数据的方式预安装所有的内置应用,同时支持内置应用的升级。 |
|
41 | + |
|
42 | +**实现步骤:** |
|
43 | +- 修改应用市场的配置和逻辑,允许内置应用的安装和升级。 |
|
44 | +- 通过种子数据的方式预先配置所有内置应用,并在系统初始化时自动安装这些应用。 |
|
45 | + |
|
46 | + |
|
47 | +#### 4. 通过 MinIO 挂载方式加载应用 |
|
48 | + |
|
49 | +**目标:** |
|
50 | +- 通过将存储应用市场 jar 的 MinIO 挂载到镜像中,直接加载内置应用和业务应用,而不需要下载 jar。 |
|
51 | + |
|
52 | +**实现步骤:** |
|
53 | +- 使用 Kubernetes 的 CSI(Container Storage Interface)驱动将 MinIO 存储挂载到容器中,更为具体方式参考业界方案。 |
|
54 | +- 修改应用的启动脚本或配置文件,使其能够从挂载的 MinIO 目录中加载应用。 |
|
55 | + |
|
56 | +**示例:** |
|
57 | +```yaml |
|
58 | +apiVersion: v1 |
|
59 | +kind: PersistentVolume |
|
60 | +metadata: |
|
61 | + name: minio-pv |
|
62 | +spec: |
|
63 | + capacity: |
|
64 | + storage: 10Gi |
|
65 | + accessModes: |
|
66 | + - ReadWriteMany |
|
67 | + csi: |
|
68 | + driver: minio.csi.min.io |
|
69 | + volumeHandle: "minio-volume" |
|
70 | + volumeAttributes: |
|
71 | + bucket: "apps" |
|
72 | + |
|
73 | +--- |
|
74 | + |
|
75 | +apiVersion: v1 |
|
76 | +kind: PersistentVolumeClaim |
|
77 | +metadata: |
|
78 | + name: minio-pvc |
|
79 | +spec: |
|
80 | + accessModes: |
|
81 | + - ReadWriteMany |
|
82 | + resources: |
|
83 | + requests: |
|
84 | + storage: 10Gi |
|
85 | + |
|
86 | +--- |
|
87 | + |
|
88 | +apiVersion: v1 |
|
89 | +kind: Pod |
|
90 | +metadata: |
|
91 | + name: app-pod |
|
92 | +spec: |
|
93 | + containers: |
|
94 | + - name: app-container |
|
95 | + image: my-app-image |
|
96 | + volumeMounts: |
|
97 | + - mountPath: "/apps" |
|
98 | + name: minio-apps |
|
99 | + volumes: |
|
100 | + - name: minio-apps |
|
101 | + persistentVolumeClaim: |
|
102 | + claimName: minio-pvc |
|
103 | +``` |
|
104 | + |
|
105 | +### 总结 |
|
106 | + |
|
107 | +通过上述方案,内置应用不再打包在镜像中,而是通过挂载的方式统一加载到 `apps` 目录下。此举不仅减小了镜像大小,还简化了工程维护。同时,应用市场也进行了相应调整,允许安装内置应用并支持其升级。最后,作为更简洁的方式,可考虑通过 MinIO 挂载的方式加载应用,进一步简化了应用的加载过程。 |
|
108 | +此外,可解决在多个容器同时启动时并发拷贝内置应用可能导致的 jar 包找不到的 bug,如下: |
|
109 | + http://iidp.chinasie.com:9999/iidpminio/home/error.png |