我想要一个环境变量,其值是一个 JSON 字符串,它是从
ExternalSecrets
变量构建的。
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: my-app-external-secret
spec:
refreshInterval: "1h"
secretStoreRef:
name: hashicorp-vault
kind: ClusterSecretStore
target:
creationPolicy: Owner
data:
- secretKey: SECRET_KEY_A
remoteRef:
key: microservice/my-app
property: secret_key_a
- secretKey: SECRET_KEY_B
remoteRef:
key: microservice/my-app
property: secret_key_b
输出应如下所示:
{
"A": {
"secretKey": "<SECRET_KEY_A>",
"someStaticValue": "ABCDEF"
},
"B": {
"secretKey": "<SECRET_KEY_B>",
"someStaticValue": "FEDCBA"
}
}
然后我可以将其导出到
Deployment
中并能够将其用作 JSON 字符串,可能如下所示:
- name: JSON_SECRETS
valueFrom:
secretKeyRef:
name: my-app-external-secret
key: jsonSecret
我尝试了一些东西,但没有成功。 如果需要的话我可以使用
ConfigMap
。我试图在我的应用程序中实现以下行为:
每当我需要实现一个新的secret时,不需要修改源代码,只需等待刷新时间或重新启动pod即可。应用程序已经知道如何处理 JSON,但我无法在 Kubernetes 中创建此 JSON。它是一个Java应用程序,它不需要是JSON,它也可以是一个列表。
要使用从ExternalSecrets变量创建的JSON字符串在Kubernetes中构建环境变量,请使用Kubernetes Jobs或CronJobs定期使用所需的JSON数据更新环境变量。首先,编写一个 shell 脚本来搜索ExternalSecrets 并创建所需的 JSON 格式。可以使用 Vault CLI 或任何其他可以访问您的ExternalSecrets 的工具。
generate-json.sh
为例:
#!/bin/sh
SECRET_KEY_A=$(vault read -field=secret_key_a secret microservice/my-app)
SECRET_KEY_B=$(vault read -field=secret_key_b secret microservice/my-app)
JSON="{"
JSON="$JSON \"A\": {\"secretKey\": \"$SECRET_KEY_A\", \"someStaticValue\": \"ABCDEF\"},"
JSON="$JSON \"B\": {\"secretKey\": \"$SECRET_KEY_B\", \"someStaticValue\": \"FEDCBA\"}"
JSON="$JSON }"
echo "$JSON" > /path/to/output/json.json
您可以将 shell 脚本包含在 ConfigMap 中并将其声明为可执行文件。
apiVersion: v1
kind: ConfigMap
metadata:
name: json-generator
data:
generate-json.sh: |
#!/bin/sh
# (Contents of the shell script)
创建一个定期执行 shell 脚本的 CronJob,以生成 JSON 并将其保存在 ConfigMap 中。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: json-generator-cron
spec:
schedule: "0 */1 * * *" # Run every 1 hour
jobTemplate:
spec:
template:
spec:
containers:
- name: json-generator
image: your-custom-image:latest # Image with Vault CLI or required tools
command: ["/bin/sh", "/path/to/script/generate-json.sh"]
volumeMounts:
- name: output-volume
mountPath: /path/to/output
volumes:
- name: output-volume
emptyDir: {}
在部署中创建一个 Pod,引用从 ConfigMap 生成的 JSON 作为环境变量。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
template:
spec:
containers:
- name: my-app-container
image: your-app-image:latest
env:
- name: JSON_SECRETS
valueFrom:
configMapKeyRef:
name: json-generator
key: /path/to/output/json.json
通过此配置,CronJob 定期使用您的ExternalSecrets 数据创建 JSON 并将其保存在 ConfigMap 中。然后,应用程序中的 Pod 引用此 ConfigMap 来设置
JSON_SECRETS
环境变量。当您在ExternalSecrets中添加或更改机密时,CronJob将自动刷新JSON,并且您的应用程序将在下次Pod重新启动时或按计划获取更改。确定 CronJob 的 json-generator
容器具有访问您的私有存储(例如 Vault)并写入 ConfigMap 的适当权限。