场景似乎陷入僵局:
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)上引发了该应用程序的问题。
答案 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)中的空闲端口。我希望这将帮助您消除困境。谢谢。