我有办法在 Kubernetes 中将变量设置为 JSON 字符串吗?

问题描述 投票:0回答:1

我想要一个环境变量,其值是一个 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,它也可以是一个列表。

java kubernetes hashicorp-vault kubernetes-secrets
1个回答
0
投票

要使用从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 的适当权限。

© www.soinside.com 2019 - 2024. All rights reserved.