访问模板内的文件
在上一节中,我们探讨了创建和访问命名模板的几种方法。这使得在一个模板中轻松导入另一个模板成为可能。但有时需要导入一个非模板文件,并注入其内容,而无需将其内容通过模板渲染器发送。
Helm 通过 .Files
对象提供对文件的访问。不过,在我们开始使用模板示例之前,需要注意几点关于其工作方式的事项。
- 可以将额外文件添加到 Helm 图表中。这些文件将被捆绑。但要注意,由于 Kubernetes 对象存储限制,图表必须小于 1M。
- 某些文件无法通过
.Files
对象访问,通常出于安全原因。- 无法访问
templates/
中的文件。 - 使用
.helmignore
排除的文件无法访问。 - 无法访问 Helm 应用程序子图表之外的文件,包括父图表中的文件。
- 无法访问
- 图表不保留 UNIX 模式信息,因此在涉及
.Files
对象时,文件级权限不会影响文件的可用性。
基本示例
了解这些注意事项后,让我们编写一个将三个文件读入 ConfigMap 的模板。首先,我们将三个文件添加到图表中,将所有三个文件直接放在 mychart/
目录中。
config1.toml
:
message = Hello from config 1
config2.toml
:
message = This is config 2
config3.toml
:
message = Goodbye from config 3
这些都是简单的 TOML 文件(类似于老式的 Windows INI 文件)。我们知道这些文件的名字,所以可以使用 range
函数来循环遍历它们,并将它们的内容注入到我们的 ConfigMap 中。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $files := .Files }}
{{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{{ . }}: |-
{{ $files.Get . }}
{{- end }}
这个 ConfigMap 使用了前面几节讨论的一些技术。例如,我们创建了一个 $files
变量来保存对 .Files
对象的引用。我们还使用 tuple
函数创建一个要循环遍历的文件列表。然后我们打印每个文件名({{ . }}: |-
)后跟文件的内容 {{ $files.Get . }}
。
运行此模板将生成一个包含所有三个文件内容的 ConfigMap。
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quieting-giraf-configmap
data:
config1.toml: |-
message = Hello from config 1
config2.toml: |-
message = This is config 2
config3.toml: |-
message = Goodbye from config 3
路径助手
在处理文件时,对文件路径本身执行一些标准操作非常有用。为了帮助实现这一点,Helm 导入了许多来自 Go 的 path 包的函数,供您使用。它们都使用与 Go 包中相同的名称,但第一个字母为小写。例如,Base
变为 base
,等等。
导入的函数有
- Base
- Dir
- Ext
- IsAbs
- Clean
通配符模式
随着图表的发展,您可能会发现需要更好地组织文件,因此我们提供了 Files.Glob(pattern string)
方法,以帮助您使用 通配符模式 的全部灵活性来提取特定文件。
.Glob
返回一个 Files
类型,因此您可以在返回的对象上调用任何 Files
方法。
例如,假设目录结构如下:
foo/:
foo.txt foo.yaml
bar/:
bar.go bar.conf baz.yaml
使用通配符,您有多种选择
{{ $currentScope := .}}
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{- with $currentScope}}
{{ .Files.Get $path }}
{{- end }}
{{ end }}
或者
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
ConfigMap 和 Secrets 工具函数
(Helm 2.0.2 及更高版本可用)
通常需要将文件内容放置在 ConfigMap 和 Secrets 中,以便在运行时将其挂载到 Pod 中。为了帮助您实现这一点,我们在 Files
类型上提供了一些工具方法。
为了进一步组织,将这些方法与 Glob
方法结合使用尤其有用。
根据 通配符 示例中显示的目录结构
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
编码
您可以导入文件,并让模板对其进行 base-64 编码,以确保传输成功
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
type: Opaque
data:
token: |-
{{ .Files.Get "config1.toml" | b64enc }}
以上操作将使用我们之前使用的同一个 config1.toml
文件,并对其进行编码
# Source: mychart/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: lucky-turkey-secret
type: Opaque
data:
token: |-
bWVzc2FnZSA9IEhlbGxvIGZyb20gY29uZmlnIDEK
行
有时需要在模板中访问文件的每一行。为此,我们提供了一个方便的 Lines
方法。
您可以使用 range
函数循环遍历 Lines
data:
some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
{{ . }}{{ end }}
在 helm install
期间无法传递图表外部的文件。因此,如果您要求用户提供数据,则必须使用 helm install -f
或 helm install --set
来加载数据。
本节讨论了 Helm 模板编写工具和技术的介绍。在下一节中,我们将了解如何使用一个特殊文件 templates/NOTES.txt
来向图表用户发送安装后说明。