Создание чартов 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