如何使用Kubernetes服务发现进行端口发现?

如何使用Kubernetes服务发现进行端口发现?,kubernetes,Kubernetes,我有一个HPC集群应用程序,我希望用Kubernetes和一些中间件(很可能是ZMQ或RabbitMQ)的组合来取代MPI和我们的内部集群管理软件 我正试图设计如何最好地使用Kubernetes的服务发现在这个系统上进行对等发现 我知道Kubernetes可以为给定的服务提供DNS名称,这很好,但是有没有一种方法可以动态发现端口 例如,假设我用ZeroMQ替换了MPI中间件,我需要一种让列组(集群上的进程)找到彼此的方法。我知道我可以简单地让ranks向Kubernetes发现机制发送服务创建消

我有一个HPC集群应用程序,我希望用Kubernetes和一些中间件(很可能是ZMQ或RabbitMQ)的组合来取代MPI和我们的内部集群管理软件

我正试图设计如何最好地使用Kubernetes的服务发现在这个系统上进行对等发现

我知道Kubernetes可以为给定的服务提供DNS名称,这很好,但是有没有一种方法可以动态发现端口

例如,假设我用ZeroMQ替换了MPI中间件,我需要一种让列组(集群上的进程)找到彼此的方法。我知道我可以简单地让ranks向Kubernetes发现机制发送服务创建消息,并相当容易地获得像myapp_mypid_rank_42这样的主机名,但是我如何处理端口呢

如果可能的话,如果我能做到:

zmqSocket.connect("tcp://myapp_mypid_rank_42");
但我不认为这会起作用,因为我没有来自DNS的端口号信息

如何让Kubernetes服务发现以尽可能简单的方式提供一个端口,以允许集群中的列组相互发现


注意:注册进程知道它的端口,可以向K8s服务发现守护进程注册它。问题是如何快速简便地为需要该端口号的进程获取该端口号。我要问的问题是,是否有一个像DNS主机名这样简单的机制,或者我需要从k8s守护进程显式地查询主机名和端口号,而不是简单地根据商定的规则构建主机名(比如从myapp_mypid_myrank构建字符串)?

我认为在最常见的情况下,您应该知道访问服务的端口号


但如果有用的话,Kubernetes会在每个pod中添加一些环境变量,以简化所有服务的自动发现。例如{SVCNAME}{u服务}主机和{SVCNAME}{u服务}端口

最好的方法是使用DNS SRV记录:

DNS SRV记录为给定请求提供主机名/IP和端口


幸运的是,Kubernetes服务发现支持SRV记录,并在集群的DNS上提供这些记录。

定义服务时,您放下了服务端口。它不是一个变量,端口是您输入的任何数字。注入有很多种方法,您可以通过它获得端口号,但从根本上说,这是您在服务定义上写下的内容。注册过程在注册时知道端口号。这不是问题所在。问题是要取回端口号。k8s的环境变量功能没有帮助,因为它受竞争条件的影响,并且没有重新连接功能。然后我认为唯一的方法是另一个带有守护进程的容器,该守护进程调用Kubernetes API来更改服务,并因此更新其他POD。