Errors
Kubernetes

Kubernetes: How to pull environment variables with Helm charts

Ты захардкодил секреты прямо в `deployment.yaml` в шаблоне Helm. Закомитил это. Или того хуже — уже задеплоил. И теперь с ужасом понимаешь, что пароль на проде

Ты захардкодил секреты прямо в deployment.yaml в шаблоне Helm. Закомитил это. Или того хуже — уже задеплоил. И теперь с ужасом понимаешь, что пароль на проде красуется в гите как на ладони. Мысли о смене профессии проносятся в голове. Успокойся, всё поправимо.

Helm как раз для того и создан, чтобы выносить такие значения наружу, а не держать их в темплейтах. Но просто так он переменные окружения с твоей машины не подхватит — ему нужно явно указать, что куда подставлять.

Откуда Helm берет значения

Всё крутится вокруг values.yaml. Это твой главный файл конфигурации для чарта. Туда ты выносишь всё, что может меняться: версии образов, порты, и конечно, чувствительные данные.

Добавь в свой values.yaml (обычно лежит в корне чарта) два поля:

username: "app-username"
password: "28sin47dsk9ik"

Теперь нужно сделать две вещи: создать Kubernetes Secret из этих значений и научить подтягивать из него переменные окружения.

Готовим Secret

В папке templates/ создай файл secret.yaml. Его содержимое будет примерно таким:

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

Обрати внимание на | b64enc. Helm сам закодирует твои строки в base64, это требование Kubernetes для данных внутри Secret.

Меняем Deployment

Теперь правим deployment.yaml. В секции env вместо прямого value используем valueFrom, ссылаясь на созданный секрет.

...
env:
  - name: "USERNAME"
    valueFrom:
      secretKeyRef:
        key: username
        name: {{ .Release.Name }}-auth
  - name: "PASSWORD"
    valueFrom:
      secretKeyRef:
        key: password
        name: {{ .Release.Name }}-auth
...

Магия шаблонизации Helm ({{ .Release.Name }}-auth) подставит правильное имя секрета, которое будет уникально для этого релиза.

Как теперь передать свои значения

Вот тут и приходит ответ на главный вопрос. Ты экспортируешь переменные на своей машине и передаёшь их Helm при установке или апдейте.

export USERNAME="my-secret-user"
export PASSWORD="real-strong-password"

helm install my-release ./my-chart \
  --set username="$USERNAME" \
  --set password="$PASSWORD"

Ключевой момент — флаг --set. Он переопределяет значение, указанное в values.yaml, на то, что ты передаёшь. Таким образом, твои локальные переменные окружения попадают в секрет, а сам чарт в гите остается чистым, без чувствительных данных.

Можно пойти дальше и не экспортировать переменные, а просто передавать их напрямую в команде, или использовать файл values (например, prod-secrets.yaml), который добавлен в .gitignore.

helm install my-release ./my-chart -f prod-secrets.yaml

Итог: выноси значения в values, упаковывай секреты в Kubernetes Secret, а при деплое подставляй нужные данные через --set или файлы. Git будет чист, твоя совесть спокойна, а пароли — в безопасности.