使用 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
我正在使用典型的 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