Kubernetes pod exec API 异常:如果请求中不存在,响应不得包含 'Sec-WebSocket-Protocol' header

Kubernetes pod exec API exception: Response must not include 'Sec-WebSocket-Protocol' header if not present in request

我正在尝试根据此 SO post:How to execute command in a pod (kubernetes) using API? 中给出的建议,建立与 Kubernetes Pod Exec API 的 websocket 连接。 这是我到目前为止所做的 -

  1. 已在 Chrome 中安装简单 Web 套接字客户端扩展。
  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。

当我单击“连接”时,Chrome 报告错误消息 -

Error during WebSocket handshake: Response must not include 'Sec-WebSocket-Protocol' header if not present in request

显然,kubectl 在响应中发回空 Sec-WebSocket-Protocol header,Chrome 对此表示不满。

我尝试更改简单 Web 套接字客户端 open 方法的代码以将空协议参数发送到 Websocket 客户端创建调用,例如 - ws = new WebSocket(url, []); 以哄骗 Chrome 发送空header 在请求中,但 Chrome 不发送空 header。

那么如何才能直接连接到Chrome中的exec

这是一个已知问题; 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

我看到你现在有 3 个选项(按难度排序):

  • 直接访问kube-apiserver。您可能需要 kubectl proxy 正在为您处理的身份验证
  • 使用 SockJS,这就是 Kubernetes Dashboard 为 exec feature
  • 所做的
  • 修复#25126

阅读 https://github.com/kubernetes-ui/container-terminal/blob/master/container-terminal.js, found that exec uses base64.channel.k8s.io 协议中的代码后。由于这个原因,简单 Web 套接字客户端代码将无法工作,而且流通信是 base64,而不是纯文本。

将此作为其他人试图实现基于 WS 的终端仿真器的答案...正如@janos-lenart 提到的那样,代码非常新,在不同的浏览器中使用它可能会出现问题,最好在这一点是阅读示例代码并从那里开始。