云原生时代还是逃不了 ssh 管理主机的命运, 除了使用跳板机和专门代理, 基本没有好办法处理配置管理和进行安全审计, 尤其是需要多个团队管理大规模分布式集群的时候这个问题就会十分头疼, 当然也有不少方案尝试解决这个问题.
Kubernetes 内置了 kubectl exec/attach/port-forward/cp
, 这就已经是一个完整的 ssh 套件了, 不过内置的这些功能仅限于对容器的操作, 对于节点可以使用 kubectl
插件 node-shell
访问宿主机 shell (也就是通过部署 nsenter pod 访问所有 host namespace), 但是又缺少了端口转发功能.
在阅读 kubelet 源码摸清了 exec/port-forward
等操作的实现原理后, 我就着手实现一整套解决方案方便我远程管理没有公网 IP 的设备: 包括但不限于家里的 op 路由器, 树莓派, windows 主机, mbp 等
为了支持上述类型的设备, 整套方案必须轻量且跨平台, 不可能直接部署一个 kubelet 上去, 哪怕是自称轻量化的 k3s 也不行, 于是便有了这样两个项目:
aranya 用于为每个节点生成虚拟 kubelet, 用户仅需为每个节点定义一份 EdgeDevice 即可完成云端部署, 随后将 arhat 部署到物理节点主机 (或者 privileged pod), 配置完成之后运行, 然后就可以通过 kubectl 管理物理节点, 具体如何配置和架构设计可以移步项目内部介绍, 在此不作赘述.
arhat 不光能跑在 linux 主机上, 在我的 wndr4300 和 r6300 路由器上也可以跑, truenas (freebsd), macos 里也可以, 也实现了 windows tty (需要 win10 1809+ 且目前还有 bug), 手动测试了几乎所有我能想到的平台, 都可以跑 (嗯? 测试自动化?)
目前测试发现弱网络环境下通过 kubectl+aranya+arhat 经由 mqtt 访问会比 ssh 直连访问更顺畅, 尤其是端口转发 (可能是因为多路复用的关系), 也得益于 mqtt qos1 的消息送达保障机制, 断线重连的话会自动恢复数据传输, 对于 kubectl cp
帮助很大, 因为有 mq 在缓存, 基本不需要担心连接中断问题, 但是没有进度条显示很尴尬.
替代 ssh 只是其中一部分功能, 当然也是目前的主要功能之一 (另一个主要功能是替代会暴露主机端口的 node_exporter/windows-exporter), 此外还有 pod 管理, vpn 网格管理, 外设管理等还在设计和开发中, 欢迎各位对项目提出宝贵意见和 pr
回到开头的问题再看一下这里的解决方案: 用 namespace 划分团队, 用 RBAC+SSO 进行访问控制, 通过 mq 或者 kubernetes api-server 进行安全审计.
碎碎念: 这其实是我两年前大学毕设的课题, 开源这个项目后找到了相关工作机会, 工作内容就是围绕这个项目做操作系统相关的周边开发, 项目也随之闭源了, 但是后面和老板理念不合就离职了, 离职前签了知识产权协议, 相关项目成果都归我 (在公司也只有我一个人做相关开发, 没人交流很难受), 也就是说项目从头到尾只有我一个人 (苦笑), 如果对你有用的话点个 star 支持一下吧
最后, 目前的架构设计如下 (aranya 视角)
1
solider245 2020-12-06 09:19:56 +08:00
有没有落地的案例呢?
这么一大段,着实有点看不懂 |
2
feelapi 2020-12-06 09:34:05 +08:00
这个方案很有意义,但是使用场景我能想到的,是要求比较高的一些传统大企业,但是他们还没进化到明白的方案的程度,而互联网公司其实是不需要的,所以我觉得比较尴尬。但是没关系,这个方案的实现证明了你的技术实力,加油吧少年。
|
3
xiaket 2020-12-06 09:49:01 +08:00
AWS 的世界里有 SSM session manager, 做法是每个机器上有一个特殊的 agent, 如果 EC2 机器上绑了特定的权限, 而且用户又有特定权限的话, 就可以直接连到这台机器执行命令, 所有的操作都可以被记录下来供审计调阅. 所以我们现在完全不用 ssh 了.
话说要用一个 agent 来替代 ssh 很容易, 你所提到的配置管理和安全审计在我看来也是不难实现的, 但是解决信任的问题, 很难. |
4
jeffreystoke OP @feelapi 解决的不仅仅是一开头提到安全问题,是为了方便所有需要管理大规模设备的对象,包括但不限于云服务提供商,物联网集群维护人员,家庭主机管理者,你说互联网公司不需要,我暂时无法赞同,可以尝试说服我。
|
5
jeffreystoke OP @xiaket 不是很明白这里说的信任问题,如果是指鉴权,这里提供原生 kubernetes rbac 进行授权管理,也可以自定义 sso 接入 kubernetes,kubernetes 还可以集成 iam,没看到任何不如 ssm 的地方
|
6
Lemeng 2020-12-06 10:09:01 +08:00
有点意思,期待实例
|
7
tiedan 2020-12-06 11:46:40 +08:00
我记得这个项目
|
8
jeffreystoke OP @tiedan 是说的这个吗 https://v2ex.com/t/561882 , 如果是的话还是我
|
9
tiedan 2020-12-06 12:17:22 +08:00
@jeffreystoke 对的对的,我之前还纳闷怎么找不到这个项目了,我本地当时还 clone 了一份
|
10
jeffreystoke OP @tiedan 哈哈, 结果现在一看, 过去了一年多还是没加测试, 这开发者可太行了 (其实是还在构思 kubernetes 测试方案, 打算造个轮子)
|
11
zsj950618 2020-12-06 13:09:22 +08:00 via Android
|
12
eudore 2020-12-07 09:00:42 +08:00
我自己用 go 实现过一个 sshd,ssg 应用层协议都实现了(就差没多进程)。权限可以再跳板机上实现,日志在跳板机和本地都有可以记录,操作权限我自己想法是 strace 去中断,太菜没实现。
在云原生时代直接容器部署,就没操作物理机这个东西,公司的就 4-5 个服务器装开发测试工具,业务都部署容器里面了,worker 我到现在都没登录过,都是自己本地 kubectl 操作的。 |
13
lastone6210 2020-12-07 09:44:09 +08:00
没有接触过这种级别的项目, 不过如果只是"主机本身的管理"的话 那不就是 IPMI 么
通过各服务器厂家自己的管理工具, 或者行业统一的 Redfish 实现批量管理.... Redfish 甚至是用的 RestfulAPI 协议... |
14
joesonw 2020-12-07 13:26:59 +08:00
jumpserver?
|
15
zoharSoul 2020-12-07 14:05:05 +08:00
有点意思
|