Создание чартов 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, а лучше даже и без них!

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.

Например, у меня есть набор 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 попадут

Enter your comment. Wiki syntax is allowed:
 
  • devops/helm.txt
  • Last modified: 2021/03/23 11:32
  • by admin