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