Kubernetes 用の LoadBalancer
このプロジェクトには、Kubernetes エンドポイントまたは Kubernetes サービスに基づく負荷分散用の Spring Cloud ロードバランサーが含まれています。プロジェクトに含めるには、次の依存関係を追加します。Fabric8 実装
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-fabric8-loadbalancer</artifactId>
</dependency>Kubernetes Java クライアントの実装
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client-loadbalancer</artifactId>
</dependency> ロードバランサが動作する「モード」には、POD と SERVICE の 2 つがあり、プロパティで示されます。(デフォルトは POD)
spring.cloud.kubernetes.loadbalancer.mode=SERVICEまたは
spring.cloud.kubernetes.loadbalancer.mode=PODPOD モードでは、DiscoveryClient を使用してロードバランサー名に一致するすべてのサービスを検索します。例: 次のような構成の場合:
@Bean
@LoadBalanced
WebClient.Builder client() {
return WebClient.builder();
} その WebClient を使用して service-a (英語) にリクエストを発行すると、service-a を使用してこの値で DiscoveryClient::getInstances を呼び出します。これは DiscoveryClient を使用しているため、それに固有のすべての構成が適用されます。これはドキュメントの関連部分で説明されています。
一方、SERVICE モードを使用する場合は、状況は少し異なりますが、ディスカバリクライアントの設定とよく似ています。SERVICE モードでは、ロードバランサーは spring.cloud.kubernet.loadbalancer.service-matching-strategy で定義された 2 つの戦略のいずれかを使用してターゲットサービスを検出します。
NAME (デフォルト): metadata.name に基づいてサービスを照合します。例: service-a (英語) へのリクエストは、service-a という名前の Kubernetes サービスを対象とします。
LABELS: リクエストホスト名を無視し、代わりに spring.cloud.kubernetes.discovery.serviceLabels で定義されたラベルに一致するすべてのサービスを検索します。
残りのドキュメントはサービス名によるフィルタリングに基づいていますが、ラベルによるフィルタリングについても同様です。
例: service-a という名前のサービスを探す名前空間を特定するには、以下の設定のいずれかを使用します。
spring.cloud.kubernetes.discovery.all-namespaces
spring.cloud.kubernetes.discovery.namespacesすべての名前空間を検索するか、いわゆる「選択的名前空間」を検索するかを指定します。上記のいずれも指定されていない場合は、名前空間の解決が起動します。
すべてのサービスを見つけたら、どのポートで呼び出すかを知る必要があります。問題のサービスに 1 つのポートが定義されている場合は、その名前に関係なく、そのポートを使用します。ポートが定義されていない場合、このサービスは負荷分散の対象とは見なされず、スキップされます。
複数のポートが定義されている場合は、その名前をプロパティの値 (デフォルトでは http ) と一致させようとします。
spring.cloud.kubernetes.loadbalancer.portName一致するものが見つかった場合、そのポート番号が使用されます。そうでない場合は、リストの「最初の」ポートが使用されます。この最後のオプションは非決定的であるため、注意が必要です。
ポートがわかれば、そのサービスを呼び出す方法がわかります。URL の形式は次のようになります。
service-a.<SERVICE_NAMESPACE>.svc.<DOMAIN>:<FOUND_PORT><SERVICE_NAMESPACE> はサービスが存在する名前空間、DOMAIN はプロパティの値です (デフォルトでは cluster.local と同じです)。
spring.cloud.kubernetes.loadbalancer.clusterDomain<FOUND_PORT> は、上記のプロセスで説明したように選択したサービスのポートです。
サービスに HTTPS 経由でアクセスする必要がある場合は、明示的に設定する必要があります。そのルールは検出実装の場合とまったく同じであり、discovery-client に関するドキュメントの関連部分に記載されています。