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

时间:2015-12-19 17:28:58

标签: google-cloud-platform kubernetes google-kubernetes-engine

我试图在contianer中执行命令(使用kubernetes 1.1.2在GKE上的Kubernetes POD中)。

阅读文档我明白我可以使用GET或POST查询在API端点上打开websocket连接来执行命令。当我使用GET时,它不能完全工作,返回错误。当我尝试使用POST时,类似的东西可能会起作用(但事实并非如此):

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'

对此的回应是

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"}}

看起来应该足以升级发布请求并开始使用websocket流,对吧?我错过了什么?

我还指出,使用POST打开websocket可能违反了websocket协议(只有GET才有效?)。

另外

2 个答案:

答案 0 :(得分:2)

你可能有最好的时间使用Kubernetes client library,这与Kubectl使用的代码相同,但如果由于某些原因不是一个选项,那么我最好的建议是查看{{ 3}}并查看它设置的标题。

答案 1 :(得分:0)

您可以使用websocket客户端执行pod a quick demo

javascript代码显示了如何连接到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>

你可以用其他语言测试它。