鉴于以下服务方案及其依赖关系,我想设计一组Helm图表。API网关称为服务A和服务C.服务A呼叫服务B.服务B调用数据库…
我建议每个服务一个图表,另外简化使“服务B”图表依赖于它的数据库。我会使这些图表独立:没有任何服务依赖于任何其他服务。
Helm依赖项运行良好的地方是您拥有嵌入/隐藏特定单个其他部分的服务。例如,B背后的数据库是一个实现细节,B之外的任何内容都不需要知道它。所以B可以依赖 stable/postgres 或者其他一些,这在Helm中很有效。
stable/postgres
有一个特定的机械问题会导致伞形图方法出现问题。假设服务D也依赖于数据库,它与数据库的“种类”相同(比如使用PostgreSQL)。在操作上,您希望这两个数据库是分开的。赫尔姆会看到两条路 umbrella > B > database 和 umbrella > D > database ,并且只安装数据库图表的一个副本,因此您最终将使用共享数据库的两个服务。你可能不希望这样。
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 ,这不是你想要的。
{{ .Release.Name }}-{{ .Chart.Name }}
service-C-C
service-C-B
service-C-database
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