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

本地 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

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

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

mirrord

作为这三个工具中最新的一个,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 开发周期的瓶颈提供一种简单、有效且廉价的解决方案,并且随着这些工具的不断创新和发展,它将变得更加普遍。