如何将多个模板化配置文件加载到头盔图表中?

时间:2017-12-01 14:16:05

标签: kubernetes kubernetes-helm

所以我正在尝试构建一个掌舵图。

在我的模板文件中,我有一个像:

这样的文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-map
data:
{{ Do something here to load up a set of files | indent 2 }}

我的图表中有另一个目录:configmaps 其中有一组json文件,它们本身将包含模板化变量:

a.json
b.json
c.json

最后,我想在我的图表中确定我可以参考:

volumes:
   - name: config-a
     configMap:
       name: config-map
       items:
       - key: a.json
         path: a.json

3 个答案:

答案 0 :(得分:6)

几周前,我在将文件和模板直接添加到容器中时遇到了同样的问题。

查找示例语法:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configmap-{{ .Release.Name }}
  namespace: {{ .Release.Namespace }}
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
data:
  nginx_conf: {{ tpl (.Files.Get "files/nginx.conf") . | quote }}
  ssl_conf: {{ tpl (.Files.Get "files/ssl.conf") . | quote }}
  dhparam_pem: {{ .Files.Get "files/dhparam.pem" | quote }}
  fastcgi_conf: {{ .Files.Get "files/fastcgi.conf" | quote }}
  mime_types: {{ .Files.Get "files/mime.types" | quote }}
  proxy_params_conf: {{ .Files.Get "files/proxy_params.conf" | quote }}

第二步是从部署中引用它:

  volumes:
  - name: {{ $.Release.Name }}-configmap-volume
    configMap:
      name:nginx-configmap-{{ $.Release.Name }}
      items:
        - key: dhparam_pem
          path: dhparam.pem
        - key: fastcgi_conf
          path: fastcgi.conf
        - key: mime_types
          path: mime.types
        - key: nginx_conf
          path: nginx.conf
        - key: proxy_params_conf
          path: proxy_params.conf
        - key: ssl_conf
          path: ssl.conf 

现在是实际的。在这里,您可以找到两种导入类型:

  • 没有模板的常规文件
  • 内部具有动态变量的配置文件

请不要忘记阅读官方文档: https://github.com/helm/helm/blob/master/docs/chart_template_guide/accessing_files.md

祝你好运!

答案 1 :(得分:1)

包括目录config-dir/中带有{{ range ..的所有文件:

my-configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  {{- $files := .Files }}
  {{- range $key, $value := .Files }}
  {{- if hasPrefix "config-dir/" $key }} {{/* only when in config-dir/ */}}
  {{ $key | trimPrefix "config-dir/" }}: {{ $files.Get $key | quote }} {{/* adapt $key as desired */}}
  {{- end }}
  {{- end }}

my-deployment.yaml

apiVersion: apps/v1
kind: Deployment
...
spec:
  template:
    ...
    spec:
      containers:
        - name: my-pod-container
          ...
          volumeMounts:
            - name: my-volume
              mountPath: /config
              readOnly: true # is RO anyway for configMap
      volumes:
        - name: my-volume
          configMap:
            name: my-configmap
            # defaultMode: 0555 # mode rx for all

答案 2 :(得分:0)

我假设a.json,b.json,c.json等是已定义的列表,并且您知道所有内容(除了要通过模板变量设置为值的位)。我还假设您只想向用户公开文件的部分内容,而不是让用户配置整个文件的内容。 (但是,如果我认为错误,并且您确实希望用户设置整个文件内容,那么对我来说,hypnoglow的@ following the datadog chart的建议对我来说是一个好建议。)如果是这样,我建议最简单的方法是:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-map
data:
  a.json:
  # content of a.json in here, including any templated stuff with {{ }}
  b.json:
  # content of b.json in here, including any templated stuff with {{ }}
  c.json:
  # content of c.json in here, including any templated stuff with {{ }}

我猜您想将其挂载到同一目录。使用不同的configmap可能会很干净,但是that would then be a problem for mounting to the same directory.也很高兴能够使用.Files.Glob独立加载文件,从而能够引用文件而不必将整个内容放入文件中。 configmap但是I don't think you can do that and still use templated variables in them ...但是,您可以使用Files.Get来完成,以字符串形式读取文件内容,然后将其传递给tpl以通过模板引擎将其通过,如@Oleg Mykolaichenko在{{3 }}。我建议大家投票给他,因为这是更好的解决方案。我只在这里留下我的答案,因为它解释了为什么他的建议如此好,有些人可能更喜欢不太抽象的方法。