Service Discover с использованием Spring Cloud Kubernetes

Я делаю 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

Service Discover с использованием Spring Cloud Kubernetes

и журналы в шлюзе показывают:


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"

Пожалуйста, отредактируйте вопрос, добавив kubectl describe для служб и модулей и kubectl logs, чтобы мы могли видеть запуск каждой службы.

Andy Shinn 08.07.2019 02:22

Как была настроена эта часть?: 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;

Mark 08.07.2019 18:49
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
2
1 492
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш кластер работает в режиме 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

Другие вопросы по теме