当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯和Spring Boot@服务负载平衡

后易安
2023-03-14

我在两个节点上运行 Kubernetes,并在两个节点上部署一个应用程序(两个 pod,每个节点一个)。

这是一个Spring Boot应用程序。它使用OpenFygnd来实现服务可发现性。在应用程序中,我定义了一个一来控制程序,它有几个API和一个从API内部调用的@Autow的@Service。

每当我对其中一个API进行请求时,Kubernetes都会使用某种负载平衡来将流量路由到其中一个pod,并调用应用RestController。这很好,我希望这是负载平衡。

一旦API被调用,并且它调用@ Autowired @服务,问题就出现了。不知何故,这也得到了负载平衡,对@Service的调用可能会在另一个节点上结束。

以下是例子:

  • 我们有两个节点:节点1,节点2
  • 我们请求节点1的IP地址。
    • 这可能会使节点2的负载平衡(这很好)

    并在代码中:
    控制器:

     @Autowired
     private lateinit var userService: UserService
     @PostMapping("/getUser")
       fun uploadNewPC(@RequestParam("userId") userId: String): User {
           println(System.getEnv("hostIP")) //123.45.67.01
           return userService.getUser(userId)
       }
    

    服务:

    @Service
    class UserService {
      fun getUser(userId: String) : User {
       println(System.getEnv("hostIP")) //123.45.67.02
       ...
      }
    }
    

    我希望负载平衡只发生在REST请求上,而不是应用程序对其@Service组件的内部调用上。我如何做到这一点?Spring Boot的@service组件在Kubernetes集群中运行的方式有什么配置吗?我能改变这个吗?

    先谢谢你。

    编辑:
    经过一些调试,我发现不是服务负载平衡到另一个节点,而是初始超文本传输协议请求。即使请求是专门发送到node1的url…由于我同时调试两个节点,我没有注意到这一点。

共有1个答案

万俟经纶
2023-03-14

嗯,我没有使用过openfe深受,但在我的理解中,它确实只能加载REST请求。

如果我没有弄错你的问题,你会说当REST控制器调用服务组件(在本例中为UserService)时,会发出网络调用,这是不可取的。

在这种情况下,我认为,以下几点考虑将是有益的:

>

  • 默认情况下,Spring Boot与此级别的负载平衡无关,它应该在Spring Boot应用程序中以某种方式配置。

    这也与此应用程序在Kubernetes环境中运行的事实无关,同样,它只是一个Spring引导配置。

    假设您有一个UserService接口,它显然没有任何负载平衡逻辑,Spring引导必须将其包装到某种添加这些功能的代理中。因此,尝试调试应用程序启动,在控制器方法中放置断点并检查用户服务的实际类型,同样,它必须是某种代理

    如果3中的假设是正确的,那么一定有某种bean post处理器(可能在spring.factories文件的某个依赖项中)类在应用程序上下文中注册。如果您创建一些自定义方法来打印所有的bean(Bean Post Processor也是一个Bean),您可能会看到可疑的Bean。

  •  类似资料:
    • 我最近开始研究Kubernetes集群。在我们的集群中,对给定Kubernetes服务的网络调用流如下所示: 外部非K8S负载均衡器- 对于给定的服务,有两个副本。通过查看副本中容器的日志,我可以看到调用被路由到不同的pod。据我所知,我们还没有为Kubernetes中的服务明确设置任何负载平衡策略。 我有几个问题: 1)K8S是否有默认的负载平衡策略?我读过库贝-proxy和随机路由。它看起来绝

    • 什么是负载均衡器? 负载平衡改进了跨多个计算资源(如计算机、计算机群集、网络链路、中央处理器或磁盘驱动器)的工作负载分布 NodePort不是负载平衡器。(我知道一旦流量在集群内,kube proxy就会在pod之间进行负载平衡)我的意思是,最终用户点击http://NODEIP:30111(例如)访问应用程序的URL。即使POD之间的流量是负载平衡的,用户仍然会点击一个节点,即“节点”,它是K8

    • 我仍然对Kubernetes节点端口服务有疑问。 NodePort:在静态端口(NodePort)上公开每个节点IP上的服务。将自动创建节点端口服务将路由到的ClusterIP服务。您可以从集群外部通过请求来联系NodePort服务:。 如果我有两个节点:nodeA和nodeB,并且如果我只在nodeA上部署应用程序,然后创建NodePort服务,那么我可以同时使用nodeA和nodeB IP访问

    • 我有一个包含 3 个节点的 Kubernetes 集群。 示例部署 我没有入口,但我有外部负载均衡器,可以轮询 80.11.12.10、80.11.12.11、 的流量。 所以我这样设置我的服务。 问题在于,由于现有的 kubernetes 服务负载均衡器,流量会获得两次负载均衡。除此之外,这是不必要的,它会破坏连接持久性。有没有办法强制 Kubernetes 在每个节点的本地机器 Pod 上转发

    • 我们在库伯内特斯运行了Spring Boot服务,并且正在使用Spring Cloud库伯内特斯负载均衡器功能和RestTemboard来调用其他Spring Boot服务。我们这样做的主要原因之一是历史上的——因为之前我们使用Eureka在EC2中运行我们的服务进行服务发现,迁移后我们保持了Spring发现客户端/客户端负载平衡(更新依赖项等,以便它与Spring Cloud库伯内特斯项目一起工

    • 我在pod中运行了高视频编码任务。这些任务在接收用户请求时运行,并且CPU密集型非常高。我想确保CPU使用率最低的pod应该在传入请求中接收。库伯内特斯有没有办法根据CPU使用率的百分比来平衡我的负载?