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

POD モードでは、DiscoveryClient を使用してロードバランサー名に一致するすべてのサービスを検索します。例: 次のような構成の場合:

@Bean
@LoadBalanced
WebClient.Builder client() {
	return WebClient.builder();
}

その WebClient を使用して service-a (英語)  にリクエストを発行すると、service-a を使用してこの値で DiscoveryClient::getInstances を呼び出します。これは DiscoveryClient を使用しているため、それに固有のすべての構成が適用されます。これはドキュメントの関連部分で説明されています。

一方、SERVICE モードを使用する場合、状況は少し異なりますが、検出クライアント設定とよく似ています。例: 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 に関するドキュメントの関連部分に記載されています。