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

helm charting - how to render a same template more than once?

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

├── 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 以生成它的多个副本。我怎么做?我查看了部分内容,它似乎不符合我的要求。

您可以在模板文件中使用任何您想要的模板结构。一个文件可以包含(或生成)多个 YAML 文件(或none);如果它不止一个,您需要确保每个都以 --- 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 }} 隐藏但没有更多控制流量比那个。这些通常是相当重复的,但同时需要部署的一组组件通常是固定的(您通常不会使用值来仅部署应用程序的一部分)。