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

Skh*_*haz 2 kubernetes kubectl

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

kubectl patch secret operator-secrets --namespace kube-system --context=cluster1 --patch "'{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}'"
Run Code Online (Sandbox Code Playgroud)

但我收到错误

来自服务器的错误 (BadRequest): json: 无法将字符串解组为类型为 map[string]interface {} 的 Go 值

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

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

'{"data": {"FOOBAR": "value that I want"}}'
Run Code Online (Sandbox Code Playgroud)

可以是什么?

lar*_*sks 7

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

事实上,事实并非如此。仔细查看输出的第一个字符:

'{"data": {"FOOBAR": "value that I want"}}'
Run Code Online (Sandbox Code Playgroud)

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

echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下命令确认这是有效的 JSON jq

$ echo "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"   | jq .
{
  "data": {
    "FOOBAR": "value that i want"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

kubectl patch secret operator-secrets \
  --namespace kube-system \
  --context=cluster1 \
  --patch "{\"data\": {\"FOOBAR\": \"$FOOBAR\"}}"
Run Code Online (Sandbox Code Playgroud)

但是,虽然该补丁现在是有效的 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
Run Code Online (Sandbox Code Playgroud)

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

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

或者使用stringData

kubectl patch secret operator-secrets \
  --namespace kube-system \
  --context=cluster1 \
  --patch "{\"stringData\": {\"FOOBAR\": \"$FOOBAR\"}}"
Run Code Online (Sandbox Code Playgroud)