我试图找出GKE堆栈中的哪些工具应该应用于我的用例,这是具有动态HTTPendpoint的有状态应用程序的动态部署。
在我的例子中,有状态意味着我不想要任何副本和负载平衡(因为应用程序根本不水平扩展)。我知道在k8s/gke命名法中,我仍然会使用“负载均衡器”,即使它将充当反向代理,实际上不会平衡任何负载。
用例如下。我有一些网络应用程序,我可以请求一个“新实例”,作为回报,我得到一个动态生成的url(例如http://random-uuid-1.acme.io)。这个域应该指向一个新产生的、托管某个网络应用程序的容器(Pod)的单个实例。同样,如果我请求另一个“新实例”,我将得到一个http://random-uuid-2.acme.io,它将指向另一个(单独的)、同一应用程序的新产生的实例。
到目前为止,我想出了以下设置。每次我请求“新实例”时,我都会执行以下操作:
app-${uuid}
创建一个新的Pod,它公开HTTP端口上面提到的入口使用负载均衡器作为其控制器,这是GKE中的自动化过程。
我已经遇到的一些问题,您可以帮助我解决:
app-1
,app-2
和app-3
,我希望Inego自动监控我命名空间中的所有pod,并根据这些pod的标签创建规则(即app-1.acme.io-
我参与了一个类似的项目,我们的决定是使用库伯内特斯客户端库来生成实例。实例由一个简单的Web应用程序管理,该应用程序采用一些自定义参数,将它们保存到数据库中,然后创建一个实例。由于数据库,跟踪迄今为止创建的内容没有问题。通过查询数据库,我们能够判断此类部署是否已经创建或更新/删除任何相关资源。
每个实例包括:
ClusterIp
服务(没有理由使用NodePort
保留机器端口);我们还使用了外部DNS和证书管理器,一个用于管理DNS记录,另一个用于为入口颁发SSL证书。使用这种设置,部署一个新实例大约需要10分钟。pod和入口控制器在几秒钟内就准备好了,但我们必须等待证书,它的准备情况取决于颁发者的DNS是否获得了我们的新记录。这个问题可以通过使用通配符域来避免,但我们必须使用许多不同的域,因此在我们的情况下这不是一个选择。
除此之外,您可以考虑编写Helm图表并使用helm list
命令来查找现有实例并管理它们。不过,这是一个相当“手动”的解决方案。如果您希望此功能成为应用程序的一部分,最好使用库伯内特斯的客户端库。