【问题标题】:Parent/child kubernetes pod communication父/子 kubernetes pod 通信
【发布时间】:2021-10-04 12:05:21
【问题描述】:

是否可以通过正在运行的容器生成新的 kubernetes pod?我们想通过对它执行各种操作(如查询、获取、创建和删除)来测试这个 pod。

最初该服务在原生 Windows API 和 docker 上运行,因此我们必须实现一种机制来在每次测试之前和之后重新启动服务。据我所知,kubernetes 默认知道这一点,或者至少这应该不难实现。

父 pod(测试)和子 pod 之间的通信是进程间 (ipc) 并且套接字应该驻留在 /tmp/p2/psocket 中(因此它具有不同的套接字)。不幸的是,测试无法连接到 pod 并且没有在磁盘上创建套接字。可能是安装错误?

我感觉整个概念都很糟糕。我想pod之间不应该有父子关系,而是多容器pod进行测试,其中第一个容器是测试过程本身,另一个是shm。

但问题是“孩子”的寿命不应该与测试吊舱相同。每次测试场景完成它自己的东西时,“孩子”都应该重新启动。

我的问题基本上是如何执行这样的事情,或者这种情况有什么最佳实践吗?我对 Kubernetes 相当陌生,因此欢迎任何想法或建议。我们使用 docker images 和 kind 来创建集群。

(之前我提到共享内存,但不是linux共享内存,而是完全不同的东西)。

【问题讨论】:

    标签: kubernetes microservices


    【解决方案1】:

    父pod(test)和子pod(shm)之间的通信是进程间(ipc),socket应该驻留在/tmp/shm2/shmSocket

    Pod 无法使用 Unix 套接字或共享内存相互通信。特别值得注意的是,任何两个给定的 Pod 都不能保证在同一个节点上,但是这些机制都不能跨主机边界工作。如果被测服务应该为其他东西提供共享内存接口,那么其他东西很可能需要在同一个容器中运行。

    如果被测服务可以提供 TCP 接口(包括 HTTP),那么您可以通过 Kubernetes 服务正常与其通信。没有它,它如何在 Kubernetes 中有效地运行并不明显。

    是否可以通过正在运行的容器生成新的 kubernetes pod? [...] 最初,该服务在本机 Windows API 和 docker 上运行....

    如果“父”pod 有一个正确的 Kubernetes ServiceAccount,以及一个允许它创建 pod 的 Role,并且有一个 RoleBinding 从一个到另一个,那么这是可能的;请参阅 Kubernetes API Overview。这样做的明显缺点是您必须专门使用 Kubernetes SDK 来执行此操作。这将是与 Windows 进程系统、Docker SDK 或 Linux fork/exec 调用不同的机制。

    如果进程的接口真的只是共享内存,您可以构建一个包含测试驱动程序和要测试的进程的单个 pod,并且测试驱动程序可以将应用程序作为子进程启动。具体如何做到这一点取决于您使用的语言;例如,在 Python 中,您将使用 subprocess 模块。此设置并不特定于任何特定的容器运行时,您也可以在没有容器的原生类 Unix 系统上以完全相同的方式运行它。

    【讨论】:

    • unix 套接字实际上通过hostpath mount 支持 pod。我已经用它来从 pod 到守护进程进行通信,例如 SPIRE
    • 只有在尝试通信的两个 pod 在同一个节点上时才有效;他们通常不会。
    • 过去我们只是通过 popen 从 C++ 启动一个 shell,并将 shm 进程作为 docker 容器生成。没有问题,测试可以连接到那个socket。
    • 生产 Pod 正在通过代理进行通信,这里我们只是想测试 shm 功能。
    • 目前我将 kubectl 复制到 pod 和 kubectl API 工作,但它似乎太“脏”?
    猜你喜欢
    • 2020-04-20
    • 2019-04-02
    • 2020-01-16
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多