作者:Francis Laniel
Inspektor Gadget 可以通过多种方式在 Kubernetes(k8s)集群上使用:
-
作为针对特定 k8s 节点的一次性调试命令,使用 kubectl-debug。 -
作为长期监控解决方案,结合定制工具、日志服务或行业标准工具如 Prometheus。 -
作为跨 k8s 集群的交互工具,使用 kubectl-gadget。 -
作为集成在应用中的 golang 包。
在这篇博客中,我们将重点介绍如何使用 Inspektor Gadget 作为一次性调试命令,通过 kubectl debug。这条命令允许以交互方式调试特定的 k8s 节点。它不自带调试工具,而是依赖于指定任何容器镜像,在命令生命周期内作为调试容器运行。由于 ig 也可以作为容器镜像使用,我们可以利用它通过 kubectl debug 来运行:
$ kubectl debug --profile=sysadmin node/minikube-docker -ti --image=ghcr.io/inspektor-gadget/ig -- ig trace exec
Creating debugging pod node-debugger-minikube-docker-c2wfw with container debugger on node minikube-docker.
If you dont see a command prompt, try pressing enter.
RUNTIME.CONTAINERNAME PID PPID COMM RET ARGS
k8s_shell_shell_default_b4ebb… 3186934 3186270 cat 0 /bin/cat file
ig 运行 eBPF 程序的要求
要运行 eBPF 程序并增强生成的事件,ig 需要以特权进程运行。特别地,它依赖于 Linux 内核提供的若干能力。Linux 内核能力是限制任务特权的手段,而不是让任务拥有全局特权。例如,具有 CAP_KILL 的任务可以向其他任务发送信号。在 ig 的情况下,我们依赖于 CAP_SYS_ADMIN 等能力。
通过 kubectl debug 初次运行 ig
起初,无法轻松地使用 kubectl debug 运行 ig,因为后者缺少特权执行配置文件。为了解决这个问题,我们添加了一个变通方法,将 ig 作为 systemd 单元运行。这样,ig 可以获得在 kubectl debug 中运行时缺失的特权。因此,用户可以使用以下命令运行 ig:
$ kubectl debug node/minikube-docker -ti --image=ghcr.io/inspektor-gadget/ig -- ig --auto-sd-unit-restart trace exec
Creating debugging pod node-debugger-minikube-docker-c2wfw with container debugger on node minikube-docker.
If you dont see a command prompt, try pressing enter.
CONTAINER PID PPID COMM RET ARGS
k8s_test01_test01_default_0aca2685-a8d2-49c7-9580-58fb806270… 1802638 1800551 cat 0 /bin/cat README
向 kubectl debug 添加 sysadmin 配置文件的上游工作
随后,我们决定通过添加特权配置文件来改进 kubectl debug,因为这对 ig 是必要的,同时对其他工具也有帮助。因此,我们提交了一个PR[1],以将 sysadmin 配置文件添加到 kubectl debug。此 PR 的审核过程显示,最初的 Kubernetes 增强提案(KEP)需要更新。确实,KEP 建议 sysadmin 配置文件仅具有 CAP_SYS_ADMIN 而使用特权则更合适。因此,我们也提交了一个PR[2]来更新相应的 KEP。随着这个 PR 的合并,我们能够合并第一个 PR,将 sysadmin 配置文件添加到 kubectl debug。
移除 ig 的变通方法
sysadmin 配置文件功能将在 kubectl debug 1.30.0 中实现。与此同时,我们致力于移除在 ig 中基于 systemd 的变通方法,最终目标是使用以下命令来运行 ig:
$ kubectl debug --profile=sysadmin node/minikube-docker -ti --image=ghcr.io/inspektor-gadget/ig -- ig trace exec
可惜的是,在测试时,我们发现 list-containers 命令存在一些问题。特别是,该命令并未依赖主机文件系统来查找容器运行时套接字路径。我们提交了一个PR[3]来修复这个问题。请注意,之前的提交以及为另一个贡献编写的提交使我们能够在运行 ig 时不再需要挂载/run 作为卷。
随着这个 bug 的修复,现在是时候去掉整个--auto-sd-unit-restart 变通方法了。
总结
经过这些工作,你现在可以简单地通过 kubectl debug 使用以下命令运行 ig:
$ kubectl debug --profile=sysadmin node/minikube-docker -ti --image=ghcr.io/inspektor-gadget/ig -- ig trace exec
Creating debugging pod node-debugger-minikube-docker-c2wfw with container debugger on node minikube-docker.
If you dont see a command prompt, try pressing enter.
RUNTIME.CONTAINERNAME PID PPID COMM RET ARGS
k8s_shell_shell_default_b4ebb… 3186934 3186270 cat 0 /bin/cat file
这项工作展示了“上游优先”思维的重要性。确实,现在人们更容易运行 ig,而 kubectl debug 也获得了一个有用的新调试功能。
致谢
这项工作得以实现,离不开以下人员的建议和审查:Alban Crequy、Arda Güçlü、josemotafbn、kfox1111、Gerard de Leeuw、Keita Mochizuki、Maciej Szulik 和 Lee Verberne。我们对此表示感谢!
PR: https://github.com/kubernetes/kubernetes/pull/119200
[2]PR: https://github.com/kubernetes/enhancements/pull/4234
[3]PR: https://github.com/inspektor-gadget/inspektor-gadget/pull/3030
(版权归原作者所有,侵删)
免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!

原文始发于微信公众号(Docker中文社区):在K8s使用ig,无需安装,感谢kubectl debug
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论