Передать переменную, значение которой содержит двойные кавычки ("), в контейнер из развертывания K8s.

Я пытаюсь развернуть программное обеспечение экспортера статистики (https://github.com/prometheus/statsd_exporter) как докер-контейнер в кластере K8s. Однако я хочу, чтобы некоторые параметры можно было настраивать. Для этого я передаю некоторые аргументы контейнеру через развертывание K8s в формате yaml. Когда эти аргументы не содержат символа двойных кавычек ("), все работает нормально. Однако, если желаемое значение введенных переменных содержит двойные кавычки, K8s интерпретирует их неправильно (нечто подобное описано в Передать строку json в переменную среды в развертывании k8s для Envoy). Я хочу установить аргумент --statsd.listen-tcp=":<port>", и я использую command и args в развертывании K8s:

- name: statsd-exporter
  image: prom/statsd-exporter:v0.12.2
    ...
  command: ["/bin/statsd_exporter"]
  args: ['--log.level="debug"', '--statsd.listen-tcp=":9999"']

Когда я развертываю его в K8s и проверяю содержимое «запущенного» развертывания, все кажется правильным:

command:
- /bin/statsd_exporter
args:
- --log.level="debug"
- --statsd.listen-tcp=":9999"

Однако контейнер не запускается, что дает следующую ошибку:

time="..." level=fatal msg="Unable to resolve \": lookup \": no such host" source="main.go:64"

Я думаю, что K8s пытается «убрать» двойные кавычки и передает их, добавляя обратную косую черту в контейнер, поэтому последний не может их понять. Я также пытался записать args как

args: ["--log.level=\"debug\"", "--statsd.listen-tcp=\":9999\""]

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

Есть идеи относительно какого-то возможного решения?

Спасибо!


person Salvador Foradada    schedule 06.11.2019    source источник
comment
Как насчет того, чтобы заменить двойные кавычки одинарными или вообще не использовать кавычки? Похоже, что " передается как строка \" (экранированная "), и приложение пытается разрешить эту строку как имя хоста. Когда эти аргументы не содержат символа двойных кавычек (), все работает нормально. Есть ли какая-то особая причина, по которой вам нужно использовать двойные кавычки? Вы пробовали использовать флаг --statsd.listen-tcp=, указав полное имя хоста с портом без кавычек?   -  person mario    schedule 07.11.2019


Ответы (1)


Согласно исходному коду, statsd-exporter использует kingpin для командной строки и парсера флагов. Если я не ошибаюсь, вора в законе не требует, чтобы значения заключались в двойные кавычки.

Предлагаю попробовать:

- name: statsd-exporter
  image: prom/statsd-exporter:v0.12.2
    ...
  command: ["/bin/statsd_exporter"]
  args:
  - --log.level=debug
  - --statsd.listen-tcp=:9999

Причина в том, что в соответствии с исходным кодом здесь , входное значение для statsd.listen-tcp разделено на хост и порт, и кажется, что хост в сообщении об ошибке получает значение символа двойной кавычки ".

person apisim    schedule 06.11.2019
comment
@SalvadorForadada, это ответ на ваш вопрос? Вы пробовали это решение? - person mario; 15.03.2021