1

我配置了我的 Angular 6 应用程序的自动构建,并且每次在 Kubernetes 中部署是推送到我的代码存储库(谷歌云存储库)。

开发环境变量通常存储在 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 应用程序中使用它?

4

1 回答 1

4

不管你做什么,你的 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;'

如您所见,我们曾经envsubst在资产文件夹中替换配置模板。config.json.tpl可能看起来像这样:

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

envsubst将环境变量替换为它们的真实值,您的资产中将有一个有效的 JSON 配置片段。然后nginx将启动。

于 2019-02-10T12:38:59.367 回答