从Node.js应用程序访问 Kubernetes "secret"环境变量



我有一个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应用程序没有接收到它。

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

谢谢。

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与env变量名不同。它应该是用来设置秘密密钥的。

检查密码值的编码是否正确。有时,你会编码";空间";或";换行符";字符也带有密码,您最终会使用错误的密码。

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

可能在您的base64编码中存在一些问题,特别是在填充字符方面"&";,看看这个为什么base64编码的字符串末尾有一个=符号作为一个例子;QUJDREVGRw==";以及";QUJDREVGRw";被解码为"0";EFG;但是kubernetes是易受影响的:fist是正确的,后者会导致错误!

最新更新