[我有一组供应商提供的容器,它们一起工作以提供服务,我们将它们称为A,B和C-Kubernetes集群在单独的Pod中运行每个容器中的一个。
理想情况下,我想一次性全部部署这-这意味着我需要以某种方式在容器B中创建一个帐户(通过调用A,然后将该值放入C的环境变量中。
一些想法:
对我来说,唯一可行的解决方案是将initContainer放在C上,该C将向B查询(通过A)安全令牌,然后将其写入共享卷。然后,我将在容器C的顶部构建以读取共享卷,在容器内部设置环境变量,然后开始供应商的过程。但是然后我必须管理用户帐户的机密。
该方法是否有改进,或者我没有考虑过完全不同的事物?
从容器内部执行API操作不是反模式。在initContainer运行并更新包含令牌的Secret之前,阻止在C上启动进程。不要将ConfigMap用于机密;为了实现这些目的而存在Secret对象,您可以将Secret引入到PodSpec中(作为env vars或卷装入),就像拉ConfigMap一样(具有一些小的语法变化)。
我可以看到的唯一可能遇到的麻烦是,您将要处理多个副本,因此您可能希望随机化一些Secret名称。在Pod共享文件系统中,在initContainer中创建它,在文件系统中传递随机名称,然后在主容器中使用它,并在设置环境变量或装载后删除Secret。 Pod启动后,机密和ConfigMap可以消失,而不会影响它们在Pod中的存在。
您可能还需要某种清理用户帐户的方法,因为从本质上来说,每次复制副本启动时您都会创建一个新用户,并且没有机会删除它。 cron作业可能是解决该问题的方法-列出与您的命名约定匹配的用户帐户,然后重新启动部署并在重新启动之前在您获取的列表中删除这些帐户。这样一来,您就不会在任何活动的复制品上花钱了。