我有Deployment
个对象,我使用Downward API公开POD ID。这很好。但是,我想设置另一个env变量,日志路径,参考POD ID。但是,将该变量值设置为/var/log/mycompany/${POD_ID}/logs
并不起作用,不会在容器中创建日志。
我可以使入口点脚本或应用程序知道POD ID,并建立日志路径,但我宁愿不这样做。
答案 0 :(得分:16)
正确的语法是使用$(FOO)
,如v1.EnvVar value:
documentation中所述;您使用的语法是“shell”语法,这不是kubernetes插入变量的方式。所以:
containers:
- env:
- name: POD_ID
valueFrom: # etc etc
- name: LOG_PATH
value: /var/log/mycompany/$(POD_ID)/logs
另请注意,如文档中所述,必须在引用它的变量之前定义要扩展的变量。
答案 1 :(得分:5)
我想补充一下这个问题,前几天我们遇到了一个警告。根据{{3}}:
使用容器中的先前定义的环境变量和任何服务环境变量来扩展变量引用$(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
不会。如果您使用模板引擎生成规范,请当心。
答案 2 :(得分:0)
这是一个读取 metadata.name
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: LOG_FILE_NAME
value: "/app/log/$(POD_NAME).log"
这是另一个例子,它读取 metadata.namespace
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: REACT_APP_DB_URI
value: "http://api-$(POD_NAMESPACE).org.com"
再举一个例子,演示如何读取 metadata.labels
- name: SRVC_NAME
valueFrom:
fieldRef:
fieldPath: metadata.labels['app']
- name: LOG_FILE_NAME
value: '/app/log/$(SRVC_NAME).log'
关键是因变量应该稍后定义
请参阅this了解更多详情
答案 3 :(得分:0)
您也可以先添加一个秘密,然后将新创建的秘密使用到您无数的部署文件中,以共享具有值的相同环境变量:
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