Передать строку json в переменную среды в развертывании k8s для Envoy

У меня есть развертывание K8s с одним модулем, работающим среди других, контейнером с Envoy sw. Я определил изображение таким образом, что если определена переменная среды EXTRA_OPTS, она будет добавлена ​​в командную строку для запуска Envoy. Я хочу использовать эту переменную для переопределения конфигурации по умолчанию, как описано в https://www.envoyproxy.io/docs/envoy/latest/operations/cli#cmdoption-config-yaml

Переменная среды работает нормально для других параметров команды, например, «-l отладка». Кроме того, я протестировал ожидаемую финальную командную строку, и она работает.

Dockerfile настроил запуск Envoy следующим образом:

CMD ["/bin/bash", "-c", "envoy -c envoy.yaml $EXTRA_OPTS"]

Я хочу установить это:

       ...
      - image: envoy-proxy:1.10.0
        imagePullPolicy: IfNotPresent
        name: envoy-proxy
        env:
           - name: EXTRA_OPTS
             value: ' --config-yaml "admin: { address: {  socket_address: { address: 0.0.0.0, port_value: 9902 } } }"'
        ...

Я успешно протестировал запущенный посланник с последней командной строкой:

envoy -c /etc/envoy/envoy.yaml --config-yaml "admin: { address: {  socket_address: { address: 0.0.0.0, port_value: 9902 } } }"

Еще я протестировал «более простой» вариант в EXTRA_OPTS, и он работает:

       ...
      - image: envoy-proxy:1.10.0
        imagePullPolicy: IfNotPresent
        name: envoy-proxy
        env:
           - name: EXTRA_OPTS
             value: ' -l debug'
        ...

Я бы ожидал, что Envoy будет работать с этим новым портом администратора, вместо этого у меня возникают ошибки параметров:

PARSE ERROR: Argument: {
             Couldn't find match for argument

Похоже, что кавычки не передаются в фактическую переменную Environment в контейнер ...

Любая подсказка ???

Спасибо всем


person Alicia Factor    schedule 07.08.2019    source источник


Ответы (1)


Вы должны установить ["/bin/bash", "-c", "envoy -c envoy.yaml"] как ENTRYPOINT в вашем файле докеров или использовать command в кубернетах, а затем использовать args для добавления дополнительных аргументов.

Дополнительную информацию можно найти в документации по докеру.

Поясню на примере:

$ docker build -t fl3sh/test:bash .

$ cat Dockerfile
FROM ubuntu
RUN echo '#!/bin/bash' > args.sh && \
    echo 'echo "$@"' >> args.sh && \
    chmod -x args.sh
CMD ["args","from","docker","cmd"]
ENTRYPOINT ["/bin/bash", "args.sh", "$ENV_ARG"]
cat args.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: args
  name: args
spec:
  containers:
  - args:
    - args
    - from
    - k8s
    image: fl3sh/test:bash
    name: args
    imagePullPolicy: Always
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Output:
pod/args $ENV_ARG args from k8s
cat command-args.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: command-args
  name: command-args
spec:
  containers:
  - command:
    - /bin/bash
    - -c
    args:
    - 'echo args'
    image: fl3sh/test:bash
    imagePullPolicy: Always
    name: args
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Output:
pod/command-args args
cat command-env-args.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: command-env-args
  name: command-env-args
spec:
  containers:
  - env:
    - name: ENV_ARG
      value: "arg from env"
    command:
    - /bin/bash
    - -c
    - exec echo "$ENV_ARG"
    image: fl3sh/test:bash
    imagePullPolicy: Always
    name: args
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Output:
pod/command-env-args arg from env
cat command-no-args.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: command-no-args
  name: command-no-args
spec:
  containers:
  - command:
    - /bin/bash
    - -c
    - 'echo "no args";echo "$@"'
    image: fl3sh/test:bash
    name: args
    imagePullPolicy: Always
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Output:
pod/command-no-args no args

#notice ^ empty line above  
cat no-args.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: no-args
  name: no-args
spec:
  containers:
  - image: fl3sh/test:bash
    name: no-args
    imagePullPolicy: Always
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Output:
pod/no-args $ENV_ARG args from docker cmd

Если вам нужно воссоздать мой пример, вы можете использовать этот цикл, чтобы получить такой результат, как указано выше:

for p in `kubectl get po -oname`; do echo cat ${p#*/}.yaml; echo ""; \
cat ${p#*/}.yaml; echo -e "\nOutput:"; printf "$p "; \
kubectl logs $p;echo "";done

Заключение, если вам нужно передать env в качестве аргументов, используйте:

    command:
    - /bin/bash
    - -c
    - exec echo "$ENV_ARG"

Надеюсь, теперь все понятно.

person FL3SH    schedule 07.08.2019
comment
Спасибо, но это именно то, что я делаю, не так ли? - person Alicia Factor; 07.08.2019
comment
Нет, вы используете CMD вместо ENTRYPOINT, прочтите связанный документ, чтобы найти защиту. - person FL3SH; 07.08.2019
comment
Привет, спасибо за подробные и исчерпывающие примеры. Но это не работает для меня, или я не получил объяснения. Я внес изменения, как вы предлагали, и пробовал разные комбинации, но либо я получаю буквально $ EXTRA_OPTS, либо я переопределил ENTRYPOINT с помощью команды, которую я ввел, но я не хочу этого, и, как я объяснил, я могу установить переменные Env, но по какой-то причине цитаты отсутствуют. К сожалению (или нет, это зависит от обстоятельств) я буду в отпуске на 6 недель, и я не думаю, что смогу продолжить тестирование. Спасибо за ваше время - person Alicia Factor; 09.08.2019
comment
Просто опубликуйте, что вы сделали - person FL3SH; 09.08.2019
comment
Если вы все еще не можете это сделать, значит, мой ответ все еще требует доработки. - person FL3SH; 09.08.2019