2

スプリング クラウド ゲートウェイとスプリング クラウド kubernetes ディスカバリーを使用して、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 ゲートウェイを機能させるには、ポッド ポートとサービス ポートを揃える必要がありますが、これは非常に奇妙に思えます。

4

2 に答える 2

0

リボンは使用されていますか?リボンのデフォルトspring.cloud.kubernetes.ribbon.modeは POD です。ドキュメントから(引用):

spring.cloud.kubernetes.ribbon.modeサポートPODSERVICEモード。

  • KubernetesのPODPod IP アドレスを取得し、Ribbon を使用して負荷分散を実現するモードです。POD モードは、リボンのロード バランシングを使用します。Kubernetes のロード バランシングをサポートしません。Istio のトラフィック ポリシーはサポートされません。

  • SERVICEモードは、リボンのサービス名に直接基づいています。Get Kubernetes サービスは次の service-name.{namespace}.svc.{cluster.domain}:{port}ように連結されます demo1.default.svc.cluster.local:8080。このSERVICEモードは、Kubernetes サービスの負荷分散を使用して、Istio のトラフィック ポリシーをサポートします。

于 2020-02-06T16:09:22.650 に答える