Kubernetes: ссылка на ранее определенную пару ключ-значение ConfigMap - PullRequest
0 голосов
/ 09 ноября 2018

TL; DR

Могу ли я сослаться на ранее определенную пару ключ-значение в ConfigMap?

Полная версия

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

[me@myserver ~]$ cat ./myenv.sh
export FOO=foo
export BAR=bar
export FOOBAR=$FOO$BAR
[me@myserver ~]$ . ./myenv.sh
[me@myserver ~]$ printenv FOOBAR
foobar

Тем не менее, аналогичный способ сделать это в ConfigMap путем ссылки ранее определенные пары ключ-значение не работают (см. пример ConfigMap и Pod, ниже). Вот результаты:

[me@myserver ~]$ kubectl create -f my-app-config.yaml -f my-app-pod.yaml
configmap "my-app" created
pod "my-app" created
[me@myserver ~]$ kubectl exec -it my-app -- printenv | grep MY_CONFIGMAP
MY_CONFIGMAP_FOO=foo
MY_CONFIGMAP_FOOBAR=$(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)
MY_CONFIGMAP_BAR=bar

Значение для MY_CONFIGMAP_FOOBAR рассчитано на foobar.

Я попытался применить следующие инструкции под Использовать переменные среды, определенные в ConfigMap, в командах Pod из документации:

Вы можете использовать переменные среды, определенные в ConfigMap, в command раздел спецификации Pod с использованием $(VAR_NAME) Синтаксис замещения Кубернетеса.

Однако это, очевидно, не сработало, и я не смог найти ответьте в моем исследовании.

Я подозреваю, что уже знаю ответ, но есть ли способ выполнить это?

MCVE

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app

data:
  MY_CONFIGMAP_FOO: foo
  MY_CONFIGMAP_BAR: bar

  # Desired concatenation would be `foobar`
  MY_CONFIGMAP_FOOBAR: $(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)

Pod

apiVersion: v1
kind: Pod
metadata:
  name: my-app

spec:
  containers:
  - name: my-app
    image: alpine
    imagePullPolicy: IfNotPresent
    envFrom:
      - configMapRef:
          name: my-app

    command:
      - /bin/sh

    args:
      - -c
      - "while true; do sleep 3600; done"

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Рекомендуется использовать kind: Deployment Объединение переменных прекрасно работает в этом конфигурационном файле. Я не пробовал стручки напрямую.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app

spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 1
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: alpine
        imagePullPolicy: IfNotPresent
        env:
        - name: MY_CONFIGMAP_FOOBAR
          value: $(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)
0 голосов
/ 09 ноября 2018

Вы можете достичь ожидаемого результата с помощью этого инструмента: envsubst .

Создайте ConfigMap следующим образом,

envsubst < my-app-config.yaml | kubectl apply -f -

Теперь все переменные окружения на вашем ConfigMap будут заменены на разрешенное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...