Kubernetes 的负载均衡器
该项目包含了基于 Kubernetes Endpoints 或 Kubernetes Service 的负载均衡功能,使用了 Spring Cloud Load Balancer。要将此功能包含到您的项目中,请添加以下依赖项。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
,通过属性(默认为 POD
)来表示。
spring.cloud.kubernetes.loadbalancer.mode=SERVICE
或
spring.cloud.kubernetes.loadbalancer.mode=POD
在 POD
模式下,我们将使用 DiscoveryClient
来查找与您的负载均衡器名称匹配的所有服务。例如,如果您有这样的配置:
@Bean
@LoadBalanced
WebClient.Builder client() {
return WebClient.builder();
}
并向 [service-a](http://service-a)
发出请求,我们将使用该 WebClient
来调用 DiscoveryClient::getInstances
并传递这个值。由于这是使用 DiscoveryClient
,因此适用于它的所有配置都将生效,这些配置在文档的相关部分中有详细说明。
另一方面,如果你使用 SERVICE
模式,情况会有所不同,但非常类似于发现客户端的设置。例如,要回答在哪个命名空间中查找名称为 service-a
的服务,我们将使用以下设置之一:
spring.cloud.kubernetes.discovery.all-namespaces
spring.cloud.kubernetes.discovery.namespaces
可以搜索所有命名空间,或者所谓的“选择性命名空间”。如果未指定上述任何选项,则会触发命名空间解析。
一旦我们找到所有服务,我们需要知道通过哪个端口来调用它们。如果相关服务定义了单个端口,无论其名称如何,我们都将使用该端口。如果没有定义任何端口,该服务将不会被考虑用于负载均衡,并且会被跳过。
如果定义了多个端口,我们将尝试将其名称与属性的值(默认为 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)的文档相关部分找到。