我在k8上部署了一个微服务,该微服务与外部云服务通信。外部服务对每个应用令牌可以进行的调用次数具有api速率限制。我们可以预先创建多个应用令牌。
我们通常运行2-5个Pod,并希望在每个Pod中使用一个令牌,这样可以避免重叠并超过速率限制。
在开始时,给所有Pod分配令牌的最简单方式是什么?假设所有部署设置完全相同且Pod保持动态回收状态?
答案 0 :(得分:1)
正确的方法可能涉及某种专用服务来分发这些凭据。它可能会使用Kubernetes API来监视Pod以查看其是否退出,或者可能需要服务定期发送心跳以保留其当前令牌。共享的Redis可能是在没有服务器的情况下维护状态的轻量级方法。如果您想花哨的话,可以编写一个Kubernetes控制器,该控制器可以看到使用某些标签创建的Pod,并创建了一个具有秘密的匹配Secret对象。
如果您确实想避免这种情况,可以在StatefulSet中运行您的应用程序。这将具有以下属性:按顺序分配了窗格名称myservice-0
,myservice-1
,...,因此每个窗格都知道它是哪一个。然后,您可以使用令牌创建密钥,其中密钥的密钥是预期的容器名称。该服务将需要代码来从已安装的配置文件中检索值,或者初始化容器需要将正确的值复制到已知位置。 replicated MySQL example in the Kubernetes documentation讨论了有关此初始容器设置的更多信息。如果您的Pod经常停止运行,或者您需要频繁地放大和缩小设置,则由于StatefulSet利用率方面的限制,您可能会遇到一些操作上的麻烦(如果您有5个副本,您不能只停止#2并留下它关闭;您必须停止编号最高的那个)。
另一种骇人听闻的方法是站起一个Redis容器,该容器几乎只包含一个计数器。用您选择的语言编写一个小的脚本,该脚本将带有令牌的Secret挂载为文件,增加计数器(可能是环绕),并将第 n 个令牌写入文件。然后,您可以将Deployment作为初始脚本运行。在这里,您可以轻松地使两个具有相同令牌的Pod运行,但是如果它们定期重新启动,则时间不会太长。