kubectl 返回无法将字符串解组为 map[string]interface {} 类型的 Go 值

kubectl returning cannot unmarshal string into Go value of type map[string]interface {}

我正在尝试使用 kubectl 修补一个秘密

kubectl patch secret operator-secrets --namespace kube-system --context=cluster1 --patch "'{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}'"

但是我收到错误

Error from server (BadRequest): json: cannot unmarshal string into Go value of type map[string]interface {}

如果我运行命令使用echo,它似乎是有效的JSON

$ echo "'{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}'"

'{"data": {"FOOBAR": "value that I want"}}'

可以是什么?

发现错误

kubectl patch secret operator-secrets --namespace kube-system --context=standard-cluster-1 --patch "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"

If I run the command using echo, it seems to be a valid JSON

其实不然。仔细看输出的第一个字符:

'{"data": {"FOOBAR": "value that I want"}}'

您的“JSON”字符串以单引号开头,这是一个无效字符。要获得有效的 JSON,您需要将命令重写为如下所示:

echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"

我们可以使用 jq 之类的东西来确认 JSON 是有效的 命令:

$ echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"   | jq .
{
  "data": {
    "FOOBAR": "value that i want"
  }
}

让你的补丁命令看起来像:

kubectl patch secret operator-secrets \
  --namespace kube-system \
  --context=cluster1 \
  --patch "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"

但是虽然该补丁现在有效 JSON,但它仍然会失败 一个新错误:

The request is invalid: patch: Invalid value: "map[data:map[FOOBAR:value that i want]]": error decoding from json: illegal base64 data at input byte 5

data 地图中项目的值必须是 base64 编码值。 您可以自己对值进行 base64 编码:

kubectl patch secret operator-secrets \
  --namespace kube-system \
  --context=cluster1 \
  --patch "{\"data\": {\"FOOBAR\": \"$(base64 <<<"$FOOBAR")\"}}"

或使用stringData代替:

kubectl patch secret operator-secrets \
  --namespace kube-system \
  --context=cluster1 \
  --patch "{\"stringData\": {\"FOOBAR\": \"$FOOBAR\"}}"