当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud库伯内特斯Spring Cloud Gateway:无法找到k8s服务的实例

阳宾实
2023-03-14

我正在使用Spring Cloud Kubernetes Spring Cloud Gateway(SCG),在GKE上部署我的应用程序时遇到了一些麻烦。SCG找不到k8s服务,我仍然收到此错误:

There was an unexpected error (type=Service Unavailable, status=503).
Unable to find instance for uiservice

uiservice是Angular应用程序。

当我看一下<代码>/执行器/网关/路由我得到以下结果:

[
  {
    "route_id": "CompositeDiscoveryClient_gateway",
    "route_definition": {
      "id": "CompositeDiscoveryClient_gateway",
      "predicates": [
        {
          "name": "Path",
          "args": {
            "pattern": "/gateway/**"
          }
        }
      ],
      "filters": [
        {
          "name": "RewritePath",
          "args": {
            "regexp": "/gateway/(?<remaining>.*)",
            "replacement": "/${remaining}"
          }
        }
      ],
      "uri": "lb://gateway",
      "order": 0
    },
    "order": 0
  },
  {
    "route_id": "CompositeDiscoveryClient_uiservice",
    "route_definition": {
      "id": "CompositeDiscoveryClient_uiservice",
      "predicates": [
        {
          "name": "Path",
          "args": {
            "pattern": "/uiservice/**"
          }
        }
      ],
      "filters": [
        {
          "name": "RewritePath",
          "args": {
            "regexp": "/uiservice/(?<remaining>.*)",
            "replacement": "/${remaining}"
          }
        }
      ],
      "uri": "lb://uiservice",
      "order": 0
    },
    "order": 0
  },
  {
    "route_id": "uiservice_route",
    "route_definition": {
      "id": "uiservice_route",
      "predicates": [
        {
          "name": "Path",
          "args": {
            "_genkey_0": "/*"
          }
        }
      ],
      "filters": [],
      "uri": "lb://uiservice",
      "order": 0
    },
    "order": 0
  },
  ....
]

请注意,服务被很好地发现,因为:"route_id":"CompositeDiscoveryClient_gateway""route_id":"CompositeDiscoveryClient_uiservice",这些路线不是我的(我没有定义它们)。

我看了这篇文章:如何设置Spring云网关应用程序,以便它可以使用Spring云Kubernetes的服务发现?没有成功。

我的配置:

   spring:
      profiles:
        active: prod
      cloud:
        kubernetes:
          reload:
            enabled: true
        gateway:
          discovery:
            locator:
              enabled: true 
              lower-case-service-id: true
          globalcors:
            cors-configurations: 
              '[/**]':
                allowedOrigins: uiservice
                allowedMethods: "*"
                allowCredentials: true
                maxAge: 7200
                allowedHeaders: "*"
                exposedHeaders:
                - "Access-Control-Allow-Origin"
                - "Access-Control-Allow-Methods"
                - "Access-Control-Max-Age"
                - "Access-Control-Allow-Headers"
                - "Cache-Control"
                - "Authorization"
                - "Content-Type"
          routes:
          #======UISERVICE========
          - id: uiservice_route
            uri: lb://uiservice 
            predicates:
            - Path=/* #default route

          - id: uiservice_route_assets
            uri: lb://uiservice
            predicates:
            - Path=/assets/**
   management:
      endpoints:
        web:
          exposure:
            include: "*"
      endpoint:
          restart:
            enabled: true

另外,如何禁用网关自动发现?我不想要"route_id":"CompositeDiscoveryClient_gateway"

依赖项:

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-kubernetes-all</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

多谢你的帮忙

共有3个答案

江雅懿
2023-03-14

应该是这样的:

spring:
  application.name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          url-expression: "'http://'+serviceId+':'+getPort()"
          lower-case-service-id: true

调用时<代码>http://gateway/my-service-name/api/etc,然后如果kubernetes中存在服务,则将调用我的服务名称/api/etc

所以你需要确保有这样的服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service-name
  namespace: default
  labels:
    app: my-service-name
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30080
  selector:
    app: my-service-name
解阳荣
2023-03-14

设置以下属性

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: false
易炳
2023-03-14

在失去一个下午后,我终于找到了解决办法。我认为在使用Ribbon时存在服务发现问题。我使用k8s dns服务发现,而不是依赖Ribbon,因此我的新配置是:

routes:
- id: uiservice_route
  uri: http://uiservice:4200 # switch 'lb://' to 'http://'
  predicates:
  - Path=/* 

K8s uiservice配置:

apiVersion: v1
kind: Service
metadata:
  name: uiservice
spec:
  sessionAffinity: ClientIP
  selector:
    app: uiservice
  ports:
    - name: http
      port: 4200
      targetPort: ui-port

出现了一个新的问题:既然k8s服务本身就是这样做的,为什么要使用Ribbon来负载平衡请求?

 类似资料:
  • 我是Kubernetes平台的新手,尝试启用部署在Kubernetes平台上的tomcat web app的HTTPS安全连接。我对舱单感到困惑。与部署、服务和入口控制器相关的yml。 那么,我是否也必须在部署(在端口:-containerPort:8080)服务(如端口:-端口:80 targetPort:8080协议:TCP名称:http)和入口(在后端:serviceName:tomcat

  • 我在aws上创建了一个简单的EKS集群,如https://github.com/terraform-providers/terraform-provider-aws/tree/master/examples/eks-getting-started.所述 我在这个集群中创建了一个nginx部署和一个Loadbalancer类型的服务,如下所述。该配置在minikube上本地工作。 在AWS上,我可以

  • 我只是在本地mac上使用mini kube设置kubernetes。 创建了一个类型为NodePort的服务,并且能够使用url

  • 我在windows 10中创建了两个在我的minikube环境中运行的POD。一个POD带有Spring boot应用程序容器,另一个POD带有mysql容器。对于Spring boot应用程序,服务类型为nodePort,对于MYSQL pod,服务类型为club sterIP。这意味着Mysql pod只需要在集群内部进行通信。但是对于Spring boot应用程序,需要从浏览器访问,所以我配

  • 最近,我用Nginx Ingres控制器在k8s集群中构建了几个微服务,它们工作正常。 在处理微服务之间的通信时,我尝试了gRPC并成功了。然后我发现当微服务A- 后来,我对istio产生了兴趣。我已成功将其部署到群集。但是,我观察到它总是创建自己的负载均衡器,这与现有的Nginx入口控制器不匹配。 此外,我尝试了prometheus和grafana以及k9s。这些工具让我对pod的cpu和内存使

  • 我希望能够使用 Jenkins 执行的 Helm 图表(作为构建周期的一部分)自动部署到我的 Kubernetes 集群。詹金斯机器位于与 Kubernetes 集群不同的网络上(而不是许多博客中记录的它的一部分)。 我有一个托管在私人GitHub帐户中的图表存储库。我遵循以下过程:https://hackernoon.com/using-a-private-github-repo-as-helm