如何在Kubernetes中创建一个post-init容器?

23

我正在尝试在K8s上创建一个Redis集群。当所需数量的Redis容器在线时,我需要一个辅助容器来创建集群。

我有两个容器,redis和一个辅助容器。我在一个带有6个副本的statefulset中运行它们。我需要辅助容器只为每个副本运行一次,然后终止。它确实这样做了,但是K8s却不断重新运行辅助容器。

我尝试在容器级别设置restartPolicy,但无效。似乎K8s仅支持在pod级别进行此操作。但我不能使用这种方法,因为我想要重启redis容器,但不想重启辅助容器。

是否存在像post-init container这样的东西?我的辅助容器需要在主要redis容器之后运行,以使其加入集群。因此,init container无用。

有没有最佳解决方案来解决K8s 1.6中的这个问题?


2
一个 postStart Container hook 会有帮助吗?它不是另一个容器,而是一个在容器的命名空间和cgroups中执行的“命令”(例如脚本)。 - chrk
我想如果没有更好的选择,我可以使用那个,但这意味着我必须将我的管理脚本添加到主要的redis容器中,而不是保持在旁路车中,这是我更喜欢的。 - jbrown
3个回答

8

4
更好的解决方案是让附属容器进入一个无限睡眠循环。如果它从未退出,它就永远不会被重新启动。可以使用资源限制来确保对集群的影响最小化。

1
这个方法可能可行,但前提是你在 sidecar 中所做的操作是安全可重复的,因为不能保证容器不会重新启动。如果你想确保这一点,可以考虑在 pod 中编写一个空文件(该文件只能在 pod 存活期间存在,因此你知道它只被运行了一次)。 - Leo Lei

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接