web-dev-qa-db-ja.com

複数のテンプレート設定ファイルをヘルムチャートにロードするにはどうすればよいですか?

だから私はヘルムチャートを作成しようとしています。

私のテンプレートファイルには次のようなファイルがあります:

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
11
Nathan Feger

数週間前に、ファイルとテンプレートをコンテナに直接追加することで同じ問題が発生しました。

サンプル構文を探します。

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 }}

2番目のステップは、デプロイメントから参照することです。

  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 

それは今のところ実際のものです。ここには2種類のインポートがあります。

  • テンプレートなしの通常のファイル
  • 内部に動的変数を含む構成ファイル

公式ドキュメントを必ずお読みください: https://github.com/helm/helm/blob/master/docs/chart_template_guide/accessing_files.md

幸運を!

8

私は、a.json、b.json、c.jsonなどが定義済みのリストであり、すべての内容(テンプレート変数を介して値として設定するビットを除く)を知っていると想定しています。また、ファイルのコンテンツの一部のみをユーザーに公開し、ユーザーにファイルコンテンツ全体を構成させたくない場合も想定しています。 (しかし、私が間違っていると仮定し、ユーザーがファイル全体のコンテンツを設定できるようにしたい場合、@ hypnoglow からの提案 データドッグチャートに従う は私には良いようです1)もしそうなら、私はそれを行う最も簡単な方法を行うことをお勧めします:

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 {{ }}

同じディレクトリにマウントしたいと思います。クリーン度が異なるconfigmapsを使用するのは魅力的ですが、 それは同じディレクトリにマウントする場合の問題になります .Files.Globを使用してファイルを個別にロードできることもいいでしょう内容全体をconfigmapに入れなくてもファイルを参照できますが、 それができるとは思いませんが、テンプレート変数を使用できます ...ただし、次のようにできますFiles.Get @Oleg Mykolaichenkoが示唆しているように、ファイルの内容を文字列として読み取り、それをtplに渡してテンプレートエンジンに渡します https://stackoverflow.com/a/52009992/9705485 。それがより良い解決策であるため、私は誰もが彼の答えに投票することをお勧めします。私の答えはここに残しておきます。彼の提案がなぜそれほど優れているのかを説明しており、一部の人々はあまり抽象的なアプローチを好まないかもしれないからです。

0
Ryan Dawson

ディレクトリ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
0
simohe