1. ホーム
  2. kubernetes

[解決済み] Helmチャートで環境変数を取得する方法

2022-10-20 19:07:44

質問

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

ここで、Helmを実行するマシンからローカルに環境変数を取得できるようにしたいので、その方法で秘密を隠すことができます。

Helm を使用してアプリケーションを実行するときに、どのようにこれを渡して 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の値を引き出すにはどうすればよいでしょうか?

これは可能ですか?もし可能であれば、どのようにすればよいのでしょうか?

どのように解決するのですか?

以下の方法があります。 export を実行しながら、その変数を使用することができます。 helm install .

その前に、チャートを修正して、値が set になるように修正する必要があります。

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


データを公開したくないので、kubernetesにシークレットとして保存しておくとよいでしょう。

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

username: root
password: password

ここで secret.yaml ファイルを template ファイルを作成し、そのファイルに次のコードをコピーします。

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

ここで、デプロイメントの 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 を実行する際にこの変数を使用します。

$ 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

secretのusernameのデータが root-user .

私は この例では を github リポに追加しました。

にもいくつかの議論があります。 kubernetes/helm のレポでもこの件に関して議論されています。こちらでは この問題 をご覧ください。