web-dev-qa-db-ja.com

ユーリカとクベルネテス

Spring Boot/Netflix OSSとKubernetesを一緒に使用して、落とし穴を識別するのに役立つ概念実証をまとめています。これは、PrometheusやGraphanaなどの関連技術を証明することでもあります。

Kubernetesクローザー内で問題なく開始されるEurekaサービスのセットアップがあります。これはdiscoveryという名前で、K8に追加するときに「discovery-1551420162-iyz2c」という名前が付けられています。

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

私の設定サーバーでは、論理URLに基​​づいてEurekaを使用しようとしているため、bootstrap.ymlで

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

私はこれを使って始めています

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

このサービスは、configserver-3481062421-tmv4dという名前で実行されます。その後、構成サーバーのログに例外が表示されます。これは、eurekaインスタンスを見つけようとするものの、見つからないためです。

Docker-composeをローカルにリンクで使用してこれと同じセットアップを行い、さまざまなコンテナーを問題なく起動します。

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

私のマイクロサービスがK8クラスター内の固定IPアドレスを知らなくてもピアを見つけることができるように、eureka.client.serviceUriのようなものを設定するにはどうすればよいですか?

27
Andrew Rutter

Eureka.client.serviceUriのようなものを設定するにはどうすればよいですか?

Eurekaポッド/展開の上にKubernetes service が必要です。これにより、参照可能なIPアドレスとポート番号が提供されます。そして、その参照可能なアドレスを使用して、「8761」の代わりにEurekaサービスを検索します。

EurekaのHA構成に関するさらなる質問に対処するには

K8sサービスごとにEurekaのポッド/レプリカを複数持つべきではありません(ポッドは一時的なものであり、eurekaサービスレジストリには参照可能なIPアドレス/ドメイン名が必要です)。高可用性(HA)を実現するには、それぞれに1つのポッドを備えたk8sサービスを増やします。

  • ユーリカサービス1->シングルポッド
  • Eureka Service 2->別のシングルポッド
  • ..
  • ..
  • Eureka Service n->別の単一ポッド

これで、Eurekaごとに参照可能なIP /ドメイン名(k8sサービスのIP)ができました。今では、相互に登録できます。

やりすぎだと感じていますか? すべてのサービスが同じkubernetes名前空間にある場合、eurekaがk8sサービス+を通じて提供するすべて(まあ、ほとんどすべて、クライアント側の負荷分散を除く)を達成できますKubeDNSアドオン。これを読む 記事 by Christian Posta

編集

それぞれ1つのポッドを持つサービスの代わりに、 StatefulSetsStefan Ocke のように使用できます。

展開と同様に、StatefulSetは同一のコンテナ仕様に基づいたポッドを管理します。展開とは異なり、StatefulSetは各PodのスティッキーIDを保持します。これらのポッドは同じ仕様から作成されますが、互換性はありません。各ポッドは、すべての再スケジュールにわたって維持される永続的な識別子を持っています。

23
so-random-dude

EurekaのHA構成 Kubernetesについて:(その間)インスタンスごとにサービスを作成する代わりに StatefulSet を使用できます。 StatefulSetは、作成する各インスタンスの安定したネットワークIDを保証します。たとえば、展開は次のyaml(StatefulSet + headless Service)のようになります。ここには、StatefulSetsの DNS命名規則 に従って、2つのEurekaインスタンスがあります(名前空間が「デフォルト」であると仮定):

  • eureka-0.eureka.default.svc.cluster.localおよび

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

ポッドが同じ名前空間にある限り、次の方法でもユーレカに到達できます。

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

注:この例で使用されているdockerイメージは、 https://github.com/stefanocke/eureka からのものです。独自のものを選択または構築することもできます。

---
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

IPで名前を解決するには、kubernetes kube-dnsサーバーをインストールしてから、eurekaポッドをサービスとして公開する必要があります。 (DNSおよびサービスの作成方法の詳細については、kubernetes docs を参照)。 @ random_dude、eurekaの2つまたは3つのレプリカを作成した場合はどうなりますか?マイクロサービス「X」をマウントすると、すべてのeurekaレプリカに登録されますが、ダウンすると、1つのレプリカのみが更新を取得します!他の人はまだマイクロサービスインスタンスを実行していると見なします

1
mootez