Создание чартов helm
Ошибка parse error at ...: bad character U+002D '-'
Такое происходит, если в имени параметра в values.yaml есть символ “-”.
Если переименовать параметр невозможно, то подставлять его следует с помощью конструкции index:
{{ index .Values "mysub-chart" "servicename" }}
Определение значений values.yaml через уже известные значения
https://github.com/helm/helm/issues/2492
https://github.com/helm/helm/issues/2492#issuecomment-589699208
Например, у меня есть чарт, который разворачивает кластер Elasticsearch с помощью Elasticsearch Operator. В составе этого чарта есть subchart, который разворачивает logstash.
В конфигурацию logstash должны попасть путь к elasticsearch и пароль для basic-аутентификации. FQDN-имя, по которому будет доступен Elastic формируется при разворачивании кластера и включает в себя имя релиза ( .Release.Name ), а пароль хотелось бы задать один раз, в одном месте в едином файле values.yaml!
Задача - сделать так, чтобы значения, определенные для кластера elasticsaerch стали доступны для logstash с минимальными изменениями в коде чарта logstash, а лучше даже и без них!
values.yaml
global: internalElasticUserPassword: AG7dGmsZp2NDpRED # пароль, который будет установлен для встроенного пользователя elastic. # Он будет использован как минимум дважды. Первый раз - при создании секрета с паролем пользователя в основном чарте кластера elasticsearch. # И второй раз - для создания переменной окружения logstash, которая будет использована в конфигурации output. #..... logstash: image: tag: |- {{ .Chart.AppVersion }} config: ELASTIC_PASSWORD: |- {{ tpl (printf "%s" .Values.global.internalElasticUserPassword) $ }} queue.max_bytes: 1gb queue.type: memory elasticsearch: host: |- {{ tpl (printf "%s%s%s%s" .Release.Name "-es-http." .Release.Namespace ".svc.cluster.local" ) $ }} port: 9200 outputs: main: |- output { elasticsearch { hosts => ["${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}"] index => "etl-%{+YYYY.MM.dd}" user => "elastic" password => "${ELASTIC_PASSWORD}" ssl => true ssl_certificate_verification => false } }
а в statefullset.yaml субчарта logstash приводим соответствующие строки к такому виду:
- name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}" ## Elasticsearch output - name: ELASTICSEARCH_HOST value: {{ tpl (.Values.elasticsearch.host | toString) . | quote }} #### {{- range $key, $value := .Values.config }} - name: {{ $key | upper | replace "." "_" }} value: {{ tpl ($value | toString ) $ | quote }} {{- end }}
То есть строки, указанные в values интерпретируются с помощью функции tpl.
templating in values hack
Например, у меня есть набор volumes, которые я хотел бы добавить к deployment, в именах которых присутствует название релиза - release.name. Стандартными средствами helm не позволяет темплейтинг в values.yaml, поэтому можно применить такой хак:
В темплейте deployment'а пишем такое:
{{- if .Values.volumes }} {{- with .Values.volumes }} {{/* volumes: {{ toYaml .Values.volumes | nindent 8 }}*/}} volumes: {{- tpl . $ | nindent 8 }} {{- end }} {{- end }}
а в values пишем такое:
volumes: | - name: volume1 configMap: name: {{ .Release.Name }}-config1 - name: volume2 configMap: name: {{ .Release.Name }}-config2 - name: volume3 configMap: name: {{ .Release.Name }}-config3
В итоге - в deployment попадут
Discussion