目录

cilium-agent远程debug

概述

通过远程 debug,来分析 cilium-agent 是如何在容器创建的时候定义容器网络接口。

编译cilium-agent

首先是在本地编译 cilium-agent,下面是以 v1.14.4 的代码作为例子来阐述,这一步可以在本地的开发机中执行。

1
2
3
4
5
curl -LO https://github.com/cilium/cilium/archive/refs/tags/v1.14.4.zip
unzip v1.14.4.zip
cd cilium-v1.14.4/daemon
# 其中-gcflags="all=-N -l"是为了防止编译内联和优化导致无法远程debug
GOOS=linux GOARCH=amd64 go build -gcflags="all=-N -l" -o cilium-agent

运行cilium-agent

为了不重新打镜像,可以将重新编译后的 cilium-agent 放入到容器再启动。这里要 Hack 一下,把 Cilium 的 DaemonSet 中的 cilium-agent 的容器改用 sleep inf 的方式启动,并且将几个探针都删除,避免容器会因为探针而重启,这些都操作完之后,就可以进入到容器中手动执行下面的命令,启动远程 debug。关于 dlv 就不赘述了,可以在本地编译再上传到容器。

1
2
3
4
      - args:
        - --config-dir=/tmp/cilium/config-map
        command:
        - cilium-agent
1
2
3
4
      - args:
        - inf
        command:
        - sleep

可以参考下面的命令,在容器内启动进程,dlv 将会在本地打开12345端口。

1
dlv --listen=:12345 --headless=true --api-version=2 --accept-multiclient exec /usr/bin/cilium-agent -- --config-dir=/tmp/cilium/config-map

开启远程debug

/cilium-agent%E8%BF%9C%E7%A8%8Bdebug/img.png

注意上面填写的 IP 是运行 cilium-agent 的节点 IP,并且需要保证指定的端口是开放的,之后就可以进入 debug 的过程了,通过远程 debug,可以很清晰的了解 Cilium 是如何创建 Endpoint,以及如何将 eBPF 程序进行编译和 attach 到指定的网卡上的。

这里要注意,cilium-agent 启动失败,有可能会被 cilium-operator 标记一个 cilium-agent not ready 的污点,因此需要注意,如果在部署这个特殊的 cilium-agent 的时候,发现 Pod 无法正常运行,可以手动把节点上的污点去掉。

/cilium-agent%E8%BF%9C%E7%A8%8Bdebug/img_1.png

参考资料

  1. Cilium官方文档
警告
本文最后更新于 2023年11月12日,文中内容可能已过时,请谨慎参考。