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 |