Kubernetes Pod和共享内存与状态

10

我是一个 Kubernetes 新手,如果这是一个基本的问题,请谅解 - 我正在努力理解这个神奇的技术。

假设我有一些处理在一个 pod 上,我有一些变量和数组。现在我将有一个很重的负载,会分配/复制一个新的 pod - 现在有 2 个 pod 来处理我的负载,而不是只有1个。第二个 pod 的内存会发生什么情况? Pod 2 是否使用相同的内存内容进行复制?内存是否被共享?如果我的微服务之间需要进行一些跨越内存的通信,也就是说存在某些变量依赖性,那么使用新的内存来复制一个 pod 将是灾难性的。为了澄清,我们假设在一个 pod 上有一个 key-value 映射。一个 pod 被复制后,我们就有了两个 key-value 映射(一个在 pod1 中,另一个在 pod2 中)。但是我们希望获得一个包含这两个 pod 共同数据的 key-value 映射 - 在复制的 pod 之间共享的 key-value 映射,而不是两个孤立的 key-value 映射。

当然,我想其中一个解决方案是拥有一个共享、中央的数据库供参考。但是对于只想共享几百个元素的数组的情况来说,这是一个巨大的开销!Kubernetes 如何解决这个问题?


这是一个应用级别的设计问题,而不是 Kubernetes 的问题。如果您手动部署了2个或更多副本的服务,您会怎么做? - Oliver Charlesworth
1
我可能会尝试在两个副本之间建立一些通信技术,但我不知道这将表现为什么形式。如果这不是在Kubernetes层面上处理的事情,那么我希望能得到任何关于良好实践的评论。 - Zeruno
请您分享一下您解决问题的经验好吗? - Schnitter
请您分享一下您是如何解决这个问题的经验? - undefined
3个回答

2

针对您关于第二个pod内存的问题,第二个pod将被分配新的内存。

解决您关于新pod复制内存内容的问题,所有新的pod将根据容器规范进行复制。

回答您关于pod之间共享内存的问题,不,内存不会在pod之间共享。如果您想在pod之间共享元素,需要确保其在容器规范中,例如volume环境变量

针对您关于关键值的问题,如果您正在寻找存储解决方案,您可以考虑使用12。如果您只是想将一些关键值传递给Pods,则可以考虑使用configmaps

1 https://kubernetes.io/docs/concepts/storage/persistent-volumes/

2 https://kubernetes.io/docs/concepts/storage/


1

@Zeruno,也许我在这里大声思考,但如果您将现有的etcd集群用作应用程序的键值存储,会怎样呢?

  1. 由于它已经存在并由K8s本身以分布式集群模式进行管理,因此无需维护它。

  2. 这可能充当一个单一的存储点,可被该集群中的所有pod访问。


1
您可以通过YAML或ConfigMaps中的标签间接访问ETCD,但我从未见过Kube培训或示例将Kubernetes主节点的ETCD集群暴露给应用程序。您有任何演示此功能的示例或声称这是一种良好实践的帖子吗?我的第一反应是分离这些问题,Kube使用的K/V存储不应直接由应用程序使用。如果您的应用程序需要ETCD,则通过Helm图表在集群中部署新实例。但然后您需要考虑像Redis这样的替代方案。 - yzorg

0
您提出的解决方案有时是合适的,但我只会在共享数据>1GB时使用它。对于您的情况,“几百个元素的数组”,我会在PVC(卷)上使用文件监视器,但我的集群具有快速的SSD阵列用于共享存储,如果您正在传统磁盘或传统SAN上运行,则不能推荐它。
话虽如此,截至2020年4月28日,Kubernetes尚未实现>1GB共享内存。请参见https://github.com/kubernetes/kubernetes/issues/28272
我阅读了这个线程,发现Kube今天将共享内存限制为64MB。如果您的数据集很小,您可以快速从共享存储中读取更改(我猜测200ms-3sec)。如果您需要更快的速度,我建议您今天使用缓存服务:禁用持久性的Redis或memcached等,并在实施28272问题时重新考虑共享内存。

issue #28272 thread 上,他们要求针对共享内存场景提供反馈,一些人提出了类似于我描述的场景:其他进程读取/使用的超过1GB的共享数据或“共享数据库”。 - yzorg
亲爱的@Zeruno:我之所以加入这个话题是因为你自称是一个“Kubernetes新手”。只有在相同节点或服务器上的Pod才能读取共享内存。在任何“云原生”系统,比如Kubernetes中,主机/节点可以根据您的运营商(以前称为IT)的意愿进行修补和重启。这就是“共享中央DB”或高速缓存的好处:共享的DB或高速缓存可以配置为高可用,并容忍任何单点故障,但是您的共享内存不行,它只是单个节点/服务器上的一些内存。 - yzorg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接