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のようなものを設定するにはどうすればよいですか?
Eureka.client.serviceUriのようなものを設定するにはどうすればよいですか?
Eurekaポッド/展開の上にKubernetes service が必要です。これにより、参照可能なIPアドレスとポート番号が提供されます。そして、その参照可能なアドレスを使用して、「8761」の代わりにEurekaサービスを検索します。
K8sサービスごとにEurekaのポッド/レプリカを複数持つべきではありません(ポッドは一時的なものであり、eurekaサービスレジストリには参照可能なIPアドレス/ドメイン名が必要です)。高可用性(HA)を実現するには、それぞれに1つのポッドを備えたk8sサービスを増やします。
これで、Eurekaごとに参照可能なIP /ドメイン名(k8sサービスのIP)ができました。今では、相互に登録できます。
やりすぎだと感じていますか? すべてのサービスが同じkubernetes名前空間にある場合、eurekaがk8sサービス+を通じて提供するすべて(まあ、ほとんどすべて、クライアント側の負荷分散を除く)を達成できますKubeDNSアドオン。これを読む 記事 by Christian Posta
それぞれ1つのポッドを持つサービスの代わりに、 StatefulSets を Stefan Ocke のように使用できます。
展開と同様に、StatefulSetは同一のコンテナ仕様に基づいたポッドを管理します。展開とは異なり、StatefulSetは各PodのスティッキーIDを保持します。これらのポッドは同じ仕様から作成されますが、互換性はありません。各ポッドは、すべての再スケジュールにわたって維持される永続的な識別子を持っています。
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
ポッドが同じ名前空間にある限り、次の方法でもユーレカに到達できます。
注:この例で使用されている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"
IPで名前を解決するには、kubernetes kube-dnsサーバーをインストールしてから、eurekaポッドをサービスとして公開する必要があります。 (DNSおよびサービスの作成方法の詳細については、kubernetes docs を参照)。 @ random_dude、eurekaの2つまたは3つのレプリカを作成した場合はどうなりますか?マイクロサービス「X」をマウントすると、すべてのeurekaレプリカに登録されますが、ダウンすると、1つのレプリカのみが更新を取得します!他の人はまだマイクロサービスインスタンスを実行していると見なします