且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使用API​​在pod(kubernetes)中执行命令?

更新时间:2023-11-11 21:46:52

您可能会有***的时间使用 Kubernetes客户端库,它与Kubectl使用的代码相同,但如果是某些原因不是一种选择,比我***的建议是浏览客户端库的执行远程命令的代码并查看它设置的标头。


I'm trying to execute command in a contianer (in a Kubernetes POD on GKE with kubernetes 1.1.2).

Reading documentation I understood that I can use GET or POST query to open websocket connection on API endpoint to execute command. When I use GET, it does not work completly, returns error. When I try to use POST, something like that could work probably (but it's not):

curl 'https://admin:xxx@IP/api/v1/namespaces/default/pods/hello-whue1/exec?stdout=1&stderr=1&command=ls' -H "Connection: upgrade" -k -X POST -H 'Upgrade: websocket'

repsponse for that is

unable to upgrade: missing upgrade headers in request: http.Header{"User-Agent":[]string{"curl/7.44.0"}, "Content-Length":[]string{"0"}, "Accept":[]string{"*/*"}, "Authorization":[]string{"Basic xxx=="}, "Connection":[]string{"upgrade"}, "Upgrade":[]string{"websocket"}}

Looks like that should be enough to upgrade post request and start using websocket streams, right? What I'm missing?

I was also pointed that opening websocket with POST is probably violation of websocket protocol (only GET should work?).

Also

You'll probably have the best time using the Kubernetes client library, which is the same code the Kubectl uses, but if for some reason that isn't an option, than my best suggestion is to look through the client library's code for executing remote commands and seeing what headers it sets.