前面我们介绍了几种创建和访问命名模板的方法,这可以很容易地从一个模板中导入另一个模板,但是有的时候我们需要导入的是一个普通的文件内容而不是模板文件。就此 Helm 提供了
.Files
对象用于访问文件,其中包含了一些方法用于处理文件中的内容。如下:
- Get 方法:获取文件的所有内容
- Glob 方法:模糊匹配文件名称并返回文件列表
- Lines 方法:逐行读取文件内容
Helm 通过 .Files
对象提供对文件的访问。在我们开始使用模板示例之前,需要注意一些关于它如何工作的内容:
- 向 Helm chart 添加额外的文件是可以的。这些文件将被捆绑并发送给 Tiller。不过要注意,由于 Kubernetes 对象的存储限制,chart 必须小于 1M。
- 通常出于安全原因,某些文件不能通过
.Files
对象访问。- templates/ 无法访问文件。
- 使用 .helmignore 排除的文件不能被访问。
- chart 不保留 UNIX 模式信息,因此文件级权限在涉及 .Files 对象时不会影响文件的可用性。
1、基本示例(Basic example)
1.1 .Files
对象读取1个文件
读取readme文件
Files: |
{{- $file := .Files }}
{{- range list "README" }}
{{ . }}: |-
{{ $file.Get . }}
{{- end }}
执行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/files.yaml
---
# Source: myapp/templates/files.yaml
Files: |
README: |-
myapp by kongzi
可以看到,通过 {{. }}
命令打印出了文件的名字,{{ $files.Get . }}
打印出了文件的内容 。
1.2 .Files
对象读取多个文件
我们编写一个ConfigMap模板,从三个文件读入配置。首先,我们在chart中添加三个文件,直接放到 mychart/
目录中。
- 留意文章开头的注意事项。
config1.toml:
message = Hello from config 1
config2.toml:
message = This is config 2
config3.toml:
message = Goodbye from config 3
以上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 }}
这个配置映射使用了前几节讨论的几种技术。例如,我们创建一个 $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
2、路径助手(Path helpers)
使用文件时,对文件路径本身执行一些标准操作会很有用。为了实现这些,Helm从Go的 path包中导入了一些功能。 都使用了与Go包中一样的名称就可以访问。但是第一个字符使用了小写,比如Base
变成了base
等等。
导入的功能包括:
- Base
- Dir
- Ext
- IsAbs
- Clean
3、Glob 模式(Glob patterns)
当你的chart不断变大时,你会发现你强烈需要组织你的文件,所以我们提供了一个 Files.Glob(pattern string)
方法来使用 全局模式 的灵活性读取特定文件。
.Glob
返回一个Files类型,因此你可以在返回对象上调用任意的Files方法。
比如,假设有这样的目录结构:
foo/:
foo.txt foo.yaml
bar/:
bar.go bar.conf baz.yaml
全局模式(Glob)下您有多种选择:
{{ $currentScope := .}}
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{- with $currentScope}}
{{ .Files.Get $path }}
{{- end }}
{{ end }}
或
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
4、ConfigMap 和 Secrets 工具函数(在Helm 2.0.2及后续版本可用)
想要将文件内容放置到 configmap 和 secret 中非常常见,以便在运行时安装/挂载到你的pod上。为了解决这个问题,我们提供了一些基于Files类型的实用方法。
- 为了进一步组织文件,这些方法结合
Glob方法
使用时尤其有用。
上面的文件结构使用 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 }}
5、编码(Encoding)
您可以导入一个文件并使用模板的 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
6、文件行(Lines)
有时需要访问模板中的文件的每一行。Lines
为此提供了一种方便的方法。你可以使用range方法遍历Lines:
data:
some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
{{ . }}{{ end }}
在 helm install
过程中无法将外部文件传递给 chart
。因此如果你想请求用户提供数据,必须使用 helm install -f
或 helm install --set
加载。
该部分讨论整合了我们对编写Helm模板的工具和技术的深入研究。下个章节我们会看到如何使用特殊文件
templates/NOTES.txt
, 向chart的用户发送安装后指导。
评论区