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
我有一个 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