在Angular 6中将Kubernetes机密用作环境变量

时间:2019-02-10 11:28:19

标签: angular kubernetes kubernetes-secrets

我配置了自动构建Angular 6应用程序,并在每次将其推送到我的代码存储库(Google Cloud存储库)时在Kubernetes中进行部署。

Dev环境变量通常按如下方式存储在environment.ts文件中:

export const environment = {
  production: false,
  api_key: "my_dev_api_key"
};

但是我不想将Prod机密存储在存储库中,因此我认为我可以使用Kubernetes机密。

因此,我在Kubernetes中创建了一个秘密:

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

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

1 个答案:

答案 0 :(得分:3)

尽管如此,您的Angular应用程序还是 client 应用程序,即用户的浏览器会下载该应用程序的源代码(一堆CSS / JS / HTML文件,图像等),并且在用户计算机上执行它。因此,您无法像实现 client / server 应用程序那样隐藏任何东西。在客户端/服务器应用程序中,所有秘密都将驻留在服务器部分中。如果将机密放入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;'

如您所见,我们已经使用envsubst替换了Assets文件夹中的配置模板。 config.json.tpl可能看起来像这样:

{
  "apiUrl": "${API_URL}"
}

envsubst将用其真实值替换环境变量,并且资产中将具有有效的JSON配置代码段。然后nginx将启动。