我们的业务流程的一部分使用envsubst用所需的值更新YAML模板文件。

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

我们的关键字config的值是一个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将此解释为 map 类型并抱怨:
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:

09-25 23:01