我正在尝试在需要PostgresSQL的Kubernetes环境中安装Sonarqube。 我正在使用外部Postgres实例,并且在Vault中设置了crednetials kv机密。 SonarQube舵图在容器中创建一个环境变量,该变量采用Postgres的用户名和密码。
如何将我的保险柜中的秘密注入运行在Kubernetes上的sonarqube pod的环境变量中?
创建Kubernetes机密并在掌舵图中使用该机密是可行的,但是我们正在管理Vault上的所有机密,需要将Vault机密注入到Pod中。
谢谢
答案 0 :(得分:2)
如果您在使用领事sidecar容器注入机密时遇到问题,并且发现很难设置,可以使用以下命令:https://github.com/DaspawnW/vault-crd
这是库自定义资源定义,可将库环境变量直接同步到kuberntes secret,因此现在您可以将secret直接添加到POD。与secretref
。
vault crd创建一个Pod,您必须在其中传递Vault Service名称或URL,使用该应用程序可以使用该应用程序连接到Vault,并且在Vault值更改时,它将自动将值同步到kubernetes secret。
答案 1 :(得分:1)
您需要使用一个父流程,该流程将与Vault对话并检索值,然后运行实际流程。 https://github.com/hashicorp/envconsul是Vault小组的官方工具,但是如果您要查找的话,还有许多其他选择。
答案 2 :(得分:1)
有两种方法可以将保险库机密作为 ENV 变量注入 k8s pod。
应创建一个模板,将 Vault 机密导出为环境变量。
spec:
template:
metadata:
annotations:
# Environment variable export template
vault.hashicorp.com/agent-inject-template-config: |
{{ with secret "secret/data/web" -}}
export api_key="{{ .Data.data.payments_api_key }}"
{{- end }}
并且应用程序容器应该在启动期间获取这些文件。
args:
['sh', '-c', 'source /vault/secrets/config && <entrypoint script>']
参考:https://www.vaultproject.io/docs/platform/k8s/injector/examples#environment-variable-example
参考:https://banzaicloud.com/blog/inject-secrets-into-pods-vault-revisited/。
这两种方法都绕过了 k8s 安全性,因为机密没有存储在 etcd 中。 此外,Pod 在这两种方法中都不知道 vault。 因此,无需深入比较即可采用其中任何一种。
对于 vault-k8s 和 vault-helm 用户,我推荐第一种方法。
答案 3 :(得分:0)
这是一种可以提供一些见识的方法:https://banzaicloud.com/blog/inject-secrets-into-pods-vault-revisited/#kubernetes-mutating-webhook-for-injecting-secrets
答案 4 :(得分:-1)
kubernetes文档(https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables)中有一个示例YAML,其中用秘密填充了环境变量。
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