Kubernetes:如何从另一个环境变量中引用一个环境变量?

时间:2018-03-30 22:41:30

标签: kubernetes

我有Deployment个对象,我使用Downward API公开POD ID。这很好。但是,我想设置另一个env变量,日志路径,参考POD ID。但是,将该变量值设置为/var/log/mycompany/${POD_ID}/logs并不起作用,不会在容器中创建日志。 我可以使入口点脚本或应用程序知道POD ID,并建立日志路径,但我宁愿不这样做。

4 个答案:

答案 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