【问题标题】:Accessing Kubernetes "secret" environment variables from a node.js app从 node.js 应用程序访问 Kubernetes“秘密”环境变量
【发布时间】:2020-10-26 11:38:07
【问题描述】:

我有一个 node.js 应用程序正在访问这样的环境变量:

const pool = mysql.createPool({
  host: process.env.MYSQL_HOST,
  user: process.env.MYSQL_USER,
  port: process.env.MYSQL_PORT,
  password: process.env.MYSQL_PASSWORD,
  database: process.env.MYSQL_DB
});

部署是通过 Kubernetes 完成的。一些环境变量,例如 MYSQL_HOST、MYSQL_DB 以普通形式设置,然而 MYSQL_PASSWORD 是通过秘密设置的。问题是我的 node.js 应用程序可以很好地读取常规环境变量,而 MYSQL_PASSWORD 不是。但问题是,当我尝试在容器中的环境变量列表中查看 MYSQL_PASSWORD 的值时,它会显示正确的值。

以下是在部署 yaml 中设置相关环境变量的方式:

- name: MYSQL_PASSWORD
  valueFrom:
      secretKeyRef:
         key: MYSQL_PASSWORD
         name: config-secret

再一次 - 当我在容器中运行 env 命令时,该值是可见的,但由于某种原因,node.js 应用程序没有拾取它。

是否有人知道为什么我的应用会毫无问题地读取常规环境变量,但无法读取设置为机密的环境变量?

谢谢。

【问题讨论】:

  • 您能分享一下您是如何创建秘密并在部署中引用它的吗?
  • 你是如何添加其他环境变量的?是使用 ConfigMaps 还是其他机制?

标签: node.js kubernetes environment-variables


【解决方案1】:

key 应该是您在秘密中使用的一次。例如,如果您有:

kubectl create secret generic config-secret --from-literal=username=user --from-literal=password=pw

你应该按如下方式使用它:

- name: MYSQL_PASSWORD
  valueFrom:
    secretKeyRef:
      name: config-secret
      key: password

请注意,key 与环境变量名称不同。它应该是用来设置密钥的那个。

【讨论】:

  • 谢谢@Maroun,但这正是它目前的设置方式。密钥中的密钥也是 MYSQL_PASSWORD。当我在容器中执行 echo $MYSQL_PASSWORD 时 - 它显示了正确的值。但由于某种原因,node.js 应用程序没有选择它。
【解决方案2】:

检查您是否正确编码了密码值。有时,您也会使用密码对“空格”或“换行”字符进行编码,最终导致密码错误。

使用 btoa() 和 atob() 函数对密码进行加密和解密。

【讨论】:

    【解决方案3】:

    您的 base 64 编码可能存在一些问题,特别是在填充字符“=”中,请参阅Why does a base64 encoded string have an = sign at the end 例如字符串“QUJDREVGRw==”和“QUJDREVGRw”都在“ABCDEFG”中解码,但kubernetes很容易受到影响:第一个是正确的,后者会导致错误!

    【讨论】:

      猜你喜欢
      • 2023-01-22
      • 2021-08-10
      • 2020-03-23
      • 2021-08-24
      • 2022-10-04
      • 2021-02-15
      • 2020-12-21
      • 2020-10-05
      • 2018-06-14
      相关资源
      最近更新 更多