首页 > 解决方案 > 父/子 kubernetes pod 通信

问题描述

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

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

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

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

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

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

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

标签: kubernetesmicroservices

解决方案


父 pod(测试)和子 pod(shm)之间的通信是进程间(ipc),并且套接字应该驻留在 /tmp/shm2/shmSocket

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

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

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

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

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


推荐阅读