使用 Spring 云 kubernetes 的服务发现

Service Discover using Spring cloud kubernetes

我正在使用典型的 Spring 云堆栈对简单的微服务架构进行 POC,但不是使用 Eureka 服务器,而是使用 spring-cloud-kubernetes 进行服务发现,但无法正常工作。

整个 POC 在这里 - https://github.com/dhananjay12/spring-microservices-using-spring-kubernetes

网关作为边缘服务器和 2 个下游服务 - 用户服务和联系我们服务。

k8 安装程序在 k8s 文件夹中。

下游服务具有以下依赖关系:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

application.yml

server:
  port: 8100

management:
  endpoints:
    web:
      exposure:
        include: '*'


spring:
  cloud:
    kubernetes:
      enabled: true
      reload:
        enabled: true
eureka:
  client:
    enabled: false

bootstrap.yml:

spring:
  application:
    name: user-service

@EnableDiscoveryClient 的注释在主 class.

网关服务有太多相关的 kubernetes 依赖项:

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

application.yml

server:
  port: 8050

spring:
  application:
    name: gateway
  cloud:
    kubernetes:
      enabled: true
      reload:
        enabled: true
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true

eureka:
  client:
    enabled: false


logging:
  level:
    root: DEBUG
    org.springframework.gateway: TRACE
    org.springframework.cloud.gateway: TRACE
    org.springframework.cloud.loadbalancer: TRACE


management:
  endpoints:
    web:
      exposure:
        include: '*'


bootstrap.yml

spring:
  application:
    name: gateway

@EnableDiscoveryClient 的注释在主 class.

请在此处查看部署和服务 yaml - https://github.com/dhananjay12/spring-microservices-using-spring-kubernetes/tree/master/k8s

我可以访问网关,但它没有路由到像用户服务这样的下游服务:

例如 - /user-service/users/getPublicMailingAddress

给出可白化错误页面

网关中的日志显示:


2019-07-07 06:40:30.017 TRACE 1 --- [or-http-epoll-2] o.s.c.g.h.p.RoutePredicateFactory : Pattern "[/my-nginx-nginx-ingress-controller/**]" does not match against value "/user-service/users/getPublicMailingAddress"

您的集群 运行 是否处于 RBAC 模式?如果是这样,您可能必须创建一个服务帐户,为其赋予适当的集群角色并将您的部署配置为使用该特定服务帐户。

如果您不想向 pods 公开所有特权,则访问 rights/resources 应该就足够了:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: custom-role
rules:
- apiGroups: [""]
  resources:
  - endpoints
  - namespaces
  - pods
  - services
  verbs:
  - get
  - watch
  - list

Spring Cloud Kubernetes 需要访问 Kubernetes API,以便能够为单个服务检索 pods 运行 的地址列表。如果你使用 Kubernetes,你应该只执行以下命令:

kubectl create clusterrolebinding admin --clusterrole=cluster-admin --serviceaccount=default:default