Если вы думаете о жизненном цикле этого ключа: если есть несколько реплик pod, они должны договориться о том, что это за ключ;и если вы удаляете и воссоздаете модуль, он должен использовать тот же ключ, который использовался ранее.(Быстрый поиск в Google дает несколько хороших описаний , для чего этот ключ фактически используется для ; например, если он шифрует сеансовые файлы cookie, каждая копия модуля действительно должна согласовываться.)
Это предполагает установку, в которой вы генерируете ключ один раз, сохраняете его в секрете Kubernetes и делаете его доступным для модулей.Для удобства "любая переменная в вашем файле .env
может быть переопределена внешними переменными среды" , а вы можете установить переменную среды из секретного значения .Не существует отличного способа заставить Хелма сгенерировать сам секрет способом, который будет сохранен.
Итак, соединяя эти кусочки: в вашей спецификации модуля (в вашей спецификации развертывания) вам нужно получитьПеременная окружения из секрета.
env:
- name: APP_KEY
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-{{ .Chart.Name }}"
key: app-key
Затем необходимо создать секрет для хранения ключа.
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Release.Name }}-{{ .Chart.Name }}"
data:
app-key: {{ printf "base64:%s" .Values.appKey | b64enc }}
И, наконец, создать файл, содержащий ключ.Это не должно быть отмечено как часть вашей диаграммы.
echo "appKey: $(dd if=/dev/urandom bs=32 count=1 | base64)" > values-local.yaml
Когда вы собираетесь установить свою диаграмму, используйте этот файл значений
helm install ./charts/myapp -f values-local.yaml
Есть несколько других разумных подходовэто включает в себя вставку всего файла .env
как ConfigMap или Secret, или расширение вашего образа Docker для создания этого файла самостоятельно из значений, которые передаются в него, или использование контейнера init для генерации файла перед запуском основного контейнера.Дело в том, что стручки приходят и уходят и должны иметь возможность настраивать себя при запуске;использование kubectl exec
так, как вы предлагаете, не является хорошей практикой.