Кубернетес: Как ссылаться на одну переменную среды из другой?

У меня есть Deployment объект, где я выставляю POD ID, используя Downward API. Это отлично работает. Однако я хочу установить другую переменную env, путь к журналу, со ссылкой на идентификатор POD. Но, установив значение этой переменной в /var/log/mycompany/${POD_ID}/logs не работает, журналы не создаются в контейнере. Я могу сделать скрипт точки входа или приложение осведомленным об идентификаторе POD и создать путь к журналу, но я бы предпочел этого не делать.

4 ответа

Решение

Правильный синтаксис должен использовать $(FOO), как описано в v1.EnvVar value: документация; Синтаксис, который вы использовали, является синтаксисом "оболочки", который не использует kubernetes для интерполяции переменных. Так:

containers:
- env:
  - name: LOG_PATH
    value: /var/log/mycompany/$(POD_ID)/logs
  - name: POD_ID
    valueFrom: # etc etc

Я просто хотел бы добавить к этому вопросу оговорку, с которой мы столкнулись на днях. По документации:

Ссылки на переменные $(VAR_NAME) раскрываются с использованием ранее определенных переменных среды в контейнере и любых переменных среды службы. Если переменная не может быть разрешена, ссылка во входной строке останется неизменной.

Акцент мой. Если у вас есть

  - name: POD_ID
    valueFrom: # etc etc
  - name: LOG_PATH
    value: /var/log/mycompany/$(POD_ID)/logs

это будет работать, но если у вас есть

  - name: LOG_PATH
    value: /var/log/mycompany/$(POD_ID)/logs
  - name: POD_ID
    valueFrom: # etc etc

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

                - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: LOG_FILE_NAME
            value: "/app/log/$(POD_NAME).log"

Вот еще один пример

                - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: REACT_APP_DB_URI
            value: "http://api-$(POD_NAMESPACE).org.com"

Ключ зависимой переменной должен быть определен позже

Обратитесь к этому для более подробной информации

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

      kubectl create secret generic jwt-secret --from-literal=JWT_KEY=my_awesome_jwt_secret_code
      spec:
      containers:
        - name: auth
          image: lord/auth
          env:
            - name: MONGO_URI
              value: "mongodb://auth-mongo-srv:27017/auth"
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY
       process.env.MONGO_URI
 process.env.JWT_KEY
Другие вопросы по тегам