【问题标题】:store tcpdump output in another POD - kubernetes将 tcpdump 输出存储在另一个 POD 中 - kubernetes
【发布时间】:2021-10-27 06:07:22
【问题描述】:

我正在使用 kubernetes,我想创建能够在某些接口上执行 tcpdump 的工具。

问题是这个工具是由 POD_A 中的容器 container_A 控制的,它没有安装 tcpdump(我可以'此时不要更改它),而 tcpdump 能力可以从 POD_B 中的 container_B 执行(不同于 POD_A)

所以我选择的解决方案是在不同的容器上创建tcpdumpPOD_B中的container_B),然后从中移动转储文件>container_Bcontainer_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,但我可以将流增量转储到网络可访问的存储或流式消息传递系统。这实际上是我正在寻找并想了解如何使用kubernetes api(或者可能使用您提到的 kafka 之类的第三方包)

标签: kubernetes kubernetes-pod tcpdump


【解决方案1】:

最终我决定使用 Async Thrift 来“管理”这个操作(创建的客户端-服务器),而不是使用 python kubernetes 库。

【讨论】:

    【解决方案2】:

    据我所知,您希望拥有一个执行 tcpdump 的容器,并将其关联到单个应用程序容器。这意味着您需要两个紧密耦合的容器。

    你很幸运,因为这正是多容器Pod的用例!

    将您的两个容器放在同一个PodEmptyDir 卷中,两个容器都可以访问它。这种类型的卷将数据存储在节点上并且是短暂的。在我看来,这比在两个单独的 pod 之间传输数据要简单,这两个 pod 可以位于两个 非常 遥远的节点上。

    【讨论】:

    • 感谢您的评论,我忘了提到这些容器在单独的 pod 中!所以实际上我的问题涉及从不同 PODS 中的两个容器传递数据。其中一个 POD 用于管理 - 这是调用命令的位置以及最终应存储文件的位置,另一个 POD 用作 Data POD 是可以从中执行 tcpdump 的位置。如果我们在两个不同的 PODS 中讨论两个不同的容器,有没有办法解决这个问题?
    猜你喜欢
    • 2020-09-18
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多