多次安装单个Kubernetes部署

多次安装单个Kubernetes部署,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我有一个掌舵图,可以安装不同的kubernetes资源来部署我的应用程序。 其中一个资源是具有两种风格的部署,一种用于应用程序的客户端部分,另一种用于服务器部分,因此实际上它们是两种部署。它们的大多数清单yaml文件都完全相同,唯一重要的区别是,每个文件引用不同的configmap,以便为某些configmap属性(特别是类型:客户端/服务器和副本数)指定特定值。这似乎不是很有效,因为我正在为部署复制代码,但这是我发现的方法。 另一方面,对于configmaps,我使用了Helm的模板特性{{i

我有一个掌舵图,可以安装不同的kubernetes资源来部署我的应用程序。 其中一个资源是具有两种风格的部署,一种用于应用程序的客户端部分,另一种用于服务器部分,因此实际上它们是两种部署。它们的大多数清单yaml文件都完全相同,唯一重要的区别是,每个文件引用不同的configmap,以便为某些configmap属性(特别是类型:客户端/服务器和副本数)指定特定值。这似乎不是很有效,因为我正在为部署复制代码,但这是我发现的方法。 另一方面,对于configmaps,我使用了Helm的模板特性{{include},因此我有一个包含所有公共内容的主configmap模板,以及两个单独的configmaps,指定每个部署的差异,并包括主模板

到目前为止还不错,尽管可能有一些不必要的代码重复,在这种情况下,我不知道如何改进

问题在于上述两种部署的多个变体发挥了作用。例如,我可能希望部署一个客户端类型的pod,其属性X具有特定的值,以及两个服务器类型的pod,其属性X具有不同的值。因此,按照我的方法,我必须开始创建更多的部署yaml文件,以涵盖所有可能的组合:type=client&X=Y、type=client&X=Z、type=server&X=Y、type=server&X=Z等等。这样做的唯一目的是能够指定每种类型或组合需要多少副本

有没有办法使用Helm或其他与Kubernetes相关的框架来拥有单个部署yaml文件,并能够多次安装它,只指定不同的属性和该变化的副本数量

例如:

我想:

3个副本,其类型=客户端,X=1 2个副本,其类型=服务器,X=1 4个复制副本,类型=客户端,X=2 1个类型为服务器且X=3的复制副本 其中,type和X是某些configmap中的属性数据


希望它足够清晰,否则请让我知道,谢谢。

在Helm中,有几种方法可以实现这一点。您需要将设置升级到Helm的配置层,它们将位于values.yaml中,或者通过类似Helm install-set的机制提供;您无法从ConfigMap中提取它们

一种方法是让Helm chart只安装部署的单个实例和相应的ConfigMap。有一个包含以下行的templates/deployment.yaml文件:

名称:{{.Release.name}-{{.Chart.name}-{{.Values.type}-{{.Values.X} 副本:{{.Values.replicas} 环境: -名称:类型 值:{{.Values.type} -姓名:X 值:{{quote.Values.X} 然后,您可以部署它的多个副本:

舵安装c1-集合类型=客户端-集合X=1-集合副本=3 舵安装s1-集合类型=服务器-集合X=1-集合副本=2 您提到您已经在使用模板生成类似的ConfigMap,并且您还可以对任何YAML结构使用相同的方法。模板只接受一个参数,一个可能的技巧是将列表作为该参数传递。要记住的另一个重要细节是,顶级名称(如.Values)实际上是特殊对象中的字段查找,可以在多个上下文中重新分配,因此可能需要显式传递和引用顶级对象

假设模板需要顶级值,还需要一些额外的配置设置:

{{-define a.deployment-} {{-$top:=index.0-} {{-$config:=index.1-} 元数据: 名称:{{include chart.name$top}-{{$config.type}-{$config.X} {{end-}} 请注意,我们从单个list参数中解压这两个值,然后在可能需要传递的地方传递$top。作为一个参数

每个变体都可以有一个顶级文件。例如,templates/deployment-server-1.yaml可能包含:

{{-$config:=dict类型服务器x1-} {{-include.deployment list.$config-} 在这里。是顶层对象;我们将其和配置字典嵌入到单个列表参数中,以匹配模板所需的内容。如果在Helm配置中指定了某些值,则可以在dict调用中使用任何模板构造

最后,实际上没有一条规则规定YAML文件只包含一个对象。如果您的头盔配置只是列出了这些变体,您可以在它们之间循环并发射它们:

{{-/*范围将重新分配。请保存其当前值*/-} {{-$top:=.-} {{-range.Values.installations-} {{-/*Now.是安装列表中的一项*/-} {{-/*这是YAML文档开始标记://-} -- {{包括部署列表$top.} {{-end-} 您只需列出列表中的所有变体和设置 Helm values.yaml或外部提供的Helm install-f more-values.yaml文件:

安装: -类型:客户端 X:1 副本:3份 -类型:服务器 X:1 副本:2份
你的回答很完整,很有帮助。正如您所建议的,我使用range函数在安装列表中循环,当我运行helm install-debug-dry run时,我可以看到它生成了多个部署文档,这些文档以文档标记--“开始”分隔。但奇怪的是,当我运行real helm安装来部署应用程序时,只考虑一个部署yaml文件,特别是与安装列表中最后一个元素相对应的文件。你知道会发生什么吗?请忽略我之前的评论,我忘了添加。。。最后关闭--。我还必须从end子句中删除连字符以使其工作,因此我使用了{{end}}而不是{end-}。谢谢