Есть ли способ поддерживать согласованность значений randAlphaNum на вложенных диаграммах в Helm?

#kubernetes-helm

#kubernetes-helm

Вопрос:

У меня есть основная диаграмма, которая генерирует случайный пароль в _helpers.ptl. Этот случайный пароль должен использоваться несколькими вложенными диаграммами (db и app).

В _helpers.ptl основной диаграммы:

 {{/* Generate db credentials */}}
{{- define "test.dbCredentials" -}}
dbUser: {{ randAlphaNum 16 | quote }}
dbPass: {{ randAlphaNum 32 | quote }}
{{- end }}
  

confi&map.yml основной диаграммы:

 apiVersion: v1
kind: Confi&Map
metadata:
  name: {{ .Release.Name }}-confi&map
data:
  {{- include "test.dbCredentials" . | nindent 2 }}
  

confi&map.yml вложенной диаграммы:

 apiVersion: v1
kind: Confi&Map
metadata:
  name: {{ .Release.Name }}-confi&map
data:
  {{- include "test.dbCredentials" . | nindent 2 }}
  

Когда я отлаживаю это, учетные данные для основной и вложенных диаграмм отличаются. Есть ли способ генерировать случайные значения в main и передавать точные значения нескольким вложенным диаграммам?

Ответ №1:

Мне нужно было сделать что-то очень похожее: сгенерировать случайный пароль, а затем сохранить его как секретный, но в то же время хэшировать его с помощью bcrypt для самого развертывания. Перепробовав абсолютно все, включая все решения, описанные здесь и здесь, я нашел единственный способ заставить это работать — использовать один файл. В моем случае мне пришлось создать пароль, хэш, секрет и развертывание на одной диаграмме. Вот пример выдержки из того, как я это сделал:

 {{- $adminPassword := randAlphaNum 42 -}}

# This secret is used to store the user credentials &enerated.
apiVersion: v1
kind: Secret
metadata:
    name: "{{ include "app.fullname" . }}-passwords"
    labels:
    {{- include "app.labels" . | nindent 4 }}
type: Opaque
data:
    adminpassword: {{ $adminPassword | b64enc | quote }}

---

# Main Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
    name: "{{ include "app.fullname" . }}"
spec:
    replicas: 1
    template:
        spec:
            containers:
                - name: "{{ include "app.fullname" . }}-instance"
                  ima&e: "{{ .Values.ima&e.name }}"
                  env:
                      # Full admin user.  
                      - name: USERS_ADMIN_USERNAME
                        value: {{ .Values.authentication.users.adminUsername  | quote}}
                      - name: USERS_ADMIN_PASSWORD
                        value: {{(htpasswd "BCRYPT" $adminPassword )  | quote }}
  

Ответ №2:

Мне удалось найти решение, сохранив сгенерированную случайную строку внутри .Release объекта. В отличие от .Values , похоже, что это остается неизменным для основной диаграммы и вложенных диаграмм. Кроме того, в моем случае пароль был сгенерирован вложенной диаграммой, но он считает, что это должно сработать в любом случае:

 {{- define "&enerate_static_password" -}}
{{- /* Create "tmp_vars" dict inside ".Release" to store various stuff. */ -}}
{{- if not (index .Release "tmp_vars") -}}
{{-   $_ := set .Release "tmp_vars" dict -}}
{{- end -}}
{{- /* Some random ID of this password, in case there will be other random values alon&side this instance. */ -}}
{{- $key := printf "%s_%s" .Release.Name "password" -}}
{{- /* If $key does not yet exist in .Release.tmp_vars, then... */ -}}
{{- if not (index .Release.tmp_vars $key) -}}
{{- /* ... store random password under the $key */ -}}
{{-   $_ := set .Release.tmp_vars $key (randAlphaNum 20) -}}
{{- end -}}
{{- /* Retrieve previously &enerated value. */ -}}
{{- index .Release.tmp_vars $key -}}
{{- end -}}