it-swarm.com.de

Eureka und Kubernetes

Ich erstelle einen Proof-of-Concept, um Fallstricke mithilfe von Spring Boot/Netflix OSS und Kubernetes zusammen zu identifizieren. Dies soll auch verwandte Technologien wie Prometheus und Graphana belegen.

Ich habe ein Eureka-Service-Setup, das problemlos in meinem Kubernetes-Clouster gestartet werden kann. Dies wird als "Discovery" bezeichnet und erhält den Namen "discovery-1551420162-iyz2c", wenn K8 mit hinzugefügt wird

kubectl run discovery --image=xyz/discovery-microservice --replicas=1 --port=8761

Für meinen Konfigurationsserver versuche ich, Eureka basierend auf einer logischen URL zu verwenden, also in meiner bootstrap.yml, die ich habe

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

und ich beginne dies mit

kubectl run configserver --image=xyz/config-microservice --replicas=1 --port=8889

Dieser Dienst wird schließlich mit dem Namen configserver-3481062421-tmv4d ausgeführt. In den Konfigurationsserver-Protokollen werden dann Ausnahmen angezeigt, da versucht wird, die Eureka-Instanz zu lokalisieren, und dies nicht möglich ist.

Ich habe das gleiche Setup dafür mit Docker-Compose lokal mit Links und es startet die verschiedenen Container ohne Probleme.

discovery:
  image: xyz/discovery-microservice
  ports:
   - "8761:8761"
configserver:
  image: xyz/config-microservice
  ports:
   - "8888:8888"
  links:
   - discovery

Wie kann ich so etwas wie eureka.client.serviceUri einrichten, damit meine microserices ihre Kollegen finden können, ohne die festen IP-Adressen im K8-Cluster zu kennen?

27
Andrew Rutter

Wie kann ich so etwas wie eureka.client.serviceUri einrichten?

Sie müssen einen Kubernetes Dienst über den Eureka-Pods/-Einsätzen haben, der Ihnen dann eine verweisbare IP-Adresse und Portnummer bereitstellt. Verwenden Sie dann diese verweisbare Adresse, um den Eureka-Service anstelle von "8761" nachzuschlagen.

Zur Beantwortung weiterer Fragen zur HA-Konfiguration von Eureka

Sie sollten nicht mehr als ein Pod/Replikat von Eureka pro k8s-Dienst haben (denken Sie daran, dass Pods nur vorübergehend sind und Sie eine verweisbare IP-Adresse/einen Domainnamen für die Registrierung des Eureka-Dienstes benötigen). Um eine hohe Verfügbarkeit (HA) zu erzielen, sollten Sie mehr k8s-Dienste mit jeweils einem Pod ausstatten.

  • Eureka-Service 1 -> ein einziger Pod
  • Eureka Service 2 -> ein weiterer einzelner Pod
  • ..
  • ..
  • Eureka Service n -> ein weiterer einzelner Pod

Jetzt haben Sie also für jeden Ihrer Eureka eine verweisbare IP/Domain (IP des k8s-Dienstes). Jetzt können Sie sich gegenseitig registrieren.

Fühlen Sie sich wie ein Overkill? Wenn sich alle Ihre Dienste im selben kubernetes-Namespace befinden , können Sie alles (naja, fast alles, mit Ausnahme des clientseitigen Lastausgleichs) erreichen, was eureka über k8s service + anbietet KubeDNS-Add-On. Lesen Sie diesen Artikel von Christian Posta

Bearbeiten

Anstelle von Services mit jeweils einem Pod können Sie auch StatefulSets als Stefan Ocke verwenden.

Wie eine Bereitstellung verwaltet ein StatefulSet Pods, die auf einer identischen Containerspezifikation basieren. Im Gegensatz zu einer Bereitstellung behält ein StatefulSet für jeden seiner Pods eine feste Identität bei. Diese Pods werden aus derselben Spezifikation erstellt, sind jedoch nicht austauschbar: Jeder hat eine dauerhafte Kennung, die er bei jeder Umplanung beibehält.

23
so-random-dude

Zur HA-Konfiguration von Eureka in Kubernetes: Sie können (zwischenzeitlich) ein StatefulSet verwenden, anstatt für jedes einen Service anzulegen Beispiel. Das StatefulSet garantiert eine stabile Netzwerkidentität für jede von Ihnen erstellte Instanz. Die Bereitstellung könnte beispielsweise wie folgt aussehen: yaml (StatefulSet + headless Service). Hier gibt es zwei Eureka-Instanzen gemäß DNS-Namensregeln für StatefulSets (vorausgesetzt, der Namespace ist "Standard"):

  • eureka-0.eureka.default.svc.cluster.local und

  • eureka-1.eureka.default.svc.cluster.local

Solange sich Ihre Pods im selben Namespace befinden, können Sie Eureka auch erreichen als:

  • eureka-0.eureka
  • eureka-1.eureka

Hinweis: Das im Beispiel verwendete Docker-Image stammt von https://github.com/stefanocke/eureka . Vielleicht möchten Sie eine eigene auswählen oder bauen.

---
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"
10
Stefan Ocke

Sie müssen einen kubernetes kube-dns-Server installieren, um Namen mit ihren IP-Adressen aufzulösen, und dann Ihre Eureka-Pods als Dienst verfügbar machen. (Siehe kubernetes docs ) für weitere Informationen zum Erstellen von DNS und Diensten. @random_dude, was wird der Fall sein, wenn ich 2 oder 3 Repliken von Eureka erstellt habe? Es stellte sich heraus, dass wenn ich ein Micro-Service 'X' mounte, ich in allen Eureka-Replikaten registriert werde, aber wenn es ausfällt, bekommt nur ein Replikat das Update! Die anderen betrachten die Micro-Service-Instanz weiterhin als ausgeführt

1
mootez