在边缘集群的场景下边缘节点分布在不同的区域,且边缘节点和云端之间是单向网络,边缘节点可以访问云端节点,云端节点无法直接访问边缘节点,给边缘节点的运维带来很大不便,如果可以从云端SSH登录到边缘节点可以简化节点的运维工作。针对这一需求,[SuperEdge]项目扩展了 [tunnel]组件的能力,新增了 SSH 模块,让用户可以从云端 SSH 登录到边缘节点。

边缘集群的节点分布在不同的区域,边缘节点能够访问云端 master 节点,但 master 节点无法访问边端区域内的节点,用户希望通过访问 master 节点的端口 SSH 登录到节点实施运维工作。
使用 SSH 端口转发技术可以实现 SSH 运维边缘节点功能,具体内容如下图所示:


使用 [gRPC]开源项目搭建长连接隧道,gRPC 实现断开重连机制。


SSH Client 请求 tunnel-cloud service 的 NodePort-1端口,发送 method 为 Connect的http 请求
SSH Client 通过工具 netcat 或 crokscrew 发送的 method 为 CONNECT HTTP 请求,即 ProxyCommand 的内容(ProxyCommand= “nc -X connect -x tunnel-cloudIp:NodePort-1 node-A 22” ),参数的定义如下:
tunnel-cloud service 根据负载均衡策略将 SSH Client 的请求转发到 tunnel-cloud pod,如架构设计图3所示如果转发到 tunnel-cloud pod-A,tunnel-cloud 的 HTTP Server 收到的消息为 CONNECT node-A:22 HTTP/1.0 ,其中 node-A 为边端节点的节点名,22为边端节点 SSH Server 监听的端口,由于node-A没有与tunnel-cloud pod-A 建立云边隧道,因此 HTTP Server 会请求 coredns 获取 node-A 节点名对应的 tunnel-cloud 的 podIp,即为 tunnel-cloud pod-B , pod-A 会把请求转发给 pod-B
tunnel-cloud 向 tunnel-edge 发送自定义协议消息(StreamMsg.Type 为 connecting)
tunnel-cloud 会根据 HTTP CONNECT 的请求信息中获取云端和边端节点的隧道,并通过云边隧道向 tunnel-edge 发送自定义协议消息用于与 SSH Server 建立 TCP 连接,类型为 connecting
tunnel-edge 向 SSH Server 发送建立 TCP 连接的消息
tunnel-edge 在接收到 connecting 类型的自定义协议消息之后根据消息中 SSH Server 的ip和 port 发送建立TCP连接的请求
SSH Server 返回 TCP 连接建立成功的消息给 tunnel-edge
Tunnel-edge 返回自定义协议消息(StreamMsg.Type 为 conneted)给 tunnel-cloud
tunnel-edge 在收到连接建立成功的消息后向 tunnel-cloud 发送一个 TCP 连接已建立的类型 connected 的自定义协议的消息
tunnel-cloud 返回 SSH Client 状态为 200 的 reponse 消息
tunnel-cloud 在接收到 connected 的自定协议消息后会 SSH Client 返回一个状态码为 200的消息: HTTP/1.1 200 Connection established
SSH Client 向 tunnel-cloud 发送 SSH 协议的消息
SSH Client在接收到状态码为200的响应消息后,使用和 tunnel-cloud 已经建立的隧道发送 SSH 协议数据
tunnel-cloud 将 SSH 协议的消息封装为自定义协议消息(StreamMsg.Type 为 content)发送给 tunel-edge
tunnel-edge 将 SSH 协议消息通过TCP连接发送给 SSH Server
SSH Server 将 SSH 协议消息发送给 tunnel-edge
tunnel-edge 将 SSH 协议消息封装为 content 类型的自定义消息发送给 tunnel-cloud
tunnel-cloud 将 SSH 协议消息返回给 SSH Client
安装 [corkscrew],Mac 直接使用 brew 安装
brew install corkscrew
或者,安装netcat(centos)
yum install -y netcat
SSH 登录边缘节点 node-A-1,可以使用下面的命令:
ssh -o ProxyCommand= "corkscrew masterIP cloud-port node-A-1 22" root@127.0.0.1
或者
ssh -o ProxyCommand= "nc -X connect -x masterIP:cloud-port node-A-1 22" root@127.0.0.1
kubectl -n edge-system get svc tunnel-cloud -o=jsonpath='{range .spec.ports[*]}{.name}{"t"}{.nodePort}{"n"}{end}' | grep ssh | awk '{print $2}'
使用该方案,用户无需手动搭建,可以快速SSH登录边端节点,实施运维工作。同时本方案提供的隧道相对传统方案更便于维护且提高了稳定性,用户体验得到提升。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1536/viewspace-2797021/ ,如需转载,请注明出处,否则将追究法律责任。