我试图在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才有效?)。
另外
答案 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>
你可以用其他语言测试它。