云原生时代还是逃不了 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 视角)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.