#java #spring-boot #kubernetes #spring-cloud #netflix-eureka
Вопрос:
Я разрабатываю проект с архитектурой микросервисов. У меня есть Spring cloud gateway, обнаружение службы eureka и заказ микросервиса. Когда я запускаю эти приложения локально, все работает. Когда я запускаю их с помощью docker compose, проблем по-прежнему нет. Но когда я развертываю их в kubernetes, я получаю сообщение об ошибке на шлюзе api. Я получаю эту ошибку, когда отправляю запрос get в / book на api gateway
Ошибка на шлюзе api:
java.net.UnknownHostException: failed to resolve 'book-service-55665db7ff-bd75t' after 2 queries
at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1046) ~[netty-resolver-dns-4.1.68.Final.jar!/:4.1.68.Final]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
|_ checkpoint ⇢ HTTP GET "/book" [ExceptionHandlingWebHandler]
конфигурация шлюза api:
server:
port: 8084
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: book
uri: lb://BOOK-SERVICE/book
predicates:
- Path=/book/**
- id: author
uri: lb://BOOK-SERVICE/author
predicates:
- Path=/author/**
- id: genre
uri: lb://BOOK-SERVICE/genre
predicates:
- Path=/genre/**
забронировать конфигурацию микросервиса:
spring:
application:
name: BOOK-SERVICE
datasource:
url: jdbc:postgresql://localhost:5432/book_service
username: postgres
password: password
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQL10Dialect
server:
port: 8081
манифест kubernetes:
#secret
apiVersion: v1
kind: Secret
metadata:
name: database
type: Opaque
data:
password: cGFzc3dvcmQ=
---
#api gateway
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
labels:
app: api-gateway
spec:
replicas: 1
selector:
matchLabels:
app: api-gateway
template:
metadata:
labels:
app: api-gateway
spec:
containers:
- name: api-gateway
image: rikaciv802/api-gateway
ports:
- containerPort: 8084
env:
- name: eureka.client.serviceUrl.defaultZone
value: http://service-discovery:8761/eureka
---
apiVersion: v1
kind: Service
metadata:
name: api-gateway
spec:
selector:
app: api-gateway
type: LoadBalancer
ports:
- protocol: TCP
port: 8084
targetPort: 8084
nodePort: 30000
---
#service discovery
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-discovery
labels:
app: service-discovery
spec:
replicas: 1
selector:
matchLabels:
app: service-discovery
template:
metadata:
labels:
app: service-discovery
spec:
containers:
- name: service-discovery
image: rikaciv802/service-discovery
ports:
- containerPort: 8761
---
apiVersion: v1
kind: Service
metadata:
name: service-discovery
spec:
selector:
app: service-discovery
ports:
- protocol: TCP
port: 8761
targetPort: 8761
---
#book service
apiVersion: apps/v1
kind: Deployment
metadata:
name: book-service-database
labels:
app: book-service-database
spec:
replicas: 1
selector:
matchLabels:
app: book-service-database
template:
metadata:
labels:
app: book-service-database
spec:
containers:
- name: book-service-database
image: postgres:14.0
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: book_service
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: database
key: password
---
apiVersion: v1
kind: Service
metadata:
name: book-service-database
spec:
selector:
app: book-service-database
ports:
- protocol: TCP
port: 5432
targetPort: 5432
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: book-service
labels:
app: book-service
spec:
replicas: 1
selector:
matchLabels:
app: book-service
template:
metadata:
labels:
app: book-service
spec:
containers:
- name: book-service
image: rikaciv802/book-service
ports:
- containerPort: 8081
env:
- name: eureka.client.serviceUrl.defaultZone
value: http://service-discovery:8761/eureka
- name: SPRING_DATASOURCE_URL
value: jdbc:postgresql://book-service-database:5432/book_service
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: database
key: password
---
apiVersion: v1
kind: Service
metadata:
name: book-service
spec:
selector:
app: book-service
ports:
- protocol: TCP
port: 8081
targetPort: 8081
конфигурация обнаружения службы:
eureka:
client:
register-with-eureka: false
fetch-registry: false
server:
port: 8761
Ответ №1:
Похоже, у вас проблемы с DNS с именами хостов pod. В kubernetes DNS-имена модулей обычно форматируются следующим образом: pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example
(см. https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods )
Вы можете обойти это, используя IP address: set eureka.instance.preferIpAddress
to true
.
Комментарии:
1. Нужно ли мне устанавливать это в service discovery или в клиентах eureka?
2. На клиентах eureka. Поэтому они предоставляют свой IP-адрес вместо имени хоста