How to execute command in a pod (kubernetes) using

2019-02-21 18:03发布

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

3条回答
Anthone
2楼-- · 2019-02-21 18:42

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.

查看更多
闹够了就滚
3楼-- · 2019-02-21 18:57

Use websocket client it's work.

In my local kuberenetes cluster, the connection metadata like this:

ApiServer = "172.21.1.11:8080"
Namespace = "default"
PodName = "my-nginx-3855515330-l1uqk"
ContainerName = "my-nginx"
Commands = "/bin/bash"

the connect url:

"ws://172.21.1.11:8080/api/v1/namespaces/default/pods/my-nginx-3855515330-l1uqk/exec?container=my-nginx&stdin=1&stdout=1&stderr=1&tty=1&command=%2Fbin%2Fbash"

On maxos, a wsclient CLI tool: wscat, you can use it as a test tool:

enter image description here

You can access the websocket example: "https://github.com/lth2015/container-terminal"

查看更多
一纸荒年 Trace。
4楼-- · 2019-02-21 19:01

You can using a websocket client to exec into a pod, a quick demo.

javascript code shows how to connect to kubernetes:

<script type="text/javascript">
    angular.module('exampleApp', ['kubernetesUI'])
        .config(function(kubernetesContainerSocketProvider) {
            kubernetesContainerSocketProvider.WebSocketFactory = "CustomWebSockets";
        })
        .run(function($rootScope) {
            $rootScope.baseUrl = "ws://localhost:8080";
            $rootScope.selfLink = "/api/v1/namespaces/default/pods/my-nginx-3855515330-l1uqk";
            $rootScope.containerName = "my-nginx";
            $rootScope.accessToken = "";
            $rootScope.preventSocket = true;
        })
        /* Our custom WebSocket factory adapts the url */
        .factory("CustomWebSockets", function($rootScope) {
            return function CustomWebSocket(url, protocols) {
                url = $rootScope.baseUrl + url;
                if ($rootScope.accessToken)
                    url += "&access_token=" + $rootScope.accessToken;
                return new WebSocket(url, protocols);
            };
        });
</script>

you can test it in other language.

查看更多
登录 后发表回答