在Angular 6中使用Kubernetes secrets作为环境变量

在Angular 6中使用Kubernetes secrets作为环境变量,angular,kubernetes,kubernetes-secrets,Angular,Kubernetes,Kubernetes Secrets,我在Kubernetes中配置了Angular 6应用程序的自动构建和部署,每次将其推送到我的代码库Google Cloud repository Dev环境变量通常存储在environment.ts文件中,如下所示: export const environment = { production: false, api_key: "my_dev_api_key" }; { "apiUrl": "${API_URL}" } 但我不想把我的产品秘密放在我的存储库中,所以我想我可以使

我在Kubernetes中配置了Angular 6应用程序的自动构建和部署,每次将其推送到我的代码库Google Cloud repository

Dev环境变量通常存储在environment.ts文件中,如下所示:

export const environment = {
  production: false,
  api_key: "my_dev_api_key"
};
{
  "apiUrl": "${API_URL}"
}
但我不想把我的产品秘密放在我的存储库中,所以我想我可以使用库伯内特斯的秘密

所以,我在库伯内特斯创造了一个秘密:

kubectl create secret generic literal-token --from-literal api_key=my_prod_api_key

但是如何在我的Angular应用程序中使用它?

不管你做什么,你的Angular应用程序是一个客户端应用程序,即用户的浏览器下载应用程序的源代码、一堆CSS/JS/HTML文件、图像等,并在用户的机器上执行。因此,您不能像实现客户机/服务器应用程序时那样隐藏任何内容。在客户机/服务器应用程序中,所有机密都将驻留在服务器部分。如果你把秘密放在一个k8s秘密中,你将不会在存储库中提交它,但是你将向你的所有用户公开它

如果您仍然希望基于环境变量(这是一个合法的用例)填充配置,我已经看到并使用了以下方法。该应用程序是Angular 6,由nginx服务器提供给浏览器。docker容器中的启动脚本有点奇怪,看起来类似于以下几行:

envsubst < /usr/share/nginx/html/assets/config.json.tpl > /usr/share/nginx/html/assets/config.json
rm /usr/share/nginx/html/assets/config.json.tpl
echo "Configuration:"
cat /usr/share/nginx/html/assets/config.json
nginx -g 'daemon off;'

envsubt将用实际值替换环境变量,您的资产中将有一个有效的JSON配置片段。然后nginx将启动。

不管你做什么,你的Angular应用程序是一个客户端应用程序,即用户的浏览器下载应用程序的源代码、一组CSS/JS/HTML文件、图像等,并在用户的机器上执行。因此,您不能像实现客户机/服务器应用程序时那样隐藏任何内容。在客户机/服务器应用程序中,所有机密都将驻留在服务器部分。如果你把秘密放在一个k8s秘密中,你将不会在存储库中提交它,但是你将向你的所有用户公开它

如果您仍然希望基于环境变量(这是一个合法的用例)填充配置,我已经看到并使用了以下方法。该应用程序是Angular 6,由nginx服务器提供给浏览器。docker容器中的启动脚本有点奇怪,看起来类似于以下几行:

envsubst < /usr/share/nginx/html/assets/config.json.tpl > /usr/share/nginx/html/assets/config.json
rm /usr/share/nginx/html/assets/config.json.tpl
echo "Configuration:"
cat /usr/share/nginx/html/assets/config.json
nginx -g 'daemon off;'

envsubt将用实际值替换环境变量,您的资产中将有一个有效的JSON配置片段。然后nginx将启动。

谢谢你。但如果我理解正确的话,这个秘密还是会暴露出来的?当然会的。这是你的财产。你不能从客户端应用程序中隐藏任何内容。请参阅这篇精彩文章中的单页应用程序部分-谢谢Lachezar。但如果我理解正确的话,这个秘密还是会暴露出来的?当然会的。这是你的财产。你不能从客户端应用程序中隐藏任何内容。请参阅这篇精彩文章中的单页应用程序部分-