Kubernetes 的负载均衡器
此项目包含基于 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
,由属性表示(默认为 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
在所有命名空间或所谓的“选择性命名空间”中搜索。如果未指定以上任何一项,则 命名空间解析 开始生效。
找到所有服务后,我们需要知道通过哪个端口调用它们。如果相关服务定义了单个端口,我们将使用该端口,无论其名称如何。如果未定义任何端口,则该服务将不被视为负载均衡对象,并将被跳过。
如果定义了多个端口,我们将尝试将其名称与属性的值(默认为 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 访问服务,则需要显式配置。这方面的规则与发现实现完全相同,可以在有关发现客户端的文档的相关部分找到。