spring boot - Eureka y Kubernetes
spring boot microservices docker (3)
¿Cómo puedo configurar algo como eureka.client.serviceUri?
Debe tener un service Kubernetes encima de las plataformas / implementaciones de eureka, que le proporcionarán una dirección IP y un número de puerto. Y luego use esa dirección referible para buscar el servicio Eureka, en lugar de "8761".
Para abordar más preguntas sobre la configuración de HA de Eureka
No debe tener más de una pod / réplica del servicio Eureka per k8s (recuerde que los pods son efímeros, necesita una dirección IP / nombre de dominio para el registro de servicio de eureka). Para lograr una alta disponibilidad (HA), active más servicios k8 con un pod en cada uno.
- Servicio de Eureka 1 -> un solo pod
- Eureka Service 2 -> otro pod individual
- ..
- ..
- Eureka Service n -> otro pod individual
Entonces, ahora tiene un nombre de IP / dominio referable (IP del servicio k8s) para cada uno de sus Eureka .. ahora puede registrarse entre sí.
¿Te sientes como si fuera un exceso? Si todos sus servicios están en el mismo espacio de nombres de kubernetes , puede lograr todo (bueno, casi todo, excepto el equilibrio de carga del lado del cliente) que eureka ofrece a través del servicio k8s + el complemento KubeDNS. Lee este article por Christian Posta
Editar
En lugar de Servicios con un pod cada uno, puede utilizar StatefulSets como lo señaló Stefan Ocke .
Como una implementación, un StatefulSet administra Pods que se basan en una especificación de contenedor idéntica. A diferencia de una Implementación, un StatefulSet mantiene una identidad fija para cada uno de sus Pods. Estos pods se crean a partir de la misma especificación, pero no son intercambiables: cada uno tiene un identificador persistente que mantiene a través de cualquier reprogramación.
Estoy preparando una prueba de concepto para ayudar a identificar errores utilizando Spring Boot / Netflix OSS y Kubernetes juntos. Esto también es para probar tecnologías relacionadas como Prometheus y Graphana.
Tengo una configuración de servicio de Eureka que comienza sin problemas dentro de mi clust de Kubernetes. Este se llama descubrimiento y se le ha dado el nombre "discovery-1551420162-iyz2c" cuando se agrega a K8 usando
kubectl run discovery --image=xyz/discovery-microservice --replicas=1 --port=8761
Para mi servidor de configuración, estoy tratando de usar Eureka basado en una URL lógica, así que en mi bootstrap.yml tengo
server:
port: 8889
eureka:
instance:
hostname: configserver
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://discovery:8761/eureka/
spring:
cloud:
config:
server:
git:
uri: https://github.com/xyz/microservice-config
y estoy empezando esto usando
kubectl run configserver --image=xyz/config-microservice --replicas=1 --port=8889
Este servicio termina ejecutándose nombrado como configserver-3481062421-tmv4d. Luego veo excepciones en los registros del servidor de configuración, ya que intenta localizar la instancia de eureka y no puede.
Tengo la misma configuración para esto utilizando la función docker-compose localmente con enlaces e inicia los diversos contenedores sin problemas.
discovery:
image: xyz/discovery-microservice
ports:
- "8761:8761"
configserver:
image: xyz/config-microservice
ports:
- "8888:8888"
links:
- discovery
¿Cómo puedo configurar algo como eureka.client.serviceUri para que mis servicios microscópicos puedan localizar a sus compañeros sin saber las direcciones IP fijas dentro del clúster K8?
Con respecto a la configuración de HA de Eureka en Kubernetes: Mientras tanto, puede usar un StatefulSet para esto en lugar de crear un servicio para cada instancia. StatefulSet garantiza una identidad de red estable para cada instancia que cree. Por ejemplo, la implementación podría parecerse al siguiente yaml (StatefulSet + Headless Service). Hay dos instancias de Eureka aquí, de acuerdo con las reglas de nomenclatura de DNS para StatefulSets (asumiendo que el espacio de nombres es "predeterminado"):
eureka-0.eureka.default.svc.cluster.local y
eureka-1.eureka.default.svc.cluster.local
Mientras sus pods estén en el mismo espacio de nombres, también pueden llegar a Eureka como:
- eureka-0.eureka
- eureka-1.eureka
Nota: la imagen de la ventana acoplable utilizada en el ejemplo es de https://github.com/stefanocke/eureka . Es posible que desee elegir o construir su propio.
---
apiVersion: v1
kind: Service
metadata:
name: eureka
labels:
app: eureka
spec:
ports:
- port: 8761
name: eureka
clusterIP: None
selector:
app: eureka
---
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: eureka
spec:
serviceName: "eureka"
replicas: 2
selector:
matchLabels:
app: eureka
template:
metadata:
labels:
app: eureka
spec:
containers:
- name: eureka
image: stoc/eureka
ports:
- containerPort: 8761
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
# Due to camelcase issues with "defaultZone" and "preferIpAddress", _JAVA_OPTIONS is used here
- name: _JAVA_OPTIONS
value: -Deureka.instance.preferIpAddress=false -Deureka.client.serviceUrl.defaultZone=http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/
- name: EUREKA_CLIENT_REGISTERWITHEUREKA
value: "true"
- name: EUREKA_CLIENT_FETCHREGISTRY
value: "true"
# The hostnames must match with the the eureka serviceUrls, otherwise the replicas are reported as unavailable in the eureka dashboard
- name: EUREKA_INSTANCE_HOSTNAME
value: ${MY_POD_NAME}.eureka
# No need to start the pods in order. We just need the stable network identity
podManagementPolicy: "Parallel"
Debe instalar un servidor kube-dns kubernetes para resolver nombres con sus IP y luego exponer sus pods de eureka como un servicio. (consulte la documentación de kubernetes) para obtener más información sobre cómo crear DNS y servicios. @random_dude, ¿cuál será el caso si solía crear 2 o 3 réplicas de eureka? Resultó que cuando monté un microservicio ''X'' se registrará en todas las réplicas de Eureka, pero cuando se desactiva, ¡solo una réplica se actualiza! los otros todavía consideran la instancia de micro-servicio como ejecutándose