【问题标题】:In Kubernetes, Expose secrets in file as environment variables在 Kubernetes 中,将文件中的机密公开为环境变量
【发布时间】:2020-03-20 15:37:24
【问题描述】:

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

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

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

【问题讨论】:

  • 如何将秘密写入文件,获取它(并运行应用程序)然后删除它?
  • 你需要运行一个像 Consul Template 这样的 sidecar 来获取秘密到 pod 中。跨 pod 共享环境没有简单的方法,因此您需要使用文件系统。示例:github.com/sethvargo/vault-kubernetes-workshop
  • 有没有办法将秘密作为环境变量共享,以便同一个 Pod 中的应用程序容器可以将它们作为环境变量使用?我曾认为从环境变量中读取秘密是比从文件中更好的做法
  • 我发现了一些从 Vault 中读取并填充 Kubernetes Secrets 的内容:itnext.io/…

标签: kubernetes hashicorp-vault


【解决方案1】:

我发现了如何将文件中的秘密注入应用程序容器。

首先,机密文件的每一行都应采用KEY="VALUE" 的形式。
对于那些使用 Consul Template 从 Vault 获取秘密的人,您可以这样做:

- 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" 格式的机密文件。

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

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;  

通过这种方式,我们不必修改现有应用程序代码,这些代码需要来自环境变量的机密(用于使用 Kubernetes 机密)。

【讨论】:

    【解决方案2】:

    感谢@cryanbhu 这实际上救了我。

    还可以导出所有变量而不必列出它们:

    command: ["/bin/bash", "-c"]  # you can also just use sh for other images
    args:
      - source /etc/secrets/myproject/config;
        export $(cut -d= -f1 /etc/secrets/myproject/config);
        python3 my_app.py;
    

    确认这对我有用:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2022-07-12
      • 1970-01-01
      • 2020-03-23
      相关资源
      最近更新 更多