Кубернетес: Как ссылаться на одну переменную среды из другой?
У меня есть 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