【发布时间】:2021-10-27 06:07:22
【问题描述】:
我正在使用 kubernetes,我想创建能够在某些接口上执行 tcpdump 的工具。
问题是这个工具是由 POD_A 中的容器 container_A 控制的,它没有安装 tcpdump(我可以'此时不要更改它),而 tcpdump 能力可以从 POD_B 中的 container_B 执行(不同于 POD_A)
所以我选择的解决方案是在不同的容器上创建tcpdump(POD_B中的container_B),然后从中移动转储文件>container_B 到 container_A。
为此,我使用了接近此处提供的解决方案:
Copy file from pod to host by using kubernetes python client
现在的问题是,对于使用此解决方案,我知道在将转储文件复制到目标容器之前,应该在源容器上关闭转储文件。这可能会导致 container_A 上的磁盘使用率很高,而 container_B 上的磁盘空间很大。
我会将链接中的代码粘贴到此处以供参考
def stream_copy_from_pod(self, pod_name, name_space, source_path, destination_path):
"""
Copy file from pod to the host.
:param pod_name: String. Pod name
:param name_space: String. Namespace
:param source_path: String. Pod destination file path
:param destination_path: Host destination file path
:return: bool
"""
command_copy = ['tar', 'cf', '-', source_path]
with TemporaryFile() as tar_buffer:
exec_stream = stream(self.coreClient.connect_get_namespaced_pod_exec, pod_name, name_space,
command=command_copy, stderr=True, stdin=True, stdout=True, tty=False,
_preload_content=False)
# Copy file to stream
try:
reader = WSFileManager(exec_stream)
while True:
out, err, closed = reader.read_bytes()
if out:
tar_buffer.write(out)
elif err:
logger.debug("Error copying file {0}".format(err.decode("utf-8", "replace")))
if closed:
break
exec_stream.close()
tar_buffer.flush()
tar_buffer.seek(0)
with tarfile.open(fileobj=tar_buffer, mode='r:') as tar:
member = tar.getmember(source_path)
tar.makefile(member, destination_path)
return True
except Exception as e:
raise manage_kubernetes_exception(e)
我的问题是,我能否以某种方式使用 exec_stream 和示例中提供的 addaptaion(或另一个 kubernetes-client python api)和 tcpdump 命令 om container_B 将 tcpdump 直接流式传输给某些人container_A 上的 tarball 文件(或其他类型的文件)?
我的假设是,我只需要打开流 container_B 并发送 command="tcpdump ...",它会将 tcpdump 流式传输到此容器的标准输出,然后从流中“获取”+“处理”这个标准输出到container_A 中的文件,但是有更好的方法吗?
【问题讨论】:
-
这个堆栈中有多少在您的控制之下?你能在
image_B的Dockerfile中安装tcpdump吗?或者在image_B中提供一个网络可访问的接口,以便您可以HTTP POST完成转储文件?或者将流增量转储到网络可访问的存储,或像 Kafka 这样的流式消息传递系统? -
@DavidMaze 我无法在
image_B上安装tcpdump,但我可以将流增量转储到网络可访问的存储或流式消息传递系统。这实际上是我正在寻找并想了解如何使用kubernetesapi(或者可能使用您提到的 kafka 之类的第三方包)
标签: kubernetes kubernetes-pod tcpdump