1. File 对象
Files 对象这提供对 chart 中所有非特殊文件的访问。虽然无法使用它来访问模板,但可以使用它来访问 chart 中的其他文件。请参阅 "访问文件" 部分。
- Files.Get 获取指定文件名称的文件内容
- Files.GetBytes 返回文件的二进制数组,读二进制文件时使用(例如图片)。
- Files.Glob 返回符合给定shell glob pattern的文件数组,例:
{{ .Files.Glob "*.yaml" }}
- Files.Lines 按行遍历读取文件
- Files.AsSecrets 返回文件内容的Base 64编码
- Files.AsConfig 返回文件内容对应的YAML map
Helm 提供了通过 .Files
对象访问文件的方法。不过,在我们使用模板示例之前,有些事情需要注意:
- 可以添加额外的文件到 chart 中。虽然这些文件会被绑定。但是要小心,由于 Kubernetes 对象的限制,Chart 必须小于 1M。
通常处于安全考虑,一些文件无法通过
.Files
对象访问:- 无法访问
templates/
中的文件 - 无法访问使用
.helmignore
排除的文件
- 无法访问
Chart 不能保留 UNIX 模式信息,因此当文件涉及到
.Files对
象时,文件级权限不会影响文件的可用性。
1.1. 基本示例
先不管警告,我们来写一个读取三个文件到配置映射 ConfigMap 的模板。开始之前,我们会在 chart 中添加三个文件, 直接放到 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 }}
这个配置映射使用了之前章节讨论过的技术。比如,我们创建了一个 $files
变量来引用 .Files
对象。我们也使用了 tuple 方法创建了一个可遍历的文件列表。 然后我们打印每个文件的名字( {{ . }}: |-
),然后通过 {{ $files.Get . }}
打印文件内容。
执行这个模板会生成包含了三个文件所有内容的单个配置映射:
# 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
1.2. Path 辅助对象
使用文件时,对文件路径本身执行一些标准操作会很有用。为了实现这些,Helm 从 Go 的 path 包中导入了一些功能。 都使用了与Go 包中一样的名称就可以访问。但是第一个字符使用了小写,比如 Base 变成了 base 等等。
导入的功能包括:
- Base
- Dir
- Ext
- IsAbs
- Clean
1.3. 全局模式
当你的chart不断变大时,你会发现你强烈需要组织你的文件,所以我们提供了一个 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 }}
Or
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
1.4. ConfigMap 和密钥的实用功能
(在Helm 2.0.2及后续版本可用)
把文件内容放入配置映射和密钥是很普遍的功能,为了运行时挂载到你的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 }}
1.5. 编码
您可以导入一个文件并使用模板的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
1.6. Line
有时需要访问模板中的文件的每一行。我们提供了一个方便的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的用户发送安装后的说明。