spring-boot kubernetes microservices netflix-eureka spring-cloud-netflix

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