如何注入保险库并使用 hashicorp 保险库机密?

How to inject vault and consume hashicorp vault secrets?

我不明白如何应用 hashicorp 保险库在我的应用程序中注入秘密。

下面link显示了几个例子https://www.vaultproject.io/docs/platform/k8s/injector/examples

我使用了同一个 post 中的 environment variables example。但似乎并不是所有的环境变量都被注入到应用程序中。例如,我的一个布局中的 ENV 似乎没有得到应用 meta property="og:title" content="#{ENV['NAME']}" - 显示没有价值。但是应用程序是 运行,/vault/secrets/... 有包含内容的文件。

这是我的应用程序部署配置的一部分。

当有多个 secrets/templates 时,Deployment 会很难看。

绝对没有 configmap example 的描述,但这可能是我应该使用的而不是 env。

...
     annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "app-role"
        vault.hashicorp.com/agent-inject-status: "update"
        vault.hashicorp.com/agent-inject-secret-pg.env: "secret/data/pg"
        vault.hashicorp.com/agent-inject-template-pg.env: |
          {{` {{- with secret "secret/data/pg" -}} `}}
          {{` export POSTGRES_HOST={{ .Data.data.host }} `}}
          {{` export POSTGRES_PORT={{ .Data.data.port }} `}}
          {{` export POSTGRES_USER={{ .Data.data.user }} `}}
          {{` export POSTGRES_PASSWORD={{ .Data.data.password }} `}}
          {{` {{- end }} `}}
        vault.hashicorp.com/agent-inject-secret-meta.env: "secret/data/app/meta"
        vault.hashicorp.com/agent-inject-template-meta.env: |
          {{` {{- with secret "secret/data/app/meta" -}} `}}
          {{` export BASE_URL={{ .Data.data.url }} `}}
          {{` export DESCRIPTION={{ .Data.data.description }} `}}
          {{` export IMAGE={{ .Data.data.image }} `}}
          {{` export NAME={{ .Data.data.name }} `}}
          {{` {{- end }} `}}

    spec:
      serviceAccountName: app  

...
args: ["/bin/bash", "-c", "source /vault/secrets/*.env && bundle exec puma -C config/puma.rb"]

如果您想将保管库机密注入部署 pod,您可以做什么

Github Vault-CRD 在 java 上有一个很棒的项目:https://github.com/DaspawnW/vault-crd

用于与 Kubernetes 共享 Vault Secrets 的 Vault CRD。它将 Vault 中的值注入并同步到 Kubernetes secret。您可以将这些秘密用作 pod 内的环境变量。

流程是这样的:vault to Kubernetes secret > and that secrets get injected into deployment using YAML same as configmap

除此之外,还有另一种很好的 sidecar 模式方法。

为此,有一个非常好的教程:https://github.com/hashicorp/hands-on-with-vault-on-kubernetes

另一个:https://www.hashicorp.com/blog/injecting-vault-secrets-into-kubernetes-pods-via-a-sidecar

我依稀记得在使用代理注入器模式从保管库中使用机密时遇到过类似的问题。虽然我没有深入研究为什么它不起作用,但想出了一个简单的方法。像下面这样的配置对你有帮助吗?

    ...
         annotations:
            vault.hashicorp.com/agent-inject: "true"
            vault.hashicorp.com/role: "app-role"
            vault.hashicorp.com/agent-inject-status: "update"
            vault.hashicorp.com/agent-inject-secret-pg.env: "secret/data/pg"
            vault.hashicorp.com/agent-inject-template-pg.env: |
              {{- with secret "secret/data/pg" -}}
                postgres://{{ .Data.data.user }}:{{ .Data.data.password }}@{{ .Data.data.host }}:{{ .Data.data.port }}/wizard?sslmode=disable
              {{- end }}
            ...
    
        spec:
          serviceAccountName: app
...
args:
 - echo set env variable(s);
   export POSTGRES_CONN_STRING=$(cat /vault/secrets/pg.env)
   ...

我们使用类似的方法来设置 mongodb 连接字符串和其他一些。对我们来说很好用。