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

Use Kubernetes secrets as environment variables in Angular 6

我在 Kubernetes 中配置了自动构建我的 Angular 6 应用程序和部署,每次都会推送到我的代码存储库(Google 云存储库)。

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

不管你做什么,你的 Angular 应用程序是一个 客户端 应用程序,即用户的浏览器下载应用程序的源代码(一堆 CSS/JS/HTML 文件、图像等)并在用户的机器上执行。因此,您无法像在实施 client/server 应用程序时那样隐藏任何内容。在 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 替换资产文件夹中的配置模板。 config.json.tpl 可能如下所示:

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

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