给定以下服务方案及其依赖项,我想设计一组 Helm 图表。
-
API Gateway
calls Service A
and Service C
-
Service A
calls Service B
-
Service B
calls Database
-
Service C
calls Service B
and Service D
目前我看到两种选择:
Each of the 6 components in a diagram below is a single chart and each arrow in a diagram is a single dependency.
There's an Umbrella
chart that has a dependency on all other charts. The Database
chart is a dependency of Service B
chart.
头盔文档建议使用选项 2。不过,由于本地开发和 CI/CD 管道的便利性,我更热衷于选项 1。
示例场景:开发人员正在重构Service C
他想运行他更改的代码并对其进行测试。
- 选项 1. 开发人员安装
Service C
仅图表。
- Option 2: Developer would have to either:
- 安装一个
Umbrella
由于运行不需要的服务(例如Service A
or API Gateway
,它不能很好地适应系统的复杂性;
- install
Service C
, then Service B
进而Service D
,这也不能很好地适应系统的复杂性,因为它需要执行许多手动操作,并且还要求开发人员熟悉系统的架构,以便知道需要安装哪些图表。
我想就采取哪种替代方案做出明智的决定。我更热衷于选项 1,但是 Helm 文档以及我在互联网上找到的几个示例(link)也选择了选项 2,所以我想我可能会遗漏一些东西。
我建议每个服务使用一个图表,并进一步简化“服务 B”图表依赖于其数据库的操作。我将使这些图表独立:没有任何服务依赖于任何其他服务。
Helm 依赖关系发挥良好作用的地方是您拥有嵌入/隐藏特定单个其他部分的服务。例如,B 背后的数据库是一个实现细节,B 外部不需要了解它。所以B可以依赖stable/postgres
或类似的东西,这在 Helm 中效果很好。
有一个特定的机械问题会导致伞图方法出现问题。假设服务 D 也依赖于数据库,并且它是相同“类型”的数据库(假设都使用 PostgreSQL)。从操作上来说,您希望这两个数据库是分开的。 Helm 将看到两条路径umbrella > B > database
and umbrella > D > database
,并且只安装数据库图表的一份副本,因此您最终将获得共享数据库的两个服务。你可能不想要这样。
使用 Helm 依赖项时您会遇到的另一个机械问题是,大多数资源都被命名为以下形式的某种变体:{{ .Release.Name }}-{{ .Chart.Name }}
。在选项 1 中,假设您只安装服务 C;你最终会得到像这样的部署service-C-C
, service-C-B
, service-C-database
。如果您想将服务 A 与它一起部署,那么它将引入它自己的service-A-B
and service-A-database
,这又不是你想要的。
我不知道有什么伟大的高级开源解决方案可以解决这个问题。基于 Make 的解决方案虽然很笨拙,但可以工作:
# -*- gnu-make -*-
all: api-proxy.deployed
%.deployed:
helm upgrade --install --name $* -f values.yaml ./charts/$*
touch $@
api-proxy.deployed: a.deployed c.deployed
a.deployed: b.deployed
c.deployed: b.deployed d.deployed
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)