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

时间:2018-05-21 19:10:19

标签: kubernetes

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

我试图使用Kubernetes'来设计如何在此系统上最佳地进行对等点发现。服务发现。

我知道Kubernetes可以为给定的服务提供DNS名称,这很棒,但有没有办法动态发现端口?

例如,假设我用ZeroMQ替换了MPI中间件,我需要一种方法来排名(群集上的进程)找到彼此。我知道我可以简单地让级别向Kubernetes发现机制发出服务创建消息,并且很容易获得类似myapp_mypid_rank_42的主机名,但是我该如何处理该端口呢?

如果可能的话,如果我能这样做会很棒:

zmqSocket.connect("tcp://myapp_mypid_rank_42");

但我不认为这样可行,因为我没有来自DNS的端口号信息。

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

注意:注册过程知道其端口,并可以将其注册到K8s服务发现守护程序。问题是一种快速简便的方法,可以为需要它的进程返回该端口号。我问的问题是,是否存在简单机制作为DNS主机名,或者我是否需要显式查询主机名端口号来自k8s守护进程而不是简单地根据一些商定的规则构建主机名(比如从myapp_mypid_myrank构建一个字符串)?

2 个答案:

答案 0 :(得分:1)

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

https://kubernetes.io/docs/concepts/services-networking/service/#discovering-services https://en.wikipedia.org/wiki/SRV_record

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

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

答案 1 :(得分:0)

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

但如果它有用,Kubernetes会为每个pod添加一些环境变量,以简化所有服务的自动发现。例如{SVCNAME} _SERVICE_HOST和{SVCNAME} _SERVICE_PORT。 Docs here