Spring boot Kubernetes发现定位器上的Spring云网关使用pod端口而不是o服务端口

Spring boot Kubernetes发现定位器上的Spring云网关使用pod端口而不是o服务端口,spring-boot,kubernetes,spring-cloud,spring-cloud-kubernetes,Spring Boot,Kubernetes,Spring Cloud,Spring Cloud Kubernetes,我正在openshift上使用SpringCloudGateway和SpringCloudKubernetes发现实现一个API网关 我从项目开始 我的网关配置是: cloud: gateway: discovery: locator: enabled: true url-expression: "'http://'+serviceId+':'+port" kubernetes: reload:

我正在openshift上使用SpringCloudGateway和SpringCloudKubernetes发现实现一个API网关

我从项目开始

我的网关配置是:

cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          url-expression: "'http://'+serviceId+':'+port"
    kubernetes:
      reload:
        enabled: true
        mode: polling
        period: 5000
      discovery:
        service-labels:
           type: "java-api"
当我查看我的/执行器/网关/路由时,我可以看到发现的服务:

{
   "predicate":"Paths: [/common/**], match trailing slash: true",
   "route_id":"ReactiveCompositeDiscoveryClient_common",
   "filters":[
      "[[RewritePath /common/(?<remaining>.*) = '/${remaining}'], order = 1]"
   ],
   "uri":"http://common:8085",
   "order":0
}

为了让API网关工作,我必须对齐pod端口和服务端口,但这听起来很奇怪。

正在使用Ribbon吗?Ribbon的默认
spring.cloud.kubernetes.Ribbon.mode
为POD。摘自(引文):

spring.cloud.kubernetes.ribbon.mode
支持
POD
SERVICE
模式

  • POD
    模式是通过获取POD IP来实现负载平衡 Kubernetes的地址和使用功能区。POD模式使用负载 功能区的平衡不支持Kubernetes负载平衡, 不支持Istio的流量策略

  • 服务
    模式直接基于功能区的服务名称。 将Kubernetes服务连接到
    服务名称。{namespace}.svc.{cluster.domain}:{port}
    例如:
    demo1.default.svc.cluster.local:8080
    服务
    模式使用负载 平衡Kubernetes服务以支持Istio的流量策略


正在使用丝带吗?Ribbon的默认
spring.cloud.kubernetes.Ribbon.mode
为POD。摘自(引文):

spring.cloud.kubernetes.ribbon.mode
支持
POD
SERVICE
模式

  • POD
    模式是通过获取POD IP来实现负载平衡 Kubernetes的地址和使用功能区。POD模式使用负载 功能区的平衡不支持Kubernetes负载平衡, 不支持Istio的流量策略

  • 服务
    模式直接基于功能区的服务名称。 将Kubernetes服务连接到
    服务名称。{namespace}.svc.{cluster.domain}:{port}
    例如:
    demo1.default.svc.cluster.local:8080
    服务
    模式使用负载 平衡Kubernetes服务以支持Istio的流量策略


为什么您不能简单地将
服务端口(port)
设置为
8085
,以便它公开与
Pod
相同的端口?实际上,没有什么能阻止你这么做


当我试图通过网关调用RESTAPI时,我得到

There was an unexpected error (type=Internal Server Error, status=500). finishConnect(..) failed: Host is unreachable: common/172.30.7.24:8085
服务是

Name: common Type: ClusterIP IP: 172.30.7.24 Port: <unset> 8080/TCP TargetPort: 8085/TCP Endpoints: 10.129.3.101:8085

如果有帮助,请告诉我。

为什么您不能简单地将
服务端口(端口)
设置为
8085
,这样它就可以显示与
Pod
相同的端口?实际上,没有什么能阻止你这么做


当我试图通过网关调用RESTAPI时,我得到

There was an unexpected error (type=Internal Server Error, status=500). finishConnect(..) failed: Host is unreachable: common/172.30.7.24:8085
服务是

Name: common Type: ClusterIP IP: 172.30.7.24 Port: <unset> 8080/TCP TargetPort: 8085/TCP Endpoints: 10.129.3.101:8085

如果有帮助,请告诉我。

当我尝试通过网关调用rest api时,我发现
出现意外错误(type=Internal Server error,status=500)。finishConnect(..)失败:主机无法访问:公用/172.30.7.24:8085
且服务为
名称:公用类型:群集IP:172.30.7.24端口:8080/TCP目标端口:8085/TCP端点:10.129.3.101:8085
似乎使用了服务IP和pod端口。我还添加了
spring.cloud.kubernetes.ribbon.mode=SERVICE
,但没有任何更改。当我尝试通过网关调用rest api时,我发现
出现了一个意外错误(type=Internal Server error,status=500)。finishConnect(..)失败:主机无法访问:公用/172.30.7.24:8085
且服务为
名称:公用类型:群集IP:172.30.7.24端口:8080/TCP目标端口:8085/TCP端点:10.129.3.101:8085
似乎使用了服务IP和pod端口。我还添加了
spring.cloud.kubernetes.ribbon.mode=SERVICE
,但没有任何变化。这正是问题的结尾:“……为了让API网关工作,我必须对齐pod端口和服务端口,但听起来很奇怪”。是的,我注意到了这一点,我想问为什么听起来很奇怪,因为对我来说,通过
服务
公开api客户机期望的正确端口并不奇怪?你能解释一下吗?不,我不能解释。我想这可能是一个bug,但还没有机会研究代码(很久以前有多个端口出现问题-如果我记得的话,只有第一个端口被选中)。因此,将
端口
目标端口
设置为相同可能是一个解决办法,我同意。问题就是这样结束的:“……为了让API网关工作,我必须对齐pod端口和服务端口,但听起来很奇怪”。是的,我注意到了这一点,我想问为什么听起来很奇怪,因为对我来说,通过
服务
公开api客户机期望的正确端口并不奇怪?你能解释一下吗?不,我不能解释。我想这可能是一个bug,但还没有机会研究代码(很久以前有多个端口出现问题-如果我记得的话,只有第一个端口被选中)。所以,将
端口
目标端口
设置为相同可能是一个解决方法,我同意。您好,您解决问题了吗?当有多个实例(pod)时,我会出现相同的错误,但当有一个pod时,我不会出错。嗨,我对齐了pod端口和服务端口。每个容器都以“-Dserver.port=8080”启动spring引导。您好,您解决问题了吗?当有多个实例(pod)时,我会出现相同的错误,但当有一个pod时,我不会出错。嗨,我对齐了pod端口和服务端口。每个容器都以“-Dserver.port=8080”启动spring引导。