这篇文章发布已超过一年。旧文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

对比本地 Kubernetes 开发工具:Telepresence、Gefyra 和 mirrord

Kubernetes 开发周期是一个不断发展的领域,有无数工具旨在简化此流程。每种工具都有其独特的方法,选择通常取决于具体的项目需求、团队专业知识以及偏好的工作流程。

在众多解决方案中,出现了一类我们称之为“本地 K8S 开发工具”的工具,它们旨在通过将本地运行的组件连接到 Kubernetes 集群来增强 Kubernetes 开发体验。这有助于在云条件下快速测试新代码,绕过传统的 Docker 化、CI 和部署周期。

在本文中,我们将比较这一类别的三种解决方案:Telepresence、Gefyra 以及我们自己的竞争者 mirrord。

Telepresence

作为同类中最古老、最成熟的解决方案,Telepresence 使用 VPN(更具体地说,是 tun 设备)来连接用户的机器(或本地运行的容器)与集群网络。然后,它支持拦截发送到集群中特定服务的传入流量,并将其重定向到本地端口。被重定向的流量也可以进行过滤,以避免完全中断远程服务。它还提供补充功能,支持文件访问(通过本地挂载到 Pod 的卷)和导入环境变量。Telepresence 需要在用户机器上安装一个本地守护进程(需要 root 权限)以及在集群上安装一个 Traffic Manager 组件。此外,它还在 Pod 上以 sidecar 的形式运行一个 Agent 来拦截所需的流量。

Gefyra

Gefyra 与 Telepresence 类似,使用 VPN 连接到集群。然而,它仅支持将本地运行的 Docker 容器连接到集群。这种方法增强了跨不同操作系统和本地环境的可移植性。但是,缺点是它不支持本地运行未容器化的代码。

Gefyra 主要关注网络流量,不支持文件访问和环境变量。与 Telepresence 不同的是,它不改变集群中的工作负载,确保在出现问题时清理过程简单明了。

mirrord

一个,它采用了一种不同的方法,通过将自身注入到本地二进制文件(在 Linux 上使用 LD_PRELOAD,在 macOS 上使用 DYLD_INSERT_LIBRARIES),并覆盖 libc 函数调用,然后代理它在集群中运行的临时 Agent。例如,当本地进程尝试读取文件时,mirrord 会拦截该调用并将其发送给 Agent,Agent 随后从远程 Pod 读取文件。这种方法使得 mirrord 能够统一覆盖进程的所有输入和输出——包括网络访问、文件访问和环境变量。

通过在进程级别工作,mirrord 支持同时运行多个本地进程,每个进程都在集群中其各自 Pod 的上下文中运行,无需将其容器化,也无需用户机器上的 root 权限。

总结

Telepresence、Gefyra 和 mirrord 对比
TelepresenceGefyramirrord
集群连接范围整个机器或容器容器进程
开发者操作系统支持Linux, macOS, WindowsLinux, macOS, WindowsLinux, macOS, Windows (WSL)
传入流量特性拦截拦截拦截或镜像
文件访问支持不支持支持
环境变量支持不支持支持
需要本地 root 权限
使用方式
  • 命令行界面 (CLI)
  • Docker Desktop 扩展
  • 命令行界面 (CLI)
  • Docker Desktop 扩展
  • 命令行界面 (CLI)
  • Visual Studio Code 扩展
  • IntelliJ 插件

结论

Telepresence、Gefyra 和 mirrord 各自提供了独特的方法来简化 Kubernetes 开发周期,各有优缺点。Telepresence 功能丰富但伴随复杂性,mirrord 提供无缝体验并支持多种功能,而 Gefyra 追求简洁和稳健。

在它们之间的选择应取决于您的项目具体需求、团队对工具的熟悉程度以及期望的开发工作流程。无论您选择哪种工具,我们都相信本地 Kubernetes 开发方法能够为 Kubernetes 开发周期中的瓶颈提供一种简单、有效且经济的解决方案,并且随着这些工具的不断创新和发展,这种方法将变得更加普及。