【问题标题】:How can I do port discovery with Kubernetes service discovery?如何使用 Kubernetes 服务发现进行端口发现?
【发布时间】:2018-10-31 11:40:20
【问题描述】:

我有一个 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 构建字符串)?

【问题讨论】:

  • 你在定义服务的时候放下服务端口。这不是一个变量,端口是您输入的任何数字。有很多注入方法,你可以通过它获取端口号,但基本上它是你在服务定义上写的

标签: kubernetes


【解决方案1】:

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

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

【讨论】:

  • 注册进程注册时知道端口号。那不是问题。问题是取回端口号。 k8s 的环境变量特性没有帮助,因为它受竞争条件的影响并且没有重新连接能力。
  • 那么我认为唯一的方法是使用另一个带有守护进程的容器,该守护进程调用 Kubernetes API 以更改服务,并相应地更新其他 pod。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2017-08-26
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多