【问题标题】:helm generic chart to use as multiple deployments for different installations [duplicate]helm通用图表用作不同安装的多个部署[重复]
【发布时间】:2021-07-01 20:47:51
【问题描述】:

假设我有一个 Helm 图表“ManagementModule”,它的环境变量很少,如下所示。

env1:[value1, value2, value3]

env2: "fixValue"

env3: "dynamic"

现在,我的要求如下:

  1. 如果目标是客户 X 环境,则只创建一个具有 3 个副本的部署,可能名称为 management-module。 [这个要求很简单,但它也应该适用于以下情况]

  2. 如果目标是客户 Y 环境,则创建 3 个不同的部署,每个部署有 2 个副本,每个副本具有以下环境变量。

-- 部署名称:管理模块-1

   env1:[value1]

   env2: "fixValue"

   env3: "dynamic1"

-- 部署名称:管理模块-2

   env1:[value2]

   env2: "fixValue"

   env3: "dynamic2"

-- 部署名称:管理模块-3

   env1:[value3]

   env2: "fixValue"

   env3: "dynamic2"

第二种情况只是想让不同的部署在它们的一组环境值上工作并且彼此独立。该图表应支持两种部署方式

我可以通过模板/图表来实现吗?有什么建议,我们如何用一张图表实现这两组部署?

【问题讨论】:

  • this 能解决您的问题吗?

标签: kubernetes openshift kubernetes-helm


【解决方案1】:

答案基于this。因此是 CW。

您可以使用_*.tpl 文件来定义通用模板,它们位于./templates/_*.tpl. 是具有全局 Chart.yaml 和 values.yaml 的目录)。同样默认在 helm 全局值覆盖本地值。可以在here找到解决方案。

通过结合使用这两种技术,您可以制作通用模板,并且只使用 values.yaml 来呈现您想要呈现的内容。

例如:

# values.yaml
global:
  defaults:
    switches:
      volumesEnabled: false
      ingressEnabled: false
    ingress:
      host: "generic-host.com"
    volumes:
      volumeName: "generic-volume-name"

subchart1:
  defaultOverrides:
    switches:
      volumesEnabled: true
  volumes:
    volumeName: "not-so-generic-name"

subchart2:
  defaultOverrides:
    switches:
      volumesEnabled: true
      ingressEnabled: true

然后是模板(java只是为了将模板归为一类,你可以尝试猜测我的后端微服务是用哪种语言编写的:))

# ./templates/java/_deployment.tpl

{{- define "templates.java.deployment" }}
{{- $properties := merge .Values.defaultOverrides $.Values.global.defaults -}}
{{*/ generic deployment structure */}}
{{- if $properties.switches.volumesEnabled -}}
volume: {{ $properties.volumes.volumeName }}
{{- end }}
{{*/ generic deployment structure */}}
{{- end }}
# ./templates/java/_ingress.tpl

{{- define "templates.java.ingress" }}
{{- $properties := merge .Values.defaultOverrides $.Values.global.defaults -}}
{{- if $properties.switches.ingressEnabled -}}
host: {{ $properties.ingress.host }}
{{*/ generic ingress structure */}}
{{- end }}
{{- end }}

然后是子图模板

# ./charts/subchart1/templates/deployment.yaml

{{ include "templates.java.deployment" . }}
./charts/subchart1/templates/ingress.yaml:

{{ include "templates.java.ingress" . }}
subchart2 has exactly the same includes.

最后我们会有:

  • 子图 1:
    • 已部署
    • volumeName 被本地值覆盖为“not-so-generic-name”
    • 根本不渲染入口
  • 子图2:
    • 已部署
    • volumeName 是全局值的默认值
    • 入口主机是全局值的默认值

但我会说,泛化太多是一种不好的做法,因为它会使您的模板过于复杂。在我的情况下,我发现了 2 个不同的组,它们在其中具有几乎相同的清单(基本上是前端和后端),并为每个组创建了一组 _*.tpl 文件,并分别在全局 values.yaml 中为每个组设置默认值。

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2020-03-19
    相关资源
    最近更新 更多