Я делаю POC на простой архитектуре микросервисов, используя типичный облачный стек Spring, но вместо сервера 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>
приложение.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 в основном классе.
Служба шлюза имеет слишком важные зависимости от 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>
приложение.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 в основном классе.
Пожалуйста, ознакомьтесь с yaml для развертывания и обслуживания здесь — https://github.com/dhananjay12/spring-microservices-using-spring-kubernetes/tree/master/k8s.
Я могу добраться до шлюза, но он не маршрутизируется к нисходящей службе, такой как пользовательская служба:
Например - /user-service/users/getPublicMailingAddress
дает страницу ошибки Whitable
и журналы в шлюзе показывают:
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"
Как была настроена эта часть?: public String getContactUsDetails() { List<ServiceInstance> serviceList = client.getInstances("user-service"); if (serviceList != null && serviceList.size() > 0) { System.out.println("Sevice list===>" + serviceList.size()); String result = rest.getForObject(serviceList.get(0) .getUri() + "/users/getPublicMailingAddress", String.class); return "Contact Address ==> " + result;

Ваш кластер работает в режиме RBAC? Если это так, вам, вероятно, придется создать учетную запись службы, присвоить ей соответствующую роль кластера и настроить свои развертывания для использования этой конкретной учетной записи службы.
Если вы не хотите раскрывать каждую привилегию модулям, достаточно следующих прав доступа/ресурсов:
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 требует доступа к API Kubernetes, чтобы иметь возможность получить список адресов для модулей, работающих для одной службы. Если вы используете Kubernetes, вам нужно просто выполнить следующую команду:
kubectl create clusterrolebinding admin --clusterrole=cluster-admin --serviceaccount=default:default
Пожалуйста, отредактируйте вопрос, добавив
kubectl describeдля служб и модулей иkubectl logs, чтобы мы могли видеть запуск каждой службы.