helm 图表 - 如何多次渲染相同的模板?

kak*_*eys 2 go-templates kubernetes-helm

我希望创建一个 helm 图表来部署具有多个不同 pod 的应用程序(因此有多个部署清单)。这是图表的结构:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Chart.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 NOTES.txt\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 _helpers.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-1-deployment.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-1-ingress.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 comp-1-service.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-2\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-2-deployment.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 comp-2-service.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-3\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-3-deployment.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 comp-3-service.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 values.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

我意识到所有组件的模板看起来都一样,所以我想重构以将模板减少为:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Chart.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 NOTES.txt\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 _helpers.yaml\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-deployment.yaml\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 comp-ingress.yaml\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 comp-service.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 values.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

并使用其中的值多次values.yaml渲染以生成它的多个副本。comp我怎么做?我研究过部分,似乎它没有达到我想要的效果。

\n

Dav*_*aze 9

您可以在模板文件中使用任何您想要的模板结构。一个文件可以包含(或生成)多个 YAML 文件(或无);如果不止一个,您需要确保每个都以---YAML 文档开始标记开头。

例如,如果您想根据值生成多个 Deployment,您可以指定

{{ $top := . -}}
{{ range .Values.components -}}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ $top.Release.Name }}-{{ .name }}
...
{{ end -}}
Run Code Online (Sandbox Code Playgroud)

这里的一个技巧是,在range循环内部,特殊变量.是循环迭代器,而普通的 Helm 顶级对象是隐藏的。我倾向于将 的原始值保存.在变量中,或者特殊的模板变量$通常也可以工作。

确保仔细检查空白控件:如果它们不在自己的一行上,-则这将不起作用。---您可以查看模板生成的内容,而无需使用 将其提交到集群helm template

在我在 GitHub 上查看的模板中,“正常样式”似乎是文件的一种 Kubernetes 资源,可能隐藏{{ if }}...{{ end }}在顶层,但没有更多的控制流。这些通常相当重复,但同时需要部署的一组组件通常是固定的(您通常不会使用值来仅部署应用程序的一部分)。