k8s内部的Spring Cloud Gateway-路由未实现负载平衡



我在k8s集群中使用spring云网关2021.0.0。我还有一个k8s服务,有两个吊舱。我的问题是spring网关总是将流量路由到同一个pod。如果我移除了那个pod,那么spring网关就会开始使用另一个。如何配置spring网关以使用与k8s服务相关的所有pod?我知道k8s服务工作得很好,因为如果进入网关容器并对服务进行卷曲,请求有时会转到一个pod,有时会转到另一个pod。但正如我所说,使用spring网关,请求总是转到同一个pod中。

我的春季网关配置

spring:
cloud:
gateway:
routes:
- id: product
uri: http://product-service
predicates:
- Path=/api/product/**

如果我更改uri并放入lb而不是http,我会得到503

spring.cloud.gateway.requests tags: [tag(httpMethod=GET),tag(httpStatusCode=503),tag(outcome=SERVER_ERROR),tag(routeId=product),tag(routeUri=lb://product-service),tag(status=SERVICE_UNAVAILABLE)]

提前感谢

更新

我在这里发现了问题https://learnk8s.io/kubernetes-long-lived-connections我刚刚将httpClient keepAlive属性设置为false,现在它正按预期工作

您需要通过在网关应用程序中添加kubernetes和kubernetes-lb-starter依赖项来启用客户端负载平衡。还需要将路由配置为lb://service-name,而不是使用http端点。它将以循环方式进行负载平衡。

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-loadbalancer</artifactId>
<version>${spring-cloud-starter-kubernetes.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes</artifactId>
<version>${spring-cloud-starter-kubernetes.version}</version>
</dependency>

如果有人仍然被这个问题所困扰。我设法通过向pom.xml添加以下依赖项来解决它:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client-loadbalancer</artifactId>
</dependency>

除此之外,还应在application.properties中添加以下属性,以实现基于Kubernetes服务名称的负载平衡。

spring.cloud.kubernetes.loadbalancer.mode=SERVICE

此外,应该使用lb方案而不是httphttps来定义路由的URI。

参考:Spring Cloud Kubernetes文档

最新更新