我们可以使用 kops 将配置为在多节点 AWS EC2 K8s 集群上运行的应用程序运行到本地 kubernetes 集群(使用 kubeadm)吗?

时间:2021-07-18 05:56:49

标签: amazon-web-services docker kubernetes amazon-ec2 kops

我们能否将配置为使用 kops (project link) 在多节点 AWS EC2 K8s 集群上运行的应用程序运行到本地 Kubernetes 集群(使用 kubeadm 设置)?

我的想法是,如果应用程序运行在基于 AWS EC2 实例的 k8s 集群中,它也应该也运行在本地 k8s 集群中。我正在本地进行测试以进行测试。

这是我到目前为止尝试过的,但没有用。

  • 首先,我使用 kubeadm 设置了我的本地 2 节点集群
  • 然后,我通过删除对 EC2(因为我使用本地机器)和 kops(特别是在它们的 create_cluster.py 脚本中)状态的所有引用来修改项目的安装脚本(上面给出的链接)。
  • 我修改了他们的应用程序 yaml 文件(应用程序要求)以满足我的本地设置(2 节点)

不幸的是,虽然大多数应用程序 Pod 已创建并处于运行状态,但其他一些应用程序 Pod 无法创建,因此,我无法在本地集群上运行整个应用程序。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是 Docker 和 Kubernetes 的美妙之处。它有助于使您的开发环境与生产环境相匹配。对于无需自定义资源编写的简单应用程序,您可以将相同的工作负载部署到在任何云提供商上运行的任何集群。

但是,将相同的工作负载部署到不同集群的能力取决于一些因素,例如,

  • 您如何管理集群中的授权和身份验证?例如,IAM、IRSA..
  • 您是否在使用任何云原生自定义资源 - 例如用作负载均衡器服务的 AWS ALB
  • 您是否在使用任何云原生存储 - 例如,您的 Pod 依赖于 EFS/EBS 卷
  • 您的应用是否与云竞争 - 例如使用 Neptune 等原生技术
  • 您能否在本地模拟云技术 - 例如。使用本地堆栈模拟 Kinesis、Dynamo
  • 您如何解析 DNS 路由 - 例如,假设您使用的是 RDS n AWS。您可以使用 route53 条目访问它。在本地,您可能正在运行一个 mysql 实例,并且您需要一个 DNS 机制来发现该实例。

我进行了谷歌搜索并查看了 kOps 的文档。我找不到任何关于如何部署到本地的信息,它只支持公共云提供商。

IMO,您需要找到一种方法来设置本地 EKS 集群,如果使用了云原生技术,您需要找到一种在本地执行相同操作的替代方法。

答案 1 :(得分:1)

正如Rajan Panneer Selvam 在他的回复中所说的那样,真正的答案是视情况而定,但我想通过说您的申请应该来扩展他的答案em> 运行在任何 K8S 集群上,前提是它提供应用程序使用的服务。您正在做的事情被认为是确保您的应用程序可移植的良好做法,这在非平凡应用程序中始终是一个因素,在这些应用程序中,简单地升级下游服务可能被视为需要可移植性(平台独立性)的环境/平台更改。

为了帮助您实现这一目标,您应该开发 12-Factor Application (12-FA) 或其更新版本之一(12-FA 现在有点过时,并且已经提出了许多变体,但大多数情况下它们都很好)。

例如,如果您的应用程序使用数据库,那么它应该使用与数据库无关的 SQL 或 no-sql,以便您可以将其切换出去。在生产中,您可能在 Oracle 上运行,但在您的本地环境中您可能会使用 MySQL:您的应用程序不应该关心。凭据和连接字符串应通过常用的密钥和配置映射的 K8S 技术传递给应用程序,以帮助您实现这一目标。并且所有日志都应发送到 stdout(和 stderr),以便您可以使用日志传送代理将日志发送到比本地文件系统更有用的地方。

如果您在本地运行您的应用程序,那么您必须为生产中提供的每个“平台”服务提供一个代理,这可能意味着切换您认为是您的应用程序的主要组件,但这没关系,它是注定要发生的。您提供一个平台,为您的应用程序层提供服务。从 EC2 切换到本地可能意味着重新配置入口控制器以在没有 ELB 的情况下工作,或者可能意味着配置 kubernetes 秘密以将本地存储用于开发凭证而不是 AWS KMS。这可能意味着重新配置您的持久卷类以使用本地存储而不是 EBS。所有这一切都在意料之中,而且是正确的。

您不需要做的是开始编辑微服务以在新环境中工作。如果您发现自己这样做了,那么应用程序就出现了分解和分层错误。平台服务应该提供给使用它们的一组微服务,微服务不应该知道这些服务的实现细节。

当然,您的系统中可能有一些不可移植的代码,例如,您可能正在使用一些无法在其他地方运行的特定于 Oracle 的 PL/SQL。应将此代码提取到为您希望运行的每个数据库提供的配置文件和等效文件中。这并不总是可行的,在这种情况下,您应该尽可能多地抽象为隔离的服务,并且您必须在每个新平台上仅重新实现这些服务,这可能仍然很耗时,但最终对大多数人来说是值得的非平凡的系统。