Kubernetes pod exec API例外:响应不得包括Sec-WebSocket-Protocol'如果请求中不存在标头

时间:2017-10-27 06:14:42

标签: google-chrome websocket kubernetes kubectl

我正在尝试根据此SO帖子中提供的建议设置与Kubernetes Pod Exec API的websocket连接:How to execute command in a pod (kubernetes) using API?。 这是我到目前为止所做的事情 -

  1. 在Chrome中安装了简单的Web Socket客户端扩展程序。
  2. 启动kubectl proxy --disable-filter=true以允许使用WS连接运行代理。 kubectl.exe版本为1.8。
  3. Chrome扩展程序中使用的地址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。
  4. 当我点击“连接”时,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

2 个答案:

答案 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正在为您处理的身份验证
  • 使用SockJS,这是Kubernetes Dashboard为exec feature
  • 所做的事情
  • 修复#25126

答案 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所提到的,代码很新,在不同的浏览器中使用它可能会出现问题,最好在此时下注是阅读示例代码并从那里开始。