【问题标题】:Kubernetes: How to refer to one environment variable from another?Kubernetes:如何从另一个环境变量中引用一个环境变量?
【发布时间】:2021-05-03 21:01:39
【问题描述】:

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

【问题讨论】:

  • 能否包含您的部署配置?
  • @EricWalker 恐怕我不能,它是专有的。如果您有具体问题,我可以尝试回答。

标签: kubernetes


【解决方案1】:

正确的语法是使用$(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

另外请注意,正如文档中提到的,要扩展的变量必须在引用它的变量之前定义。

【讨论】:

  • 谢谢。当您可以制造一些新东西来迷惑人们时,为什么要保持一致。
  • Kubernetes ConfigMaps 怎么样?我尝试了该解决方案,但失败了:-(
  • @devstructor 听起来你有一个新问题;请不要劫持别人的评论帖
  • 语法是,正如我所说和链接到$() - 没有“未引用”的味道,你必须用美元括起来参考,左 - paren,标识符,右括号
【解决方案2】:

我想补充一下这个问题,这是我们前几天遇到的一个警告。根据the documentation

变量引用 $(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

不会。如果您使用模板引擎生成规范,请注意。

【讨论】:

  • 有什么方法可以标记变量以进行最后一次评估?
  • 我在尝试将环境变量重构为 dict 以解决值覆盖问题时遇到了这个问题stackoverflow.com/a/58636928/2832282
【解决方案3】:

这是一个例子,上面写着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

【讨论】:

  • 您的回答对其他回答有何影响?显然什么都没有。
  • 两件事:1)从 Kubernetes 正确链接因变量 2)实际用例,从元数据中读取,由组成。它演示了如何读取元数据并将其用作另一个因变量中的变量。
【解决方案4】:

您也可以先添加一个秘密,然后将新创建的秘密使用到您无数的部署文件中,以共享具有值的相同环境变量:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多