首页 > 解决方案 > 如何使用 Kubernetes 服务发现进行端口发现?

问题描述

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

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

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

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

如果可能的话,如果我能这样做,那就太好了:

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

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

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

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

标签: kubernetes

解决方案


事实证明,最好的方法是使用 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 上提供它们。


推荐阅读