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 に関するドキュメントの関連部分に記載されています。