通过WebSocket连接授权远程kubernetes api-server

时间:2017-11-09 07:56:49

标签: node.js websocket authorization kubernetes kubectl

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

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

下一步是能够直接向kubernetes API服务器授权请求,因此无需通过kubectl proxy路由流量。 python社区中的Here's a discussion,他们已经能够将授权令牌发送到api-server。但我在nodejs中没有取得任何成功。我必须承认我不熟悉python以及足够理解讨论。

来自kubernetes团队的人能指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:0)

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

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

就是这样......

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

所以回答我自己的问题,根据我的测试,GKE kubernetes仅支持头文件中的授权,因此如果要通过浏览器连接代理,则需要反向代理。根据{{​​3}},一些Kubernetes设置允许在查询字符串中使用令牌,但我在GKE上没有取得任何成功。如果您使用的是其他群集主机,则为YMMY。我欢迎kubernetes团队对我的观察发表评论。

如果您只是因为授权问题来到这里,您可能会停止阅读。

还有更多挑战要克服,有好消息和坏消息......首先是好消息:

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

然后是坏消息:

GKE Loadbalancer force会在30秒内终止所有连接,即使它们正在使用中!有一些解决方法,但它们even for WebSockets要求您don't stay put,或者您需要使用deploy your own controller。这对终端会话意味着Chrome将使用1006代码关闭客户端,即使当时正在运行命令。

对于某些WS方案,简单地重新连接1006关闭可能是可以接受的,但对于终端会话,这是一个交易破坏者,因为您无法重新连接到先前的终端实例并且必须以新的终端实例开始。< / p>

目前我们已经采用了增加GKE Loadbalancer的超时时间。但最终我们计划部署我们自己的Loadbalancer,它可以更好地处理这个问题。 Ingress有Ingress,我们现在不想忍受。