【问题标题】:Kubernetes pod exec API exception: Response must not include 'Sec-WebSocket-Protocol' header if not present in requestKubernetes pod exec API 异常:如果请求中不存在,则响应不得包含“Sec-WebSocket-Protocol”标头
【发布时间】:2018-04-08 16:16:16
【问题描述】:

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

  1. 在 Chrome 中安装了 Simple Web Socket Client 扩展。
  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 标头,Chrome 对此感到不满。

我尝试更改 Simple Web Socket Client open 方法的代码以将空协议参数发送到 Websocket 客户端创建调用,例如 - ws = new WebSocket(url, []); 以诱使 Chrome 在请求中发送空标头,但 Chrome 不发送空标题。

那么如何在Chrome中直接连接exec呢?

【问题讨论】:

    标签: google-chrome websocket kubernetes kubectl


    【解决方案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 不同。

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

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

    【讨论】:

    • kubectl--disable-filter=true 标志一起使用时支持它。见this。我已经在 Firefox 中使用了 Simple Web Socket Client :)。显然,当返回一个空的 Sec-WebSocket-Protocol 标头时,Chrome 会抛出异常,而 FF 对此很冷淡。
    • 啊,这是#49534 中相当新的代码,边缘可能很锋利:) 所以我应该写kubectl proxy正确支持 websockets 。我建议直接访问kube-apiserver,直到。
    • 感谢@janos,我进一步调查了这个问题,它似乎影响了我正在使用的 Chrome 扩展程序。我能够成功使用github.com/kubernetes-ui/container-terminal 与 Chrome 中的kubectl proxy 会话连接。我在建立连接时发现了execusesbase64.channel.k8s.io 协议。也许一旦该功能更加成熟,文档就会赶上提及这一点。
    【解决方案2】:

    看了https://github.com/kubernetes-ui/container-terminal/blob/master/container-terminal.js中的代码,发现execusesbase64.channel.k8s.io协议。由于这个原因,Simple Web Socket Client 代码无法正常工作,而且流通信是 base64 格式,而不是纯文本。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多