当前位置: 首页 > 知识库问答 >
问题:

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

殷承恩
2023-03-14

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

共有2个答案

华萧迟
2023-03-14

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

但如果有用,Kubernetes 会为每个 Pod 添加一些环境变量,以简化所有服务的自动发现。例如 {SVCNAME}_SERVICE_HOST 和 {SVCNAME}_SERVICE_PORT。文档在这里

景永望
2023-03-14

事实证明,最好的方法是使用DNS SRV记录:

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

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

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

 类似资料:
  • 我正在将一组使用Docker进行集装箱化的服务部署到AWS中。无论选择哪种部署解决方案(如原始EC2/ECS/Elastic Beanstalk/Fargate),我们都将面临“服务发现”的问题。 仅举几个我考虑过的服务发现选项: AWS Route 53服务注册表 我正在使用Spring Cloud开发JavaSpring Boot应用程序,目标部署环境是AWS。 考虑到我的堆栈是基于Sprin

  • 我正在使用典型的Spring云堆栈对简单的微服务架构进行POC,但不是Eureka服务器,而是使用不工作的Spring云Kubernetes进行服务发现。 整个POC都在这里-https://github.com/dhananjay12/spring-microservices-using-spring-kubernetes 网关作为边缘服务器和2个下游服务-用户服务和联系我们服务。 k8设置在k

  • 我在Spring Boot应用程序上遇到了Kubernetes服务发现的问题。 无论spring boot应用程序是在Kubernetes集群内运行还是在Kubernetes集群外运行,我都应该能够发现这些服务。我们的本地发展不会在k8s集群上。 我正在通过DNS使用服务发现。我尝试使用spring-cloud-starter-kubernetes

  • 使用“Spring service discovery Kubernetes”而不是直接使用来自Kubernetes的服务DNS有什么好处? 问题1。为了让服务-A能够使用服务DNS连接到服务-B,必须在服务-A之前部署服务-B? 问题2。使用spring Discovery的优点/缺点是什么?

  • 具有TLS配置的典型入口如下所示: 发现GLBC正在讨论为GCE入口启用HTTPS后端。文件摘录: 后端HTTPS 对于负载均衡器和Kubernetes服务之间的加密通信,您需要将服务的端口装饰为预期的HTTPS。有一个alpha服务注释用于指定每个服务端口的预期协议。当将协议视为HTTPS时,入口控制器将使用带有HTTPS健康检查的HTTPS后端服务组装GCP L7负载均衡器。“ 不清楚负载均衡

  • 只有。这些服务到底有什么不同?端口到底做什么?

  • 我想通过API从kubernetes集群读取信息:我使用fabric8 java客户机。 我想知道服务选择了哪些豆荚,但除了名称之外,我找不到对象中的任何链接信息,名称不是唯一的。 另一个方向就足够了(service->pods)或(pod<-service)。 如果有人能帮助我使用Kubectl/YAML,我可能会自己找到一种方法来使用API。

  • 我有一个kubernetes集群,在namespaceA上有serviceA,在namespaceB上有serviceB。 我希望从serviceA使用kubernetes服务发现以编程方式列出serviceB。我计划使用spring云kubernetes(@EnableDiscoveryClient)。 但是,有一个公司范围的政策来阻止使用以下配置,这应该已经解决了这个问题: 有什么办法可以规避