将环境变量与 Google Kubernetes Engine 一起使用(安全、简单且良好的做法)?

Use environmental variables with Google Kubernetes Engine (safe, easy and good practise)?

我正在尝试学习 Google Kubernetes Engine。我正在 Node.js 中的一个包含 6 个敏感环境变量的集群上部署 Web 应用程序。在本地,我将它们放在一个我有 .gitignored 的 .env 文件中。我将代码推送到 github,它通过触发器在 Cloud Build 上创建一个容器。

我正在使用 GCP 的图形用户界面(即不是 Kubectl、gsutil 或类似的东西)。我也在没有 Yaml 文件的情况下这样做。这现在工作得很好。

但是,我正在解决一个问题,这个问题让我不得不一直部署新的工作负载,因此我每次都需要添加这些环境变量,这非常乏味。

我知道解决方案是使用 gsutil and/or 使用 yaml 文件。我知道我将不得不在某个时候开始使用 gsutil 和 yaml,也许就是现在。

但是,我想知道我是否将环境变量放在我推送到 github 并进一步推送到 GCP 的 yaml 文件中,我显然不能 gitignore 它。 那么,我如何将密码等保存在代码库之外? 出于这个原因,我将这些变量从代码移到了环境变量中。

在 GCP 上以简单安全的方式使用环境变量的common/good实践是什么?

What is common/good practise to work with environmental variables on GCP - in a easy and safe manner?

非常简单的文档:https://cloud.google.com/kubernetes-engine/docs/concepts/secret

您应该使用键值存储或其他键值管理服务。

Kubernetes 建议最好的做法是使用 K8s secretconfigmap 这是 base64 编码的键值对。您使用 YAML 应用到 K8s 集群,并进一步注入到部署和应用程序中,从环境中获取它。

要么将变量注入环境变量,要么将文件作为文件从应用程序进一步使用的地方注入文件系统。

您可以在以下位置查看更多信息:https://kubernetes.io/docs/concepts/configuration/secret/

作为环境注入秘密的基本示例:

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username 

您将文件存储到秘密中,并将该秘密 base64 编码注入到部署中,并将文件添加到文件系统中。一旦您的应用程序启动,它就会开始使用该文件中的一个文件。

作为文件注入文件系统的基本示例秘密:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
    secret:
      secretName: mysecret

现在由你决定你拥有哪种类型的环境变量,如果它是简单的键值或 .env 等

如果是简单的键值,您正在寻找 静态加密、安全和其他访问策略,以及 UI更新机密。

我建议查看著名的并被许多企业使用的 Hashicorp 保险库。使用它,您可以加密秘密并将其注入到部署中。但是您需要部署和管理此工作负载,它不是像秘密管理器这样的托管服务。

我不是 Google 的员工,但您使用的是 GKE 我还建议您查看可以管理您的秘密的秘密管理器或 KMS。

文章:https://cloud.google.com/kubernetes-engine/docs/how-to/encrypting-secrets

Github CSI 驱动程序:https://github.com/GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp

如果您不关心编码并且这些不是重要的秘密,您可以使用默认内置的K8s秘密.

在提交 YAML 文件方面,如果您使用 Vaultsecret manager,则无需管理 [=50= YAML 文件或部署 YAML 中的 ]secret 不会存储任何 confidential secrets.