kubernetes - 在 Kubernetes 中,将文件中的 secret 公开为环境变量

标签 kubernetes hashicorp-vault

在 Kubernetes 中,如何将文件(在 Kubernetes 卷中)中的 secret 公开为环境变量?

背景:
我关注了Google Cloud Platform GKE Vault Demo在其中,他们展示了如何“连续将 secret 的内容提取到本地文件位置。这允许应用程序正常从 pod 内的文件读取 secret ,而无需进行修改以直接与 Vault 交互。”

我想知道如何将这些 secret 公开为环境变量(而不是文件)以供其他应用程序容器使用。

最佳答案

我找到了如何将文件中的 secret 注入(inject)到应用程序容器中。

首先, secret 文件每行的格式应为 KEY="VALUE"
对于那些使用 Consul Template 从 Vault 获取 secret 的人,您可以这样做:

- name: CT_LOCAL_CONFIG
      value: |
        vault {
          ssl {
            ca_cert = "/etc/vault/tls/ca.pem"
          }
          retry {
            backoff = "1s"
          }
        }
        template {
          contents = <<EOH
        {{- with secret "secret/myproject/dev/module1/mongo-readonly" }}
        MONGO_READ_HOSTNAME="{{ .Data.hostname }}"
        MONGO_READ_PORT="{{ .Data.port }}"
        MONGO_READ_USERNAME="{{ .Data.username }}"
        MONGO_READ_PASSWORD="{{ .Data.password }}"
        {{- end }}
        {{- with secret "secret/myproject/dev/module2/postgres-readonly" }}
        POSTGRES_READ_HOSTNAME="{{ .Data.hostname }}"
        POSTGRES_READ_PORT="{{ .Data.port }}"
        POSTGRES_READ_USERNAME="{{ .Data.username }}"
        POSTGRES_READ_PASSWORD="{{ .Data.password }}"
        {{- end }}
        EOH
          destination = "/etc/secrets/myproject/config"
        }  

这将生成正确的 KEY="VALUE" 形式的 secret 文件。

从通过 volumeMount 共享到应用程序容器的 secret 文件中,我们可以将 secret 作为环境变量注入(inject),如下所示:

command: ["/bin/bash", "-c"]  # for Python image, /bin/sh doesn't work, /bin/bash has source
args:
  - source /etc/secrets/myproject/config;
    export MONGO_READ_HOSTNAME;
    export MONGO_READ_PORT;
    export MONGO_READ_USERNAME;
    export MONGO_READ_PASSWORD;
    export POSTGRES_READ_HOSTNAME;
    export POSTGRES_READ_PORT;
    export POSTGRES_READ_USERNAME;
    export POSTGRES_READ_PASSWORD;
    python3 my_app.py;  

这样,我们就不必修改需要环境变量中的 secret 的现有应用程序代码(用于使用 Kubernetes Secrets)。

关于kubernetes - 在 Kubernetes 中,将文件中的 secret 公开为环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55962949/

相关文章:

docker - WSL2 中的 Kubernetes 挂载文件夹

ubuntu - 将 Kubernetes 网络路由更改为互联网

kubernetes - 如何管理 K8s 中服务帐户 token 的使用?

docker - 在启动时将 secret 添加到保管库容器

即使使用 restartPolicy : "Never" Kubernetes 作业也会重新启动

docker - 在 Kubernetes 中的工作节点之间共享存储/卷?

Kubernetes ClusterIP 服务初始延迟或活跃度

python-3.x - HashiCorp Vault Python hvac 读取

docker - 在容器中的脚本内验证 Vault

ubuntu - 领事 : Health Check is failed to invoke: fork/exec but running manualy