鉴于以下服务方案及其依赖关系,我想设计一组Helm图表。
API Gateway
称Service A
和Service C
Service A
称Service B
Service B
称Database
Service C
称Service B
和Service D
目前我看到两种选择:
Umbrella
图表,它依赖于所有其他图表。 Database
图表是Service B
图表的依赖。Helm documentation建议选择选项2.由于本地开发和CI / CD管道的简易性,我对选项1更加热衷。
示例场景:开发人员正在重构Service C
,他希望运行他更改的代码并对其进行测试。
Service C
图表。Umbrella
图表,由于运行不需要的服务,如Service A
或API Gateway
,导致浪费CPU和内存资源,这些服务不能很好地适应系统的复杂性;
安装Service C
,然后Service B
然后Service D
,它也不能很好地适应系统的复杂性,因为它需要执行许多手动操作,并且还要求开发人员熟悉系统的体系结构以便知道什么是图表需要安装。我想就哪种选择做出明智的决定。我更倾向于选项1,但Helm docs以及我能在互联网上找到的几个例子(link)也会选择2,所以我想我可能会遗漏一些东西。
我建议每个服务一个图表,另外简化使“服务B”图表依赖于它的数据库。我会使这些图表独立:没有任何服务依赖于任何其他服务。
Helm依赖项运行良好的地方是您拥有嵌入/隐藏特定单个其他部分的服务。例如,B背后的数据库是一个实现细节,B之外的任何内容都不需要知道它。因此B可以依赖于stable/postgres
或其他一些,这在Helm中很有效。
有一个特定的机械问题会导致伞形图方法出现问题。假设服务D也依赖于数据库,它与数据库的“种类”相同(比如使用PostgreSQL)。在操作上,您希望这两个数据库是分开的。 Helm会看到两个路径umbrella > B > database
和umbrella > D > database
,并且只安装数据库图表的一个副本,因此您最终将获得共享数据库的两个服务。你可能不希望这样。
您在此处使用Helm依赖项遇到的另一个机械问题是,大多数资源都被命名为{{ .Release.Name }}-{{ .Chart.Name }}
的一些变体。在您的选项1中,假设您只安装服务C;你最终会遇到像service-C-C
,service-C-B
,service-C-database
这样的部署。如果你想在它旁边部署服务A,那就会引入自己的service-A-B
和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