跳到主要内容
版本:5.0.1

Kubernetes 负载均衡器

DeepSeek V3 中英对照 LoadBalancer for 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)的相关部分找到。