如何嵌入 JSON 字符串作为 Kubernetes Secret 中的值

How to embed JSON string as the value in a Kubernetes Secret

我们的部分编排使用 envsubst 来使用我们想要的值更新 YAML 模板文件。

envsubst < "${SECRET_TEMPLATE}" | kubectl apply -f -

我们的关键字配置的值是一个 JSON 字符串:

data=$(jq -c . ${JSON_FILE})

这导致 YAML 看起来像这样(为简洁起见进行了修剪):

apiVersion: v1
kind: Secret
metadata:
  name: reporting-config
type: Opaque
data:
  config: {"database": "foo"}

这显然适用于 Kube 的一些早期版本,我想说的是 1.8。无论如何,我们是 运行 1.15,现在 kubectl 将其解释为地图类型并抱怨:

error: error validating "STDIN": error validating data: ValidationError(Secret.data.config): invalid type for io.k8s.api.core.v1.Secret.data: got "map", expected "string"; if you choose to ignore these errors, turn validation off with --validate=false

现在有什么技巧可以做到这一点吗?我尝试过引用和各种地方、转义引号以及所有爵士乐和虚无主义。

* 更新 1 *

使用 stringData 仍然会导致相同的错误:

apiVersion: v1
kind: Secret
metadata:
  name: monsoon-storage-reporting-config
type: Opaque
stringData:
  config: {"database": "foo"}
error: error validating "STDIN": error validating data: ValidationError(Secret.stringData.config): invalid type for io.k8s.api.core.v1.Secret.stringData: got "map", expected "string"; if you choose to ignore these errors, turn validation off with --validate=false

我必须对值进行 base64 编码

$ echo {"database": "foo"} | base64
e2RhdGFiYXNlOiBmb299Cg==

然后在data:字段中使用base64编码值

apiVersion: v1
kind: Secret
metadata:
  name: reporting-config
type: Opaque
data:
  config: e2RhdGFiYXNlOiBmb299Cg==

另请注意 base64 encoding

When using the base64 utility on Darwin/macOS users should avoid using the -b option to split long lines. Conversely Linux users should add the option -w 0 to base64 commands or the pipeline base64 | tr -d '\n' if -w option is not available.

您可以使用如下的 stringData。注意 stringData 之后的管道:

apiVersion: v1
kind: Secret
metadata:
  name: monsoon-storage-reporting-config
type: Opaque
stringData: |
  config: {"database": "foo"}