首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes发现定位器上的Spring网关使用pod端口而不是服务端口

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

Stack Overflow用户
提问于 2020-02-06 13:00:03
回答 2查看 2.2K关注 0票数 2

我正在openshift上用spring云网关和发现实现一个API网关。

我从网关项目开始。

我的网关配置是:

代码语言:javascript
复制
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"

当我查看我的/执行器/网关/路由时,我可以看到所发现的服务:

代码语言:javascript
复制
{
   "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端口),而不是服务端口:

代码语言:javascript
复制
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端口和服务端口进行调整,但这听起来很奇怪。

EN

回答 2

Stack Overflow用户

发布于 2020-02-06 16:09:22

有人在用丝带吗?丝带的默认spring.cloud.kubernetes.ribbon.mode是过氧化物酶。来自文档 (引用):

spring.cloud.kubernetes.ribbon.mode支持PODSERVICE模式。

  • POD模式是通过获取Kubernetes的Pod地址和使用丝带来实现负载平衡。吊舱模式采用的负载平衡方式不支持Kubernetes负载均衡,不支持Istio的流量策略。
  • SERVICE模式直接基于丝带的服务名称。Get Kubernetes服务被连接到service-name.{namespace}.svc.{cluster.domain}:{port}中,例如:demo1.default.svc.cluster.local:8080SERVICE模式使用Kubernetes服务的负载平衡来支持Istio的流量策略。
票数 0
EN

Stack Overflow用户

发布于 2020-02-06 18:13:09

为什么不能简单地将Service port (port)设置为8085,使其与Pod公开相同的端口?实际上没有什么能阻止你这么做。

当我试图通过网关调用rest时,出现了一个意外的错误(type=Internal服务器错误,status=500)。finishConnect(.)失败:无法访问主机:failed/172.30.7.24:8085 我们的服务是 名称: ClusterIP IP: 172.30.7.24端口: 8080/TCP TargetPort: 8085/TCP端点: 10.129.3.101:8085 它似乎使用服务IP和荚端口。我还添加了spring.cloud.kubernetes.ribbon.mode=SERVICE,但是没有什么改变。

从您发布的内容来看,当您试图通过网关调用rest时,它希望通过Service IP (172.30.7.24)和端口8085公开它,所以只需在该端口上公开它,它就可以正常工作:

代码语言:javascript
复制
...
spec:
  ports:
    - protocol: TCP
      port: 8085
      targetPort: 8085
...

如果有帮助请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60095602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档