kubernetes - 如何使用 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 构建一个字符串)?
解决方案
事实证明,最好的方法是使用 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 上提供它们。
推荐阅读
- c# - 使用 Flex Layout xamarin 的绑定基础
- php - 根据特定的键和值合并两个 php 数组
- mongodb - 可以在 $sert, $unset of update(aggregate) 中使用相同的字段吗
- ng2-smart-table - ng2-smart-table 列样式更改
- mysql - MySQL - 查询优化 - 按来自不同连接表的多个字段排序
- sql - 比较另一个 id 下属于不同 ids 组的行并将结果打印在单独的列中
- amazon-web-services - 如何在启动 systemd 服务之前运行 AWS EC2 实例的用户数据?
- mongodb - 如何根据传递我们在 Mule 4 中转换的先前字段从 dataweave 中的 MongoDB 获取数据
- ios - 反应本机ios目标c,无法在前台接收推送通知
- string - 将变量的 Julia REPL 输出作为字符串获取