Kubernetes 的负载均衡器

本项目包括 Spring Cloud Load Balancer,用于基于 Kubernetes Endpoints 或 Kubernetes Service 进行负载均衡。要将其添加到您的项目中,请添加以下依赖项。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>

负载均衡器有两种“模式”:PODSERVICE,由属性表示(默认为 POD

spring.cloud.kubernetes.loadbalancer.mode=SERVICE

spring.cloud.kubernetes.loadbalancer.mode=POD

POD 模式下,我们将使用 DiscoveryClient 来查找所有与您的负载均衡器名称匹配的服务。例如,如果您有如下配置

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

并使用该 WebClientservice-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 访问服务,您需要明确配置。其规则与发现实现的规则完全相同,可在有关发现客户端的文档相关部分中找到。

© . This site is unofficial and not affiliated with VMware.