我正在尝试根据此SO帖子中提供的建议设置与Kubernetes Pod Exec API的websocket连接:How to execute command in a pod (kubernetes) using API?。 这是我到目前为止所做的事情 -
kubectl proxy --disable-filter=true
以允许使用WS连接运行代理。 kubectl.exe
版本为1.8。ws://localhost:8001/api/v1/namespaces/default/pods/nginx-3580832997-26zcn/exec?container=nginx&stdin=1&stdout=1&stderr=1&tty=1&command=%2Fbin%2Fsh
,用于连接exec
api。当我点击“连接”时,Chrome会报告错误消息 -
Error during WebSocket handshake: Response must not include 'Sec-WebSocket-Protocol' header if not present in request
显然,kubectl在回复中发送回空Sec-WebSocket-Protocol
标题,而Chrome正在冒犯它。
我尝试更改Simple Web Socket Client open
方法的代码,将空协议参数发送到Websocket客户端创建调用,例如 - ws = new WebSocket(url, []);
以诱使Chrome在请求中发送空标头,但Chrome没有发送空标题。
那么可以做些什么来直接连接到Chrome中的exec
?
答案 0 :(得分:1)
这是一个已知问题; kubectl proxy
does not support websockets。 (您可以通过启动kubectl proxy
然后尝试kubectl --server=http://127.0.0.1:8001 exec ...
轻松验证这一点;如果过滤器已启用,您将收到消息error: unable to upgrade connection: <h3>Unauthorized</h3>
如果禁用过滤器,则会收到Error from server (BadRequest): Upgrade request required
消息
confusion可能来自kube-apiserver
代理确实支持websockets,但该代理与kubectl proxy
不同。
我认为你现在有三个选择(按难度顺序):
kube-apiserver
。您可能需要kubectl proxy
正在为您处理的身份验证答案 1 :(得分:0)
阅读https://github.com/kubernetes-ui/container-terminal/blob/master/container-terminal.js中的代码后,找到了exec
uses base64.channel.k8s.io
协议。简单的Web套接字客户端代码因此而无法工作,并且流通信是在base64中,而不是纯文本。
留下这个作为其他人试图实现基于WS的终端模拟器的答案......正如@ janos-lenart所提到的,代码很新,在不同的浏览器中使用它可能会出现问题,最好在此时下注是阅读示例代码并从那里开始。