本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
本地 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 | |
---|---|---|---|
集群连接范围 | 整台机器或容器 | 容器 | 进程 |
开发者操作系统支持 | Linux、macOS、Windows | Linux、macOS、Windows | Linux、macOS、Windows (WSL) |
传入流量功能 | 拦截 | 拦截 | 拦截或镜像 |
文件访问 | 支持 | 不支持 | 支持 |
环境变量 | 支持 | 不支持 | 支持 |
需要本地 root | 是 | 否 | 否 |
如何使用 |
|
|
|
结论
Telepresence、Gefyra 和 mirrord 各自提供了简化 Kubernetes 开发周期的独特方法,每种方法都有其优点和缺点。Telepresence 功能丰富,但带有复杂性,mirrord 提供无缝体验并支持各种功能,而 Gefyra 则以简单性和稳健性为目标。
您在它们之间的选择应取决于您的项目的具体要求、您的团队对工具的熟悉程度以及所需的工作流程。无论您选择哪个工具,我们都相信本地 Kubernetes 开发方法可以为 Kubernetes 开发周期的瓶颈提供一种简单、有效且廉价的解决方案,并且随着这些工具的不断创新和发展,它将变得更加普遍。