web-dev-qa-db-ja.com

Helmチャートで環境変数をプルする方法

Helmを使用して実行するコンテナのいくつかの環境変数を含むHelmチャートのテンプレートディレクトリ内に、deployment.yamlファイルがあります。

ヘルムが実行されているどのマシンからでも環境変数をローカルにプルできるようにしたいので、その方法で秘密を隠すことができます。

Helmを使用してアプリケーションを実行するときに、これを渡して、環境変数をローカルで取得するにはどうすればよいですか?

ここに私のdeployment.yamlファイルの一部があります

...
...
    spec:
      restartPolicy: Always
      containers:
        - name: sample-app
          image: "sample-app:latest"
          imagePullPolicy: Always
          env:          
            - name: "USERNAME"
              value: "app-username"
            - name: "PASSWORD"
              value: "28sin47dsk9ik"
...
...

Helmを実行するときに、ローカル環境変数からUSERNAMEとPASSWORDの値を取得するにはどうすればよいですか?

これは可能ですか?はいの場合、どのようにこれを行うのですか?

30
uberrebu

export変数をhelm installの実行中に使用できます。

その前に、インストール中に値がsetになるようにチャートを変更する必要があります。

テンプレートフィールドの設定方法がわかっている場合は、この部分をスキップしてください。


データを公開したくないので、kubernetesに秘密として保存することをお勧めします。

まず、Valuesファイルにこの2行を追加して、これらの2つの値を外部から設定できるようにします。

username: root
password: password

次に、templateフォルダー内にsecret.yamlファイルを追加します。そして、このコードスニペットをそのファイルにコピーします。

apiVersion: v1
kind: Secret
metadata:
  name: {{ .Release.Name }}-auth
data:
  password: {{ .Values.password }}
  username: {{ .Values.username }}

次に、展開yamlテンプレートを微調整し、envセクションで次のように変更します。

...
...
    spec:
      restartPolicy: Always
      containers:
        - name: sample-app
          image: "sample-app:latest"
          imagePullPolicy: Always
          env:          
          - name: "USERNAME"
            valueFrom:
              secretKeyRef:
                key:  username
                name: {{ .Release.Name }}-auth
          - name: "PASSWORD"
            valueFrom:
              secretKeyRef:
                key:  password
                name: {{ .Release.Name }}-auth
...
...

--setフラグ用にテンプレートを正しく変更した場合は、環境変数を使用してこれを設定できます。

$ export USERNAME=root-user

ヘルムインストールの実行中にこの変数を使用して、

$ helm install --set username=$USERNAME ./mychart

このhelm installdry-runモードで実行すると、変更を確認できます。

$ helm install --dry-run --set username=$USERNAME --debug ./mychart
[debug] Created tunnel using local port: '44937'

[debug] SERVER: "127.0.0.1:44937"

[debug] Original chart version: ""
[debug] CHART PATH: /home/maruf/go/src/github.com/the-redback/kubernetes-yaml-drafts/helm-charts/mychart

NAME:   irreverant-meerkat
REVISION: 1
RELEASED: Fri Apr 20 03:29:11 2018
CHART: mychart-0.1.0
USER-SUPPLIED VALUES:
username: root-user

COMPUTED VALUES:
password: password
username: root-user

HOOKS:
MANIFEST:

---
# Source: mychart/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: irreverant-meerkat-auth
data:
  password: password
  username: root-user
---
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: irreverant-meerkat
  labels:
    app: irreverant-meerkat
spec:
  replicas: 1
  template:
    metadata:
      name: irreverant-meerkat
      labels:
        app: irreverant-meerkat
    spec:
      containers:
      - name: irreverant-meerkat
        image: Alpine
        env:
        - name: "USERNAME"
          valueFrom:
            secretKeyRef:
              key:  username
              name: irreverant-meerkat-auth
        - name: "PASSWORD"
          valueFrom:
            secretKeyRef:
              key:  password
              name: irreverant-meerkat-auth

        imagePullPolicy: IfNotPresent
      restartPolicy: Always
  selector:
    matchLabels:
      app: irreverant-meerkat

秘密のユーザー名のデータがroot-userに変更されていることがわかります。

この例 をgithubリポジトリに追加しました。

これに関する kubernetes/helm リポジトリにもいくつかの議論があります。 この問題 を見ると、環境変数を使用する他のすべての方法を知ることができます。

51
Maruf Tuhin

質問は、-setでこれを渡すのではなく、env変数自体を見てチャート内のenv変数を検索する方法だと思います。

たとえば、キー「my_db_password」を設定し、evn変数の値を見て値を変更したい場合はサポートされていません。

gOテンプレートについてはよくわかりませんが、ヘルムのドキュメントで説明されているように、これは無効になっていると思います。 「セキュリティ上の理由から、envとexpandenvの2つを削除しました(これにより、チャート作成者はTillerの環境にアクセスできます)。」 https://helm.sh/docs/developing_charts/#know-your-template-functions

0