我在两个节点上运行 Kubernetes,并在两个节点上部署一个应用程序(两个 pod,每个节点一个)。
这是一个Spring Boot应用程序。它使用OpenFygnd来实现服务可发现性。在应用程序中,我定义了一个一来控制程序,它有几个API和一个从API内部调用的@Autow的@Service。
每当我对其中一个API进行请求时,Kubernetes都会使用某种负载平衡来将流量路由到其中一个pod,并调用应用RestController。这很好,我希望这是负载平衡。
一旦API被调用,并且它调用@ Autowired @服务,问题就出现了。不知何故,这也得到了负载平衡,对@Service的调用可能会在另一个节点上结束。
以下是例子:
并在代码中:
控制器:
@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…由于我同时调试两个节点,我没有注意到这一点。
嗯,我没有使用过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使用率的百分比来平衡我的负载?