在Kubernetes中,将文件秘密作为环境变量公开

时间:2019-05-03 03:32:25

标签: kubernetes hashicorp-vault

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

背景
我遵循了Google Cloud Platform GKE Vault Demo,并在其中展示了如何”连续将机密内容提取到本地文件位置。这使应用程序可以正常地从吊舱内的文件中读取机密,而无需进行修改直接与保险柜进行交互。”

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

3 个答案:

答案 0 :(得分:1)

如果您想使用音量公开它,也许有很多方法可以做到这一点。

而卷仅与一个吊舱相连,因此您可以使用秘密代替它。

您必须创建秘密yaml文件并将其附加到pod上,以便它将值作为环境变量公开。

    apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

要从configmap yaml清单文件的pod中添加值,就像

    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
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

有关更多参考,您可以访问kubernetes官方文档: https://kubernetes.io/docs/concepts/configuration/secret/

您可以将卷的秘密公开为环境变量。

答案 1 :(得分:1)

感谢@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;

确认对我有用:)

答案 2 :(得分:0)

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

首先,机密文件的每一行的格式应为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 Secrets)。