Как вытащить переменные среды с помощью диаграмм Helm

У меня есть файл deployment.yaml в каталоге шаблонов диаграмм 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"
...
...

Как я могу вывести значение USERNAME и PASSWORD из локальных переменных окружения, когда я запускаю рулевое управление?

Это возможно? Если да, то как это сделать?

Ответ 1

Вы можете export использовать переменную и использовать ее во время работы helm install.

Перед этим вам нужно изменить диаграмму, чтобы при установке ее значение могло быть set.

Пропустите эту часть, если вы уже знаете, как настроить поля шаблона.


Поскольку вы не хотите раскрывать данные, лучше сохранить их как секретные в kubernetes.

Прежде всего, добавьте эти две строки в файл 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,

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

Если вы запустите этот helm install в режиме dry-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 об этом также идет обсуждение. Вы можете увидеть эту проблему, чтобы узнать обо всех других способах использования переменных среды.

Ответ 2

Я предполагаю, что вопрос в том, как искать переменную env внутри диаграммы, просматривая переменные env самостоятельно, а не передавая это с --set.

например: я установил ключ "my_db_password" и хочу изменить значения, посмотрев на значение в переменной evn, не поддерживается.

я не очень уверен в шаблоне GO, но я думаю, что это отключено, как они объясняют в документации руля. "Мы удалили две из соображений безопасности: env и extedenv (что дало бы авторам диаграмм доступ к среде Tillers)". https://helm.sh/docs/developing_charts/#know-your-template-functions