【发布时间】:2020-05-22 12:52:58
【问题描述】:
我正在使用 spring cloud gateway 和 spring cloud kubernetes discovery 在 openshift 上实现一个 API 网关。
我从项目https://github.com/salaboy/s1p_gateway开始。
我的网关配置是:
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"
当我查看我的 /actuator/gateway/routes 时,我可以看到发现的服务:
{
"predicate":"Paths: [/common/**], match trailing slash: true",
"route_id":"ReactiveCompositeDiscoveryClient_common",
"filters":[
"[[RewritePath /common/(?<remaining>.*) = '/${remaining}'], order = 1]"
],
"uri":"http://common:8085",
"order":0
}
问题在于 8085 是 targetPort(即 pod 端口)而不是服务端口:
kind: Service
apiVersion: v1
metadata:
name: common
namespace: p4p
selfLink: /api/v1/namespaces/myspace/services/common
uid: 1851a76f-4764-11ea-a02c-000d3aa9b693
resourceVersion: '28657990'
creationTimestamp: '2020-02-04T15:36:21Z'
labels:
app: common
type: java-api
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8085
selector:
app: common
deploymentconfig: common
clusterIP: 172.30.7.24
type: ClusterIP
sessionAffinity: None
status:
loadBalancer: {}
为了让 API 网关工作,我必须对齐 pod 端口和服务端口,但这听起来很奇怪。
【问题讨论】:
-
你好,你解决问题了吗?当有多个实例(pod)时我会出现同样的错误,但当有一个 pod 时不会出错。
-
嗨,我对齐了 pod 端口和服务端口。每个容器都使用“-Dserver.port=8080”启动spring-boot。
标签: spring-boot kubernetes spring-cloud spring-cloud-kubernetes