我正在寻找一种将 Kubernetes pod 上的二进制文件流式传输(“尾部”)到我的本地计算机的方法。
我试过这个:
kubectl exec -it app-service-58697cf7c9-nnzgh -c tcpdumper -- tail -f -c +0 /output.pcap
(
tcpdumper
只是 tcpdump
的薄包装,它作为 Pod 中的辅助容器运行)。
这几乎有效。当我运行此命令时,我可以在本地计算机上查看二进制数据流。
我在这里尝试做的最终目标是,我想获取 pcap 数据的二进制流并将其通过管道传输到我的计算机上运行的 Wireshark。这是行不通的,因为数据并不完全是 Pod 上写入的数据。
相关的不是 Kubernetes,也不是数据包捕获。问题似乎在于我如何使用
tail
传输这些数据;当我以这种方式执行此操作时,tail
似乎添加了换行符。我认为这是因为 tail
不打算处理二进制数据。
如果我直接在 pod 上运行
tcpdump
,将其写入那里的 .pcap 文件,然后使用 kubectl cp
传输该文件,然后将该文件加载到 Wireshark 中,它就可以工作,我可以查看网络流量。我可以使用十六进制编辑器看到此方法与上面的tail
方法之间的区别在于,经常会出现无关的字符(“0xD”,即换行符)。
有什么想法吗?
我不确定是什么导致 tail 随机插入换行符,我无法重现您的问题,但我确实有几个想法:
1:在服务器上写入文件时对文件进行 Base64 编码,并在本地计算机上读取文件时对文件进行 Base64 解码。
2:不要写入文件,而是尝试写入 fifo (mkfifo),您可以简单地对其进行cat,而不是拖尾。
如果不更好地了解您的情况,我无法真正明智地谈论这些是否适用于您的情况,但认为它们值得一提。
我发现问题与
kubectl
输出有关,而不是 tail
本身添加换行符。
kubectl exec -it [pod_name] -c [container] -- bash -c "/usr/sbin/tcpdump -n -w - 2>/dev/null" | LC_ALL=C tr -d '\n' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -
这里一些主要组件的简短说明:
/usr/sbin/tcpdump -n -w - 2>/dev/null
:写入标准输出,但抑制 tcpdump 控制台输出,这会干扰流式传输到wireshark。LC_ALL=C tr -d '\n'
,删除换行符并使用 C 语言环境,以便我们可以对二进制流进行操作。/Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -
:打开wireshark (macOS) 并立即开始从stdout 进行捕获。