kubectl 中的命令格式错误 运行

Malformed command in kubectl run

我有一个 Kubernetes 集群,上面部署了一个 this 镜像的副本(但对于这个问题来说这并不重要)。 现在,在 Powershell 中,我需要对 pod 执行一个 REST 请求。特别是我必须向端点 http://<POD_IP>:18681/PCCIS/V1/Service/Properties/Servers 发送一个 PUT 请求并传递此 JSON 有效负载:

{"servers":[{"port":"18682","address":"10.244.1.29"}]}

我试图做的是从 curlimages/curl 群中执行此操作,只是为了能够访问群的网络。这是我的尝试:

$PrizmDocPodIP="10.244.1.29"
$JsonPostBody='{"servers":[{"port":"18682","address":"10.244.1.29"}]}'
$cmd = "curl -i --header 'Content-Type: application/json' --request PUT --data '$JsonPostBody' http://$($PrizmDocPodIP):18681/PCCIS/V1/Service/Properties/Servers"
kubectl run -i --tty --rm curl --image=curlimages/curl --restart=Never "$cmd"

没想到,命令输出这个错误:

curl: (3) nested brace in URL position 82:
curl -i --header 'Content-Type: application/json' --request PUT --data '{servers:[{port:18682,address:10.244.1.29}]}' http://10.244.1.29:18681/PCCIS/V1/Service/Properties/Servers

如您所见,我遇到的问题是我传递的字符串命令没有以正确的方式解释,而且有效负载丢失了 JSON 的所有双引号,这对 curl 命令正常工作。

我做的另一个测试是使用此命令(echo 用于显示 sh 命令真正执行的内容)

kubectl run -i --tty --rm curl --image=curlimages/curl --restart=Never -- sh -c "echo $cmd"

输出为

curl -i --header Content-Type: application/json --request PUT --data {servers:[{port:18682,address:10.244.1.29}]} http://10.244.1.29:18681/PCCIS/V1/Service/Properties/Servers

显示 cmd Powershell 变量在传递给 kubectl run

时丢失了双引号

按原样传递 $cmd 命令(保留其所有引号和字符)的正确语法应该是什么?

经过一番搜索和尝试,我找到了解决方案。 首先,我必须转义 $JsonPostBody 变量中的双引号。

$PrizmDocPodIP="10.244.1.29"
$JsonPostBody='{\"servers\":[{\"port\":\"18682\",\"address\":\"10.244.1.29\"}]}'

另一个错误是 curlimages/curl Docker 图像执行 kubectl run 参数作为 curl 的参数,所以我不必使用curl 命令:

kubectl run -i --tty --rm curl --image=curlimages/curl --restart=Never -- -i --header 'Content-Type: application/json' --request PUT --data $JsonPostBody http://$($PrizmDocPodIP):18681/PCCIS/V1/Service/Properties/Servers

这输出

HTTP/1.1 200 OK
[1mDate[0m: Wed, 08 Jul 2020 13:23:30 GMT
[1mConnection[0m: keep-alive
1mContent-Length[0m: 0