如何为随机端口配置kubernetes服务?

时间:2018-10-19 03:03:30

标签: dns kubernetes port

场景似乎陷入僵局:

  • 服务器在主机名可配置的hostname:0上进行侦听。 0表示程序启动后确定的随机端口。该应用程序不允许设置静态端口。
  • 客户端使用hostname:actual_port
  • 连接到服务器

难题是:

如果hostname是“ localhost”或“ 0.0.0.0”,则客户端无法连接说“ 0.0.0.0:42187”(该应用程序不允许在客户端配置地址)。

如果创建服务,例如说myservice,并将服务名称设置为hostname,则需要指定Pod端口以创建服务。由于端口是随机的,因此需要在pod启动后等待以获取端口。但是您需要在启动Pod之前设置主机名!如果您使用某个端口(例如42131)预先创建服务,则除非该程序碰巧分配了该服务的相同端口,否则pod无法以错误“未能绑定到myservice / 10.100.28.248:0”启动。 / p>


结论

我认为服务的随机端口没有任何意义。问题是应用程序本身不是k8s。在github(https://github.com/spark-jobserver/spark-jobserver/issues/1122)上引发了该应用程序的问题。

1 个答案:

答案 0 :(得分:0)

在Kubernetes ClusterIP NodePort LoadBalancer 中,有三种发现服务的方式。在您的方案中,它是节点端口(可访问在pod内运行的服务),该端口通过服务映射到主机端口。这个类比是您的服务在其中运行的Pod,我们称之为TargetPort,在该Pod中该服务转发所有请求。服务端口仅称为Port。该服务只是群集中具有自己IP地址的节点内部的包装。最后,我们在Node上有一个端口,可以从该端口从外部访问应用程序,该端口称为NodePort,它具有有效范围。默认情况下,范围是30000-32767

my-service.yml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  ports:
   - targetPort: 80
     port: 80
     nodePort: 32001

正如我们在上面的服务描述文件中可以理解的那样,我已经将类型定义为NodePort和3个端口,如上所述。唯一的必需端口是端口,即上述yml中服务port:80上的端口。如果不提供targetPort,则假定它与服务端口相同。并且,如果不提供NodePort,则会自动分配有效范围(30000-32767)中的空闲端口。我希望这将帮助您消除困境。谢谢。