Postgresql 如何在kubernetes中使用不可复制的容器组织POD?

Postgresql 如何在kubernetes中使用不可复制的容器组织POD?,postgresql,kubernetes,Postgresql,Kubernetes,我正试着了解库伯内特斯 我知道pod是组织相关容器的好方法。我知道复制控制器是确保它们正常运行的一种很好的方法 然而,我不知道如何在现实生活中做到这一点 给定一个Web应用程序,比如unicorn上的rails应用程序,在nginx后面有一个postgres数据库 nginx和rails应用程序可以水平自动缩放(如果它们没有共享),但是postgres不能开箱即用 这是否意味着当我想要在一个负载均衡器后面有两台服务器时,我不能将postgres数据库组织在与nginx和rails相同的pod中?

我正试着了解库伯内特斯

我知道pod是组织相关容器的好方法。我知道复制控制器是确保它们正常运行的一种很好的方法

然而,我不知道如何在现实生活中做到这一点

给定一个Web应用程序,比如unicorn上的rails应用程序,在nginx后面有一个postgres数据库

nginx和rails应用程序可以水平自动缩放(如果它们没有共享),但是postgres不能开箱即用

这是否意味着当我想要在一个负载均衡器后面有两台服务器时,我不能将postgres数据库组织在与nginx和rails相同的pod中?postgres是否需要自己的复制控制器,并且只是集群中的一项服务


关于这一点的一般问题是:在常见的网络场景中,什么样的容器被放入一个豆荚中?我知道这个问题一般来说是无法回答的,所以它背后的想法很有趣。

如果您想同时部署和更新容器,或者需要共享本地状态(磁盘、网络等),则应该将容器放在同一个pod中。在某些边缘情况下,出于性能原因,您可能还希望将它们放在同一位置

在您的场景中,由于nginx和rails应用程序可以水平扩展,因此它们应该位于自己的pod中,以便您可以为应用程序的每一层提供正确数量的副本(除非您总是同时扩展它们)。postgres数据库将位于一个单独的pod中,通过服务访问


这允许您更新到较新版本的nginx,而无需更改服务的任何其他内容。rails应用程序也是如此。它们可以独立地进行缩放

如果要同时部署和更新容器,或者需要共享本地状态(磁盘、网络等),则应将容器放入同一个pod中。在某些边缘情况下,出于性能原因,您可能还希望将它们放在同一位置

在您的场景中,由于nginx和rails应用程序可以水平扩展,因此它们应该位于自己的pod中,以便您可以为应用程序的每一层提供正确数量的副本(除非您总是同时扩展它们)。postgres数据库将位于一个单独的pod中,通过服务访问


这允许您更新到较新版本的nginx,而无需更改服务的任何其他内容。rails应用程序也是如此。它们可以独立地进行缩放

这个问题的答案实际上取决于你想走多远。你实际上是在描述你的应用程序的3个独立部分——KingX、rails和postgres。当涉及到监控、缩放和更新时,这些部分中的每一部分都有不同的需求

你可以把所有3个都放在一个吊舱里。这复制了虚拟机的体验,但在可管理性、部署等方面有一些优势。但你已经指出了一个主要的缺点——你想要扩展(例如)rails应用程序,而不是postgres实例。是分解的时候了

如果您改为制作两个pod,一个用于rails+nginx,另一个用于postgres,会怎么样。现在,您可以扩展前端,而不会扰乱数据库部署。如果有意义的话,你可以更进一步,将rails应用程序和nginx分成不同的pod。或者将rails应用程序拆分为5个较小的应用程序

这就是微服务背后的全部理念(我知道这是一个非常炒作的词)。将问题分解为更小、更易于管理的块。这就是kubernetes存在的原因——帮助您管理由此产生的微服务海洋

回答你的最后一个问题——没有单一的配方。所有这些都是关于应用程序的结构以及对您有意义的内容。也许您希望按照团队边界、公司中的部门或管理员角色进行分解。要问自己的问题是“如果我更新或缩放这个pod,是否有任何部分我不想同时更新/缩放?”


从某种意义上讲,这是一个数据规范化问题。pod应该是一个概念、所有者或范围的模型。我希望这能有所帮助。

这个问题的答案实际上取决于你想走多远。你实际上是在描述你的应用程序的3个独立部分——KingX、rails和postgres。当涉及到监控、缩放和更新时,这些部分中的每一部分都有不同的需求

你可以把所有3个都放在一个吊舱里。这复制了虚拟机的体验,但在可管理性、部署等方面有一些优势。但你已经指出了一个主要的缺点——你想要扩展(例如)rails应用程序,而不是postgres实例。是分解的时候了

如果您改为制作两个pod,一个用于rails+nginx,另一个用于postgres,会怎么样。现在,您可以扩展前端,而不会扰乱数据库部署。如果有意义的话,你可以更进一步,将rails应用程序和nginx分成不同的pod。或者将rails应用程序拆分为5个较小的应用程序

这就是微服务背后的全部理念(我知道这是一个非常炒作的词)。将问题分解为更小、更易于管理的块。这就是kubernetes存在的原因——帮助您管理由此产生的微服务海洋

回答你的最后一个问题——没有单一的配方。所有这些都是关于应用程序的结构以及对您有意义的内容。也许您希望按照团队边界、公司中的部门或管理员角色进行分解。要问自己的问题是“如果我更新或缩放这个pod,是否有任何部分我不想同时更新/缩放?”


从某种意义上讲,这是一个数据规范化问题。pod应该是一个概念、所有者或范围的模型。我希望这能有所帮助。

postgres数据库将位于一个单独的pod中,通过服务访问。