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

Kubernetes中Pod之间的通知

邢灿
2023-03-14

问题是:

< code>Websockets和< code>Socket.io支持客户端和web服务器之间丰富的双向异步通知。

HTML/javascript 客户端和入口 “cookie” 路由之间 Socket.io 会在部署中的 Pod(我们称之为部署 A 的 Pod)和 HTML/javascript 客户端之间创建有状态关联。其他部署中的其他 Pod(让我们调用这些部署 B 和部署 C 的 Pod)可能希望通知部署 A 中的特定 Pod 特定于 Pod A 显示的事件。

有没有Kubernetes机制允许这种注册和pod之间的通信

通用设置:

部署A、B、C各有多个副本。

来自A、B和C的pod可以读取和更新哑分布式存储中的记录。

来自A的每个pod将负责一组页面(即网络服务器)。特定pod A负责的页面集可以动态更改(即用户决定要编辑的页面)。pod A不是无状态的,因为“cookie”控制入口路由,pod A维护一个socket.io到用户html/javascript页面。

B或C中的pod更新页面上的组件。如果某个页面组件由B/C更新,而该B/C当前正由a中的pod编辑,则B/C pod必须将更新通知特定的pod a。

多个pod A可能正在编辑同一个页面。

更多详情:

部署 A 是一个 nodejs express 服务器,它托管来自 html/javascript 客户端的 socket.io。流量使用 nginx.ingress.kubernetes.io/affinity 从入口路由:“cookie”,因此托管特定客户端的 Pod 可以将未经请求的流量发送到客户端。即,异步双向流量。

部署B是部署A的后端。一个简单的socket.AF_INET从部署A中的pod打开到部署B的服务。来自B的响应到达A,然后到达客户端。到目前为止,一切正常,但只在1个节点配置上测试。

部署 C 是部署 B 的后端。从 B 到 C 的服务打开一个套接字。从 C 到 B 到 A 到 WebClient 的响应工作正常(同样在 1 节点配置上)

问题是:

部署 B 和 C 可能会从其他源获取请求,以处理将更改向用户显示的内容的信息。我想将部署 A 上托管 socket.io 的任何 pod 更新到显示此页面的客户端。

到目前为止,描述/实现不会异步更新 Pod A,除非用户执行整页刷新。

多个用户可能显示同一页面,但通过入口 Cookie 与不同的部署 A 容器相关联。

目前,用户1只看到由用户1发起的更新,用户2只看到来自用户2的更新。除非每个用户都进行页面刷新。

我希望B和C向A中显示正在更新的页面的所有pod发送更新。

感觉Kubernetes不干净的解决方案:

想要通知页面上组件更改的 Pod 会创建一条记录,指示它对包含其 Pod 的 IP 地址的页面的更改感兴趣,以及一个直到时间戳。

当客户端显示页面时,托管A pod将更新分布式数据存储中的一条记录,以指示它需要更新此页面上的组件。Pod A会经常更新此记录中的保持活动时间。当用户离开此页面时,关联的Pod A将删除此记录。

任何更新页面记录的pod都会检查该记录,并打开一个到另一个pod的套接字来通知它发生了变化。

审计将删除任何过期的记录,这些记录由于pod在注册了其对收到更改通知的兴趣后异常终止而无法正确清理。

问题重申如下:

这是一个干净的库伯内特斯解决方案,还是库伯内特斯有什么东西可以让这个更干净?

库伯内特斯的新手:我的问题中有没有弄乱库伯内特斯的命名法?

共有1个答案

陈瀚玥
2023-03-14

没有本机方法可以在不同部署的 Pod 之间可靠地进行通信。在StatefulSets的情况下,这是可能的,其中所有pod都有已知且稳定的名称。

在您的情况下,假设我正确理解您的需求,我建议使用RabbitMQ或Kafka等队列消息传递软件

 类似资料:
  • 问题内容: 我正在评估Kubernetes作为我们新应用程序的平台。现在,一切看起来都非常令人兴奋!但是,我遇到了一个问题:我将群集托管在GCE上,并且需要某种机制在两个Pod之间共享存储(连续集成服务器和应用程序服务器)。用kubernetes做到这一点的最佳方法是什么?这些卷类型似乎都不符合我的需求,因为如果一个Pod需要写入GCE磁盘,则无法共享。NFS是完美的,但似乎需要为kubernet

  • 2.)我已经通过在kubernetes中创建LoadBalancer类型的服务向外部世界公开了我的REACT应用程序,并且我能够从浏览器访问REACT应用程序endpoint。现在,是否可以从节点内部的REACT应用程序访问EXPRESS应用程序而不向外部世界公开我的EXPRESS应用程序?如何实现这一点? 提前谢了。

  • SocketException:在简单的Kubernetes pod中无法访问网络(连接失败),它可以卷曲到Internet。

  • 问题内容: 我已经为kubernetes中的front(REACT)和backend(EXPRESS NODE JS)项目泊坞窗并创建了部署和服务。我已经在Google Cloud Platform中的两个 Pod (即 一个 Pod- > REACT APP和SECOND POD-> EXPRESS NODE JS )的同一节点的Kubernetes(单节点集群)中成功部署了。 题: 1.)如何

  • 是否有一种方法可以在微服务的两个pod之间进行主动和被动负载平衡。假设我有两个运行微服务的实例(pod),它是使用K8s服务对象公开的。是否有一种方法来配置负载平衡,使一个pod始终获得请求,当该pod停机时,另一个po将开始接收请求? 我在该服务的顶部还有一个ingress对象。

  • Kubernetes中需要考虑三个级别的度量集合—节点、Pod和在Pod中运行的应用程序。 对于节点和应用程序指标,我有非常有效的解决方案,但我仍停留在pod指标上。 我尝试过cAdvisor和Kube状态指标,但它们都没有给我想要的东西。Kube状态指标仅提供已知的信息,例如pod CPU限制和请求。cAdvisor不会将pod标签插入容器名称,因此我无法知道哪个pod行为不端。 给定一个pod