在 Kubernetes 上或直接在 EC2 实例上部署 Docker 应用程序?

Deploy Docker app on Kubernetes or directly on EC2 instances?

假设我使用 EC2 实例 (VM) 在 AWS 中部署了一个 Web 应用程序(Apache httpd 服务器)。使用 EC2 用户数据执行应用程序部署。

或者,我可以将我的 Web 应用程序 docker 化。使用 EKS 或自定义设置在 EC2 实例上部署 Kubernetes 集群。我们还可以将 AWS Fargate 用于无服务器功能。

在这里对 Kubernetes 使用第二种方法的优缺点是什么?

EC2 - 开发者承担更多责任

如果您作为开发人员将应用程序部署到 EC2 机器,您通常还负责维护和修补 EC2 实例。问题是,这是开发人员通常不擅长的事情,通常也不那么感兴趣。监视和修补 Linux 机器或排除网络故障不是他们的专长。

Kubernetes - 减少开发人员的责任

使用 Kubernetes,作为开发人员,您只需负责应用程序容器,并且您的应用程序是健康的。但是另一个团队,例如平台团队可能负责底层基础设施,例如EC2 实例和网络。或者与 Fargate 一样,云提供商可以对此负责。

认知负荷

让开发人员承担更少的责任,但仍然拥有用于 self-service 部署的 API,这让他们变得非常高效。

需要一个平台团队

但是当开始使用 Kubernetes 作为平台时,您会面临更多的复杂性。为此,您需要成为一个足够大的组织。除非您使用更高级别的服务,例如Google Cloud Run.

关于这一切的一个好话题是Kubernetes is Not Your Platform, It's Just the Foundation

Kubernetes 是一个容器编排器,用于管理容器化工作负载的生命周期。 运行无论是托管的还是内部部署的 Kubernetes 集群都会产生大量的操作开销。

Kubernetes 的好处 medium-to-large 扩展容器化工作负载。对于单个整体应用程序,负面影响远远超过使用 Kubernetes 的好处。

对于您的用例,建议使用托管应用程序服务。如果您更喜欢拥有更多控制权,那么滚动您自己的 EC2 基础设施将是下一个最佳建议。

说 Kubernetes 对开发人员来说更容易是错误的说法。实际上,Kubernetes 是一个非常复杂且有效运行成本高昂的系统。要安全有效地 运行 Kubernetes 集群需要大量的操作开销。

您将需要维护节点,使用昂贵的负载均衡器来公开流量,实施设计来处理持久数据和会话管理。

此外,容器不会神奇地删除操作任务。它们仍然容易出现漏洞,并且必须存在一个工作流来定期使用更新的基础映像更新应用程序的容器映像。

另一个挑战是容器被设计为短暂的,这意味着状态更改必须持久保存到附加的卷,并且会话管理必须外部化。所有这些增加了更多的复杂性和开销。