代码之家  ›  专栏  ›  技术社区  ›  hazardous

通过WebSocket连接授权到远程kubernetes api服务器

  •  0
  • hazardous  · 技术社区  · 7 年前

    查看相关问题- Kubernetes pod exec API exception: Response must not include 'Sec-WebSocket-Protocol' header if not present in request .

    我已经能够使用Pod成功地建立WebSocket连接 exec kubectl proxy 在localhost上代表终端客户端处理授权。

    下一步是能够将请求直接授权给kubernetes API服务器,这样就不需要通过 kubectl代理 . Here's a discussion 在python社区中,他们能够将授权令牌发送到api服务器。但我在nodejs中没有取得任何成功。我必须承认,我对python也不熟悉,因此无法充分理解讨论内容。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   hazardous    7 年前

    对于未来的流浪者。。。。

    虽然 exec API支持 Authorization 浏览器WebSocket API尚不支持它。因此,我们的解决方案是从我们的服务器API中反向代理它。

    事情是这样的。。。

    客户端浏览器-wss->GKE LB(SSL终止)-ws->站点API(nodejs)-WSS&授权->kube api server exec api

    所以回答我自己的问题 ,根据我的测试,GKE-kubernetes只支持头中的授权,因此如果你想通过浏览器连接到它,就需要反向代理。每 this code ,一些Kubernetes设置允许在查询字符串中使用令牌,但我在GKE中没有任何成功。如果您使用的是不同的群集主机,请使用YMMY。我欢迎kubernetes团队对我的观察结果发表评论。

    如果你来这里只是为了授权问题,你可以停止进一步阅读。

    然而,还有更多的挑战需要克服,有好消息也有坏消息。。。首先是好消息:

    GKE Loadbalancer自动处理SSL终止 even for WebSockets ,因此您可以代理到WS或WSS,而不会出现任何问题。

    然后是坏消息:

    GKE Loadbalancer force在30秒内终止所有连接,即使它们正在使用!有一些变通办法,但它们都不是 don't stay put ,要求您 deploy your own controller ,或者您需要使用 Ingress . 对于终端会话来说,这意味着Chrome将用1006代码关闭客户端,即使此时正在运行命令。

    对于某些WS场景,可以在1006关闭时简单地重新连接,但对于终端会话,这是一个交易破坏者,因为您无法重新连接到以前的终端实例,必须从一个新的终端实例开始。

    目前,我们已经求助于增加GKE负载平衡器的超时。但最终我们计划部署我们自己的负载平衡器,它可以更好地处理这个问题。Ingress有 some issues 我们现在不想与之生活在一起。