译者 | 张锋
审校| 孙淑娟 梁策
KoolKits(Kubernetes工具包)是针对Kubernetes的高度匹配、基于特定语言、一组有调试容器功能的镜像。在实践中,如果你在不熟悉的shell中进行艰难的调试时卡住了,那么在生产的Pod上,你就会很希望用到这个工具。
在这里简单介绍下背景,请注意这些容器镜像旨在与新kubectl debug功能一起使用,该功能用来启动临时容器以进行交互式排障。KoolKit将作为容器被kubectl debug拉起,在你的Pod中运行,并且能够访问与原始容器相同的进程命名空间。
由于生产容器内置调试工具通常是相对简单的,使用KoolKit可以提供强大的工具进行排障,而不是依赖由最初构建生产镜像的人有意(或无心)留下的简陋工具。
每个KoolKit中的工具都是经过精心挑选的,你可以在下面阅读更多关于整个项目背后的用意。
如果您迫不及待只是想看看有用的内容,请随时查看GitHub上的完整项目。
调试Kubernetes很难
了解Kubernetes中pod内部发生的事情并非易事。
首先,你的应用不再是单一的实体。它由多个pod组成,为水平扩展进行复制,有时甚至分散在多个集群中。
其次,要使用本地工具(如调试器)访问你的应用,你需要处理令人讨厌的网络问题,如自动发现和端口转发,这会减缓此类工具的使用速度。
此外,分布式系统改变或完全停止正在运行的pod的状态(例如,当放置断点时)可能会导致系统其他部分的连锁性故障,这将加剧现有问题。
KoolKits背后的用意(起因)
Lightrun[1]是在考虑Kubernetes情况下构建的。我们工作时会跨多pod、多集群甚至多云。我们很早就明白,通过使用正确的工具能为做故障诊断的开发人员提供强大动力。我想我们应该以某种方式回馈社区,这也就是我们提出KoolKits想法的原因。
让我们花点时间来解释一下为什么KoolKits非常有用:
有一个著名的Kubernetes最佳实践指出应该构建小型容器镜像。出于几个不同的原因,这是有道理的:
- 构建镜像将消耗更少的资源(即CI小时数)。
- 拉取镜像将花费更少的时间(谁愿意为这么多的Ingress付费?)。
- 在一个连无操作日志都不再安全的世界里,更少的东西意味着暴露在安全漏洞下的区域越小。
这里还有很多工具可以帮助你在不用做太多繁重工作的情况下实现目标:
- Alpine Linux基础镜像非常小。
- DistroLess Docker 镜像更进一步,删除了除运行时之外的所有内容。
- Docker多级构建有助于创建精简的最终生产镜像。
当你尝试去调试这些容器内发生的事情时,问题很容易出现。通过使用小型生产镜像,你放弃了大量工具,而这些工具在解决应用程序中的问题时非常宝贵。
通过使用KoolKit,你可以在不影响质量工具的情况下让自己享受小型生产镜像的好处。每个KoolKit都包含为它所代表的特定运行时精心挑选的工具,此外还有一套基于Linux系统更通用的工具。
注:KoolKits的灵感来自kubespy和netshoot。
注意事项
在构建这些镜像的过程中,我们做出了很多决策。下面列出了我们考虑的一些事项。
镜像大小
KoolKits Docker 镜像倾向于运行。KoolKit旨在下载一次,保存在集群的Docker仓库中,然后根据需要以容器的方式立即启动。因为它们不是为了持续拉动而设计的,而是为了装有用的工具,这个副作用也是我们能忍受的。
使用Ubuntu基础镜像
很难创建一个精简镜像的部分原因是,我们决定使用完整的Ubuntu 20.04系统作为每个KoolKit的基础。这主要是因为我们希望复制你将在集群内做本地调试的相同环境。
比如,这意味着不要乱用Alpine替代你习惯使用的普通Ubuntu软件包。实际上,这意味着我们可以在每个KoolKit中包含没有Alpine版本的工具。
使用语言版本管理器
每个KoolKit都尽可能使用语言版本管理器,而不是依赖于特定语言的发行版。这样做是为了让你可以轻松安装较旧的运行时版本,如果需要的话允许你在运行时版本之间随意切换(例如,为了获取仅存在于特定运行时版本的特定工具版本)。
可用的KoolKits
存储库中的每个文件夹都包含KoolKit后面的Dockerfile和调试镜像的简短说明。所有KoolKit都基于ubuntu:20.04基础镜像,让每个人都使用自己熟悉的shell。
可用的 KoolKit 列表:
1. koolkit-jvm–采用OpenJDK 17.0.2 和相关工具(包括jabba以便于版本管理和Maven 3.8.4)
2. koolkit-node–Node 16.13.1和相关工具(包括nvm以便于版本管理)
3. koolkit-python–Python 3.10.2 和相关工具(包括pyenv以便于版本管理)
请注意,你实际上不必自己构建它们:所有KoolKit都在Docker Hub上公开托管并且免费提供。
KoolKits 即将推出
- 一个全新的 Go 1.17.7 KoolKit
- JVM KoolKit: jvm-profiler,jHiccup支持
- Node.js KoolKit: llnode,thetool 支持
- Python KoolKit: vardbg, memprof 支持
贡献
如果还有遗漏的工具,请提交问题告知你的建议即可,我们非常乐意将它们添加到任何镜像中。
附注1:Lightrun公司提供了一个可观察性平台,允许开发人员在运行时插入日志、指标和跟踪等,并简化事件解决的各个方面,从而让开发人员深入了解正在运行的应用程序。
译者介绍
张锋,51 CTO社区编辑,长期从事技术顾问工作,专注于运维/云原生领域,精通网络疑难故障分析,有很丰富的大型银行运维工具建设实践经验。
原文标题:Introducing KoolKits: OSS Debugging Toolkits for Kubernetes,作者:Tom Granot