在模板内部访问文件

    Helm 提供了通过对象访问文件的方法。不过,在我们使用模板示例之前,有些事情需要注意:

    • 可以添加额外的文件到chart中。虽然这些文件会被绑定。但是要小心,由于Kubernetes对象的限制,Chart必须小于1M。
    • 通常处于安全考虑,一些文件无法通过.Files对象访问:
      • 无法访问templates/中的文件
      • 无法访问使用.helmignore排除的文件
    • Chart不能保留UNIX模式信息,因此当文件涉及到.Files对象时,文件级权限不会影响文件的可用性。

    • 基本示例

    • 全局模式
    • 编码

    先不管警告,我们来写一个读取三个文件到配置映射ConfigMap的模板。开始之前,我们会在chart中添加三个文件, 直接放到mychart/目录中。

    config1.toml:

    config2.toml:

    1. message = This is config 2

    config3.toml:

    1. message = Goodbye from config 3

    每个都是简单的TOML文件(类似于windows老式的INI文件)。我们知道这些文件的名称,因此我们使用range功能遍历它们并将它们的内容注入到我们的ConfigMap中。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. data:
    5. {{- $files := .Files }}
    6. {{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
    7. {{ . }}: |-
    8. {{ $files.Get . }}
    9. {{- end }}

    这个配置映射使用了之前章节讨论过的技术。比如,我们创建了一个$files变量来引用.Files对象。我们也使用了tuple方法创建了一个可遍历的文件列表。 然后我们打印每个文件的名字(),然后通过{{ $files.Get . }}打印文件内容。

    Path helpers

    使用文件时,对文件路径本身执行一些标准操作会很有用。为了实现这些,Helm从Go的 包中导入了一些功能。 都使用了与Go包中一样的名称就可以访问。但是第一个字符使用了小写,比如Base变成了base等等。

    导入的功能包括:

    • Base
    • Dir
    • Ext
    • IsAbs
    • Clean

    当你的chart不断变大时,你会发现你强烈需要组织你的文件,所以我们提供了一个 Files.Glob(pattern string)方法来使用 全局模式的灵活性读取特定文件。

    .Glob返回一个Files类型,因此你可以在返回对象上调用任意的Files方法。

    比如,假设有这样的目录结构:

    1. foo/:
    2. foo.txt foo.yaml
    3. bar/:
    4. bar.go bar.conf baz.yaml

    全局模式下您有多种选择:

    1. {{ $currentScope := .}}
    2. {{ range $path, $_ := .Files.Glob "**.yaml" }}
    3. {{- with $currentScope}}
    4. {{ .Files.Get $path }}
    5. {{- end }}
    6. {{ end }}

    Or

    1. {{ $.Files.Get $path }}
    2. {{ end }}

    ConfigMap and Secrets utility functions

    (在Helm 2.0.2及后续版本可用)

    把文件内容放入配置映射和密钥是很普遍的功能,为了运行时挂载到你的pod上。为了实现它,我们提供了一些基于Files类型的实用方法。

    上面的文件结构使用 Glob时的示例如下:

    您可以导入一个文件并使用模板的base-64方式对其进行编码来保证成功传输:

    1. apiVersion: v1
    2. metadata:
    3. name: {{ .Release.Name }}-secret
    4. type: Opaque
    5. data:
    6. token: |-
    7. {{ .Files.Get "config1.toml" | b64enc }}

    上面的内容使用我们之前使用的相同的config1.toml文件进行编码:

    1. # Source: mychart/templates/secret.yaml
    2. apiVersion: v1
    3. kind: Secret
    4. metadata:
    5. name: lucky-turkey-secret
    6. type: Opaque
    7. data:
    8. token: |-
    9. bWVzc2FnZSA9IEhlbGxvIGZyb20gY29uZmlnIDEK

    Lines

    有时需要访问模板中的文件的每一行。我们提供了一个方便的Lines方法。

    你可以使用range方法遍历Lines

    1. data:
    2. some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
    3. {{ . }}{{ end }}

    helm install过程中无法将文件传递到chart外。因此如果你想请求用户提供数据,必须使用helm install -f或加载。

    该部分讨论整合了我们对编写Helm模板的工具和技术的深入研究。下个章节我们会看到如何使用特殊文件templates/NOTES.txt, 向chart的用户发送安装后的说明。

    Prev← 创建一个NOTES.txt文件