掌舵图表 - 如何多次渲染同一个模板?

时间:2021-06-11 06:22:56

标签: kubernetes-helm go-templates

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

├── Chart.yaml
├── templates
│   ├── NOTES.txt
│   ├── _helpers.yaml
│   ├── comp-1
│   │   ├── comp-1-deployment.yaml
│   │   ├── comp-1-ingress.yaml
│   │   └── comp-1-service.yaml
│   ├── comp-2
│   │   ├── comp-2-deployment.yaml
│   │   └── comp-2-service.yaml
│   ├── comp-3
│   │   ├── comp-3-deployment.yaml
│   │   └── comp-3-service.yaml
└── values.yaml

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

├── Chart.yaml
├── templates
│   ├── NOTES.txt
│   ├── _helpers.yaml
│   ├── comp
│   │   ├── comp-deployment.yaml
│   │   ├── comp-ingress.yaml
│   │   └── comp-service.yaml
└── values.yaml

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

1 个答案:

答案 0 :(得分:2)

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

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

{{ $top := . -}}
{{ range .Values.components -}}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ $top.Release.Name }}-{{ .name }}
...
{{ end -}}

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

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

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

相关问题