Передача уменьшенного yaml в качестве аргумента для задания kubernetes

#kubernetes #yaml #kubectl

#kubernetes #yaml #kubectl

Вопрос:

Вот упрощенная версия конфигурации YAML задания kubernetes, которую я обычно использую:

 apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  template:
    spec:
      containers:
      - name: mycontainer
        image: me/mycontainer:latest
        command: ["bash", "-c"]
        args:
          - python -u myscript.py
              --param1 abc
              --param2 xyz
  

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

 apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  template:
    spec:
      containers:
      - name: mycontainer
        image: me/mycontainer:latest
        command: ["bash", "-c"]
        args:
          - python -u myscript.py
              --param_minified_yaml "{key: value}"
  

Этот бит встроенного уменьшенного yaml анализируется kubectl и вызывает: error: error parsing STDIN: error converting YAML to JSON: yaml: line 26: mapping values are not allowed in this context

Как можно экранировать встроенный yaml args: таким образом, чтобы он передавался как чисто текстовый аргумент?

Ответ №1:

Если уменьшенный yaml (или строка аргументов в целом) не содержит одинарных кавычек, вы можете заключить в них всю командную строку:

 apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  template:
    spec:
      containers:
      - name: mycontainer
        image: me/mycontainer:latest
        command: ["bash", "-c"]
        args:
          - 'python -u myscript.py
              --param_minified_yaml "{key: value}"'
  

Если строка аргументов содержит одинарные кавычки includes, строка аргументов может быть передана как многострочная строка YAML:

 apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  template:
    spec:
      containers:
      - name: mycontainer
        image: me/mycontainer:latest
        command: ["bash", "-c"]
        args:
          - >-
            python -u myscript.py
            --param_minified_yaml "{key: 'value'}"
  

Комментарии:

1. Внимательно следите за отступом текста блока, добавление дополнительных пробелов к тому --param_minified_yaml , что было в исходном примере, добавит символы новой строки. Мне потребовалось несколько минут, чтобы разобраться. Кроме этого, это отлично работает!

Ответ №2:

Здесь можно использовать скаляр блока:

         args:
          - >
            python -u myscript.py
              --param_minified_yaml "{key: value}"

  

Попробуйте различные скалярные форматы в валидаторе или конвертере yaml, чтобы узнать об их различиях.

Ответ №3:

bash -c Оболочка помещает всю фактическую команду в один аргумент, а затем приводит к проблемам с экранированием и цитированием. Если вам действительно не нужно вызывать оболочку (возможно, для интерполяции переменных среды), лучше удалить ее. Тогда command: это список слов; вы несете ответственность за разбиение команды на отдельные слова, но, наоборот, вы можете использовать любой допустимый синтаксис YAML для каждого отдельного слова.

Итак, здесь я мог бы написать:

 command:
  - python
  - -u
  - myscript.py
  - --param_minified_yaml
  - '{key: value}'         # in quotes, so it is a YAML string
  

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

 command:
  - ...
  - --param_minified_yaml
  - >-                     # block scalar syntax, again makes a string
      {key: value}