访问模板内部文件

在上一节中,我们介绍了几种创建和访问命名模板的方法。 这可以很容易地从另一个模板中导入一个模板。 但有时需要导入不是模板的文件,并注入其内容而不通过模板渲染器发送内容。

Helm通过.Files对象提供对文件的访问。 然而,在我们开始使用模板示例之前,需要注意以下几点:

  • 向您的helm chart添加额外的文件是可以的。 这些文件将被捆绑并发送给Tiller。 不过要小心。 由于Kubernetes对象的存储限制,chart必须小于1M。
  • 通常出于安全原因,某些文件无法通过.Files对象访问。
    • 模板中的文件/无法访问。
    • 使用.helmignore排除的文件无法访问。
  • chart不保留UNIX模式信息,因此文件级权限对文件的可用性没有影响。

基本实例

我们编写一个模板,将三个文件读入我们的ConfigMap。 首先,我们将三个文件添加到图表中,将所有三个文件直接放在mychart/目录中。

config1.toml:

  1. message = Hello from config 1

config2.toml:

  1. message = This is config 2

config3.toml:

  1. message = Goodbye from config 3

这些都是一个简单的TOML文件(想想老派的Windows INI文件)。 我们知道这些文件的名称,因此我们可以使用范围函数来遍历它们并将其内容注入到ConfigMap中。

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

这个配置映射使用了前几节讨论的几种技术。 例如,我们创建一个$ files变量来保存对.Files对象的引用。 我们还使用tuple函数来创建我们循环访问的文件列表。 然后我们打印每个文件名 {{ . }}:| - ,然后打印文件{{\$files.Get.}}。

运行这个模板将产生一个包含所有三个文件内容的ConfigMap:

  1. # Source: mychart/templates/configmap.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: quieting-giraf-configmap
  6. data:
  7. config1.toml: |-
  8. message = Hello from config 1
  9. config2.toml: |-
  10. message = This is config 2
  11. config3.toml: |-
  12. message = Goodbye from config 3

路径助手

在处理文件时,对文件路径本身执行一些标准操作会非常有用。 为了解决这个问题,Helm从Go的路径包中导入了许多功能供您使用。 它们都可以使用Go包中的相同名称访问,但使用小写的第一个字母。 例如,Base成为base等。

导入的功能是: -Base-Dir-Ext-IsAbs-Clean

全局路径

随着chart的增长,您可能会发现您需要更多地组织文件,因此我们提供了一个Files.Glob(模式字符串)方法来协助提取具有所有glob模式灵活性的特定文件。

.Glob返回一个文件类型,因此您可以调用返回对象上的任何文件方法。

例如,想象一下目录结构:

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

Gloob有多种选择:

  1. {{ range $path := .Files.Glob "**.yaml" }}
  2. {{ $path }}: |
  3. {{ .Files.Get $path }}
  4. {{ end }}

或者

  1. {{ range $path, $bytes := .Files.Glob "foo/*" }}
  2. {{ $path }}: '{{ b64enc $bytes }}'
  3. {{ end }}

CONFIGMAP和SECRETS实用程序功能

不存在于2.0.2或更早的版本中

想要将文件内容放入configmaps和secrets中非常常见,以便在运行时安装到您的pod中。 为了解决这个问题,我们在Files类型上提供了一些实用的方法。

为进一步组织,将这些方法与Glob方法结合使用尤其有用。

根据上面的Glob示例中的目录结构:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: conf
  5. data:
  6. {{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
  7. ---
  8. apiVersion: v1
  9. kind: Secret
  10. metadata:
  11. name: very-secret
  12. type: Opaque
  13. data:
  14. {{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}

编码

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

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: {{ .Release.Name }}-secret
  5. type: Opaque
  6. data:
  7. token: |-
  8. {{ .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方法。

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

目前,无法在helm安装期间将文件外部传递到chart。 因此,如果您要求用户提供数据,则必须使用helm install -f或helm install -set加载它。

这个讨论将我们潜入写作Helm模板的工具和技术中。 在下一节中,我们将看到如何使用一个特殊文件templates/NOTES.txt将安装后说明发送给chart用户。