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 будет чист, твоя совесть спокойна, а пароли — в безопасности.