переопределение значений в под-диаграммах kubernetes helm

Я создаю контрольную диаграмму для своего приложения и использую stable/nginx-ingress в качестве поддиаграммы. У меня есть единственный файл overrides.yml, который содержит (среди других переопределений):

nginx-ingress:
  controller:
    annotations:
      external-dns.alpha.kubernetes.io/hostname: "*.{{ .Release.Name }}.mydomain.com"

Итак, я пытаюсь использовать название выпуска в файле переопределений, и моя команда выглядит примерно так: helm install mychart --values overrides.yml, но полученная аннотация не выполняет интерполяцию переменных, а вместо этого приводит к чему-то вроде

Annotations: external-dns.alpha.kubernetes.io/hostname=*.{{ .Release.Name }}.mydomain.com

Я установил поддиаграмму, используя helm fetch, и у меня сложилось (ошибочное?) Впечатление, что было бы лучше оставить извлеченную вещь как есть и переопределить значения в ней, однако, если интерполяция переменных недоступна с этим , мне придется поместить свои значения в values.yaml поддиаграммы.

Есть ли лучший способ для этого? Можно ли поместить мои собственные значения в values.yaml выбранной поддиаграммы? Если я когда-нибудь снова helm fetch эту поддиаграмму, мне придется вернуть эти значения вручную, вместо того, чтобы оставлять их в нетронутом файле переопределений ...

Заранее благодарим за любые отзывы!


person Hoopes    schedule 21.04.2018    source источник


Ответы (2)


Я обнаружил проблему на github - она ​​еще не поддерживается: https://github.com/kubernetes/helm/issues/2133

person Nick Rak    schedule 23.04.2018

Helm 3.x (4 квартал 2019 г.) теперь включает больше об этом, но только для диаграммы, а не для под-диаграммы (см. TBBle ' s комментарий)

Милан Масек добавляет как комментарий:

К счастью, в последнем руководстве Helm говорится, как этого добиться.

Уловка заключается в следующем:

  • заключая переменную в " или в блок yaml |-, и
  • затем указав его в шаблоне как {{ tpl .Values.variable . }}

Кажется, это делает Хельма счастливым.

Пример:

$ cat Chart.yaml | grep appVersion
appVersion: 0.0.1-SNAPSHOT-d2e2f42


$ cat platform/shared/t/values.yaml | grep -A2 image:
image: 
  tag: |-
    {{ .Chart.AppVersion }}


$ cat templates/deployment.yaml | grep image:
          image: "{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}"


$ helm template . --values platform/shared/t/values.betradar.yaml | grep image
          image: "docker-registry.default.svc:5000/namespace/service:0.0.1-SNAPSHOT-d2e2f42"
          imagePullPolicy: Always
      image: busybox

В противном случае выдается ошибка ..

$ cat platform/shared/t/values.yaml | grep -A1 image:
image: 
  tag: {{ .Chart.AppVersion }}

1 $ helm template . --values platform/shared/t/values.yaml | grep image
Error: failed to parse platform/shared/t/values.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Chart.AppVersion":interface {}(nil)}

Для subchart Helm TBBle добавляет в issue 2133

Решение @MilanMasek не будет работать в общем случае для поддиаграмм, потому что контекст ., переданный в tpl, будет иметь значения поддиаграммы, а не значения родительской диаграммы.

Это сработало в конкретном примере, для которого была открыта эта заявка, потому что .Release.Name должен быть одинаковым во всех подграфиках.
Это не будет работать для .Chart.AppVersion, как в примере tpl.

Было предложение поддержать tval в # 3252 для интерполяции шаблонов в файлах значений, но от него отказались в пользу системы хуков на основе lua, которая была предложена для Helm v3: # 2492 (комментарий)

Эта последняя проблема 2492 включает обходные пути, такие как этот:

Вы можете поместить заполнитель в текст, который хотите создать в шаблоне, а затем заменить этот заполнитель шаблоном, который вы хотите использовать в файлах yaml в шаблоне.

На данный момент то, что я сделал в задании CI, - это запустить шаблон helm в файле values.yaml.
Он работает довольно хорошо atm.

cp values.yaml templates/
helm template $CI_BUILD_REF_NAME ./ | sed -ne '/^# Source: 
templates\/values.yaml/,/^---/p' > values.yaml
rm templates/values.yaml

helm upgrade --install ...

Это не работает, если у вас несколько -f values.yml файлов, но я подумываю написать небольшую оболочку helm, которая запускает этот сценарий bash для каждого values.yaml файла.

fsniper снова иллюстрирует проблема:

Существует вариант использования, когда вам нужно будет передать имя развертывания в диаграммы зависимостей, где вы не можете управлять.

Например, я пытаюсь установить podAffinity для zookeeper. И у меня есть диаграмма управления приложением, которая устанавливает zookeeper в качестве зависимости.

В этом случае я передаю pod antiaffinity zookeeper через значения. Итак, в моем values.yaml файле приложений у меня есть раздел zookeeper.affinity.
Если бы у меня была возможность получить название выпуска внутри значений yaml, я бы просто установил его по умолчанию и покончил с этим.

Но теперь для каждого развертывания мне приходится переопределять это значение, что является большой проблемой.

person VonC    schedule 21.02.2020
comment
Это не будет работать с поддиаграммами, как в исходном вопросе, потому что, когда вызывается tpl, он оценивает .Chart.AppVersion в контексте поддиаграммы, а не родительской диаграммы. - person TBBle; 13.03.2020
comment
@TBBle Хорошо, спасибо за этот отзыв. Я соответственно обновил ответ и буду отслеживать эти проблемы. - person VonC; 13.03.2020