本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
比较本地 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
作为这三个工具中最新的一个,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 开发周期的瓶颈提供一个简单、有效且经济的解决方案,并且随着这些工具的不断创新和发展,这种方法将变得更加普遍。