如何在 kubernetes 中使用不可复制的容器组织 pods?
How to organize pods with non-replicatable containers in kubernetes?
我正在努力了解 kubernetes。
我知道 pods 是组织相关容器的好方法。我知道复制控制器是确保它们启动和 运行.
的好方法
然而,我不知道在现实生活中该怎么做。
给定一个 web 应用程序,比如 rails unicorn 上的应用程序,在 nginx 后面有一个 postgres 数据库。
nginx 和 rails 应用程序可以水平自动缩放(如果它们什么都不共享),但 postgres 不能开箱即用。
这是否意味着我不能在与 nginx 和 rails 相同的 pod 中组织 postgres 数据库,当我想在一个负载均衡器后面有两个服务器时? postgres 是否需要一个自己的复制控制器并且只是集群中的一个服务?
关于这个的一般问题是:在常见的网络场景中,什么样的容器会进入一个 pod?我知道这不能笼统地回答,所以它背后的想法很有趣。
当您希望同时部署和更新容器或者它们需要共享本地状态(磁盘、网络等)时,您应该将容器放入同一个 pod 中。在某些边缘情况下,出于性能原因,您可能还希望将它们放在一起。
在您的方案中,由于 nginx 和 rails 应用程序可以水平扩展,因此它们应该在自己的 pods 中,以便您可以为应用程序的每一层提供正确数量的副本(除非你总是同时缩放它们)。 postgres 数据库将位于单独的 pod 中,通过服务访问。
这使您可以更新到更新版本的 nginx,而无需更改服务的任何其他内容。 rails 应用程序也是如此。他们每个人都可以独立扩展。
这个问题的答案真的取决于你想深入下去。您实际上是在描述应用程序的 3 个独立部分 - ngingx、rails、postgres。在监控、扩展和更新方面,每个部分都有不同的需求。
您可以将所有 3 个都放在一个吊舱中。这复制了 VM 的体验,但在可管理性、部署等方面具有一些优势。但是您已经指出了主要缺点之一 - 您想要扩展(例如)rails 应用程序而不是 postgres实例。是时候分解了。
如果改为制作 2 个 pods - 一个用于 rails+nginx,一个用于 postgres,会怎样?现在您可以扩展您的前端而不会弄乱您的数据库部署。如果有意义的话,您可能会走得更远,将您的 rails 应用程序和 nginx 拆分为不同的 pods。或者将您的 rails 应用拆分为 5 个较小的应用。
这就是微服务背后的全部思想(我知道这是一个非常炒作的词)。将问题分解为更小且更易于管理的块。这就是 kubernetes 存在的原因 - 帮助您管理由此产生的微服务海洋。
回答你的最后一个问题 - 没有单一的食谱。这完全取决于您的应用程序的结构以及对您有意义的内容。也许您想沿着团队边界、公司中的部门或管理员角色进行分解。要问自己的问题是 "if I update or scale this pod, is there any part of it that I don't want updated/sclaed at the same time?"
从某种意义上说,这是一个数据规范化问题。 Pod 应该是一个概念或所有者或范围的模型。希望对您有所帮助。
我正在努力了解 kubernetes。
我知道 pods 是组织相关容器的好方法。我知道复制控制器是确保它们启动和 运行.
的好方法然而,我不知道在现实生活中该怎么做。
给定一个 web 应用程序,比如 rails unicorn 上的应用程序,在 nginx 后面有一个 postgres 数据库。
nginx 和 rails 应用程序可以水平自动缩放(如果它们什么都不共享),但 postgres 不能开箱即用。
这是否意味着我不能在与 nginx 和 rails 相同的 pod 中组织 postgres 数据库,当我想在一个负载均衡器后面有两个服务器时? postgres 是否需要一个自己的复制控制器并且只是集群中的一个服务?
关于这个的一般问题是:在常见的网络场景中,什么样的容器会进入一个 pod?我知道这不能笼统地回答,所以它背后的想法很有趣。
当您希望同时部署和更新容器或者它们需要共享本地状态(磁盘、网络等)时,您应该将容器放入同一个 pod 中。在某些边缘情况下,出于性能原因,您可能还希望将它们放在一起。
在您的方案中,由于 nginx 和 rails 应用程序可以水平扩展,因此它们应该在自己的 pods 中,以便您可以为应用程序的每一层提供正确数量的副本(除非你总是同时缩放它们)。 postgres 数据库将位于单独的 pod 中,通过服务访问。
这使您可以更新到更新版本的 nginx,而无需更改服务的任何其他内容。 rails 应用程序也是如此。他们每个人都可以独立扩展。
这个问题的答案真的取决于你想深入下去。您实际上是在描述应用程序的 3 个独立部分 - ngingx、rails、postgres。在监控、扩展和更新方面,每个部分都有不同的需求。
您可以将所有 3 个都放在一个吊舱中。这复制了 VM 的体验,但在可管理性、部署等方面具有一些优势。但是您已经指出了主要缺点之一 - 您想要扩展(例如)rails 应用程序而不是 postgres实例。是时候分解了。
如果改为制作 2 个 pods - 一个用于 rails+nginx,一个用于 postgres,会怎样?现在您可以扩展您的前端而不会弄乱您的数据库部署。如果有意义的话,您可能会走得更远,将您的 rails 应用程序和 nginx 拆分为不同的 pods。或者将您的 rails 应用拆分为 5 个较小的应用。
这就是微服务背后的全部思想(我知道这是一个非常炒作的词)。将问题分解为更小且更易于管理的块。这就是 kubernetes 存在的原因 - 帮助您管理由此产生的微服务海洋。
回答你的最后一个问题 - 没有单一的食谱。这完全取决于您的应用程序的结构以及对您有意义的内容。也许您想沿着团队边界、公司中的部门或管理员角色进行分解。要问自己的问题是 "if I update or scale this pod, is there any part of it that I don't want updated/sclaed at the same time?"
从某种意义上说,这是一个数据规范化问题。 Pod 应该是一个概念或所有者或范围的模型。希望对您有所帮助。