2.10.7 在模板中引用文件
上文介绍了多种方式创建自定义模板,这样在其他模板中引用工具模板就非常简单了。但是有时候我们希望导入一个文件而不是模板,同时希望文件的内容不要被渲染。
Helm提供一个对象.Files去引用文件。在使用之前,我们需要注意以下3点。
·给Chart内部增加外部文件是没问题的,这些文件会被打包然后发送给Tiller,但是请注意Chart必须小于1MB,因为Kubernetes单个对象的最大限制就是1MB。
·有一些文件不能被.Files对象访问到,基本上都是因为安全的原因。
·在templates/文件夹下的文件不能被访问到。
·被.helmignore忽略的文件也不能被访问到。
·Charts并不保护UNIX权限信息,因此在文件级别的权限对于.Files是没有影响的。
1.基本示例
下面我们重新构造这个Chart。在开始编写前,先添加3个文件到这个Chart中。
config1.toml: message = Hello from config 1 config2.toml: message = This is config 2 config3.toml: message = Goodbye from config 3
以上添加的这些都是简单的toml文件,我们只要知道这些文件的名字,就可以使用range函数将它们的内容插入ConfigMapz中。
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: {{- $files := .Files }} {{- range list "config1.toml" "config2.toml" "config3.toml" }} {{ . }}: |- {{ $files.Get . }} {{- end }}
以上我们创建了一个$f iles去承载每次循环的变量,同样使用了list函数去创建一个数组,然后将每组文件的文件名打印出来,最重要就是{{$f iles.Get.}}命令,因为它是用来获取文件内容的。最终输出的结果如下所示。
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.GLOB模式
随着Chart的增长,可能需要一种更为强大的方式管理文件。Helm提供了Files.Glob(pattern string)函数,能够根据指定的文件描述返回特定的文件列表或对象。
.Glob返回的对象还是Files类型,因此用户可以调用各种Files方法。
例有如下文件结构:
foo/: foo.txt foo.yaml bar/: bar.go bar.conf baz.yaml
我们可以使用如下方法将所有以yaml结尾的文件内容罗列出来。
{{ $root := . }} {{ range $path, $bytes := .Files.Glob "**.yaml" }} {{ $path }}: |- {{ $root.Files.Get $path }} {{ end }}
3.ConfigMap和Secret的工具类
在使用文件的时候,有一个很通用的问题就是我们希望直接将某个文件的内容变成ConfigMap或Secret的配置项,如果手动去拼接会比较麻烦,Helm为了满足这个需求直接提供了针对ConfigMap和Secret的工具类,当然这些工具类也是根据Glob来实现的,下面看一个例子。
apiVersion: v1 kind: ConfigMap metadata: name: conf data: {{- (.Files.Glob "foo/*").AsConfig | nindent 2 }} --- apiVersion: v1 kind: Secret metadata: name: very-secret type: Opaque data: {{- (.Files.Glob "bar/*").AsSecrets | nindent 2 }}
这样就直接将foo/*下的文件内容转换成了ConfigMap中的key-value格式。
4.编码
在Secret中,一个非常通用的需求就是base64,Helm同样提供了非常简单的方法去base64一个文件内容。
apiVersion: v1 kind: Secret metadata: name: {{ .Release.Name }}-secret type: Opaque data: token: |- {{ .Files.Get "config1.toml" | b64enc }}
这个文件的输出结果如下。
apiVersion: v1 kind: Secret metadata: name: lucky-turkey-secret type: Opaque data: token: |- bWVzc2FnZSA9IEhlbGxvIGZyb20gY29uZmlnIDEK