提问者:小点点

GKE中动态部署有状态应用


我试图找出GKE堆栈中的哪些工具应该应用于我的用例,这是具有动态HTTPendpoint的有状态应用程序的动态部署。

在我的例子中,有状态意味着我不想要任何副本和负载平衡(因为应用程序根本不水平扩展)。我知道在k8s/gke命名法中,我仍然会使用“负载均衡器”,即使它将充当反向代理,实际上不会平衡任何负载。

用例如下。我有一些网络应用程序,我可以请求一个“新实例”,作为回报,我得到一个动态生成的url(例如http://random-uuid-1.acme.io)。这个域应该指向一个新产生的、托管某个网络应用程序的容器(Pod)的单个实例。同样,如果我请求另一个“新实例”,我将得到一个http://random-uuid-2.acme.io,它将指向另一个(单独的)、同一应用程序的新产生的实例。

到目前为止,我想出了以下设置。每次我请求“新实例”时,我都会执行以下操作:

  • 使用动态名称app-${uuid}创建一个新的Pod,它公开HTTP端口
  • 使用NodePort创建一个新服务,将Pod的HTTP端口公开给集群
  • 创建或更新(如果存在)通过添加一个新的超文本传输协议规则进入,我指定域X应该指向NodePort X

上面提到的入口使用负载均衡器作为其控制器,这是GKE中的自动化过程。

我已经遇到的一些问题,您可以帮助我解决:

  1. 虽然每个应用程序的Pod和NodePort是独立的资源,但入口是共享的。因此,我无法仅创建/删除资源,但我也被迫跟踪已添加到入口的内容,以便能够从yaml中附加/删除,这绝对不是这样做的方式(即编辑yaml)。相反,我可能希望有一个像入口这样的东西来监控特定的命名空间并根据Pod标签自动创建规则。假设我有3个带有标签的pod,app-1app-2app-3,我希望Inego自动监控我命名空间中的所有pod,并根据这些pod的标签创建规则(即app-1.acme.io-

共1个答案

匿名用户

我参与了一个类似的项目,我们的决定是使用库伯内特斯客户端库来生成实例。实例由一个简单的Web应用程序管理,该应用程序采用一些自定义参数,将它们保存到数据库中,然后创建一个实例。由于数据库,跟踪迄今为止创建的内容没有问题。通过查询数据库,我们能够判断此类部署是否已经创建或更新/删除任何相关资源。

每个实例包括:

  • 部署(单副本或多副本,取决于实例);
  • 一个ClusterIp服务(没有理由使用NodePort保留机器端口);
  • 共享入口控制器的入口对象;
  • 和一些共享的配置映射。

我们还使用了外部DNS和证书管理器,一个用于管理DNS记录,另一个用于为入口颁发SSL证书。使用这种设置,部署一个新实例大约需要10分钟。pod和入口控制器在几秒钟内就准备好了,但我们必须等待证书,它的准备情况取决于颁发者的DNS是否获得了我们的新记录。这个问题可以通过使用通配符域来避免,但我们必须使用许多不同的域,因此在我们的情况下这不是一个选择。

除此之外,您可以考虑编写Helm图表并使用helm list命令来查找现有实例并管理它们。不过,这是一个相当“手动”的解决方案。如果您希望此功能成为应用程序的一部分,最好使用库伯内特斯的客户端库。