Экранирование руля yml для развертывания - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь выяснить, как избежать этих частей файла yml для использования с helm.

            - name: SYSLOG_TAG
              value: '{{ index .Container.Config.Labels "io.kubernetes.pod.namespace" }}[{{ index .Container.Config.Labels "io.kubernetes.pod.name" }}]'
            - name: SYSLOG_HOSTNAME
              value: '{{ index .Container.Config.Labels "io.kubernetes.container.name" }}'

Файл yml представляет собой DaemonSet для отправки журналов на papertrail с инструкциями по стандартному развертыванию kubernetes вручную https://help.papertrailapp.com/kb/configuration/configuring-centralized-logging-from-kubernetes/. Вот ссылка на полный файл yml https://help.papertrailapp.com/assets/files/papertrail-logspout-daemonset.yml.

Я нашел несколько ответов о том, как избежать фигурных скобок и кавычек, но все еще не могу заставить его работать. Было бы проще, если бы был какой-то способ получить helm, чтобы не оценивать каждое целое значение.

Последнее, что я попробовал, было это, но оно все равно приводит к ошибке.

              value: ''"{{" index .Container.Config.Labels \"io.kubernetes.pod.namespace\" "}}"["{{" index .Container.Config.Labels \"io.kubernetes.pod.name\" "}}"]''
            - name: SYSLOG_HOSTNAME
              value: ''"{{" index .Container.Config.Labels \"io.kubernetes.container.name\" "}}"''

Это ошибка:

Error: UPGRADE FAILED: YAML parse error on templates/papertrail-logspout-daemonset.yml: error converting YAML to JSON: yaml: line 21: did not find expected key

Я могу жестко запрограммировать значения для обоих из них, и это прекрасно работает. Я не совсем понимаю, как работают эти переменные env, но происходит то, что журналы отправляются на papertrail для каждого модуля в узле с метками от каждого из этих модулей. Пространство имен, имя модуля и имя контейнера.

          env:
            - name: ROUTE_URIS
              value: "{{ .Values.backend.log.destination }}"
{{ .Files.Get "files/syslog_vars.yaml" | indent 13 }}

1 Ответ

2 голосов
/ 25 июня 2019

На ум приходят два разумных подхода.

Одним из них является определение шаблона, который расширяется до строки {{, после чего вы можете использовать его в расширении переменной. Вам не нужно специально бежать }}.

{{- define "cc" }}{{ printf "{{" }}{{ end -}}
- name: SYSLOG_HOSTNAME
  value: '{{cc}} index .Container.Config.Labels "io.kubernetes.container.name" }}'

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

# I am files/syslog_vars.yaml
- name: SYSLOG_HOSTNAME
  value: '{{ index .Container.Config.Labels "io.kubernetes.container.name" }}'

Тогда вы можете включить файл . Это не относится к шаблонам в файле, оно просто читает его как буквальный текст.

env:
{{ .Files.Get "files/syslog_vars.yaml" | indent 2 }}

Важным моментом этого последнего метода и проблемой, с которой вы столкнулись в этом вопросе, является то, что Хелм читает произвольный файл, раскрывает все шаблоны и затем пытается интерпретировать полученный текст как YAML. Часть indent 2 должна соответствовать тому, что есть у остальной части вашего блока env:; если это глубоко внутри спецификации развертывания, может потребоваться 8 или 10 пробелов. helm template отобразит диаграмму в текст, не пытаясь выполнить дополнительную обработку, что действительно полезно для отладки.

...