【问题标题】:How to check Node.js Environment variables from Kubernetes Pod如何从 Kubernetes Pod 检查 Node.js 环境变量
【发布时间】:2021-08-19 16:35:19
【问题描述】:

我已将 node.js 应用程序容器化到 kubernetes pod 中。为了设置一些环境变量,我创建了 .env.k8 文件并在那里设置了一些环境变量。

在构建映像时,我在 docker build 命令中选择此文件作为 --env =k8。假设,我在那个 .env.k8 文件中设置了一个 ENV 变量作为 URL ="abc.com"

图像正在创建并且 pod 已启动。我需要检查是否根据我的 .env.k8 文件设置了 process.env.URL。 pod有什么办法,我可以检查Env变量是否设置正确。

我执行到正在运行的容器中并使用了 commond printenv。它没有显示 node.js 应用程序的进程环境变量,它显示了为 POD 设置的环境变量。

那么如何从相同的 kubernetes pod 检查 process.env 变量

【问题讨论】:

  • node.env 变量是在构建过程中提供的,无法从运行时访问 env 变量。唯一的方法是创建一个返回环境变量的逻辑
  • 我不想访问它。我只想验证它是否在构建过程中正确设置。有什么办法吗?
  • 无需编写额外代码 - 不,这是出于安全原因
  • 好的。感谢您的信息。现在检查如何创建逻辑或附加代码来验证 Env 变量
  • 您可以使用npmjs.com/package/dotenv-safe 它可以验证您的环境变量是否设置正确,否则将不允许运行应用程序

标签: node.js docker kubernetes


【解决方案1】:

您必须从您的 .env 文件定义创建一个 configMap 并将其挂载到您应用的根目录中。

kubectl create configmap nodejs-env --from-file=.env.k8 

正确安装后,.env 文件将为您的 Node.js 应用程序设置 env 变量

# NodoJS app Deployment using above config map

apiVersion: app/v1
kind: Deployment
metadata:
  name: nodejs-app
  namespace: production
spec:
  replicas: 8
  selector:
    matchLabels:
      app: nodejs-app
  template:
    metadata:
      labels:
        app: nodejs-app
    spec:
      containers:
      - name: nodejs-app
        image: nodejs-app:3.2.0
        ports:
          containerPort: 80
        volumeMounts:
        - name: nodejs-env-file
          mountPath: /app/.env
          readOnly: true
    volumes:
    - name: nodejs-env-file
      configMap:
        name: nodejs-env

参考:https://www.cloudytuts.com/tutorials/kubernetes/how-to-configure-node-based-apps-in-kubernetes/

【讨论】:

    【解决方案2】:

    一些监视器需要在我们的应用程序中使用端点来显示带有统计信息或指标的仪表板。

    在 java 中,称为spring 的最安全和最完整的框架提供了一个称为执行器的功能,它公开了许多 http 端点。其中之一能够显示环境变量。您可以禁用此功能或为生产设置安全凭据

    同样在python、django框架中,当调试变量为真时,出现任何错误时,都会显示一个html页面,其中包含错误的堆栈跟踪以及环境变量。

    因此,在 nodejs 中拥有此功能并不是一个疯狂的想法。您只需要添加一个简单的快速路由并返回 process.env

    app.get("/meta/vars", function(req, res){
        if ( some_security_logic || process.env.NODE_ENV ==  "PROD") { 
          return req.send({});
        }
        req.send(process.env);
    });
    

    配置管理器

    在运行时使用但在构建时公开的变量不是一个好的做法,因为它破坏了 docker 的一项功能:一个构建适用于任何环境:开发、暂存、生产等

    要在 .env .properties .ini 或任何扩展名等文件中包含变量,需要人工执行手动写入任务。 这会破坏 devops 自动化。还需要一些存储,例如 git 存储库,这是另一种不好的做法。

    在这一点上,我建议您使用一些应用程序来负责管理您公司中所有应用程序的所有变量。此应用程序必须是安全的,并提供隐藏密码、加密敏感值和特定应用程序使用这些变量的安全方式等功能。这里有一些选项:

    使用类似之前选项的工具,您无需在构建时手动添加变量。您的应用只需使用配置管理器平台发布的安全 http 端点获取其变量。

    【讨论】:

      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2019-11-16
      • 2021-05-15
      • 2021-08-26
      • 2019-08-02
      相关资源
      最近更新 更多