Kubernetes Pod中的"Sidecar"容器

30
我需要一个多容器的pod,其中包含以下两个组件:
- "main" 容器:包含一个构建任务。 - "sidecar" 容器:包含一个HTTP代理,被 "main" 容器使用。
这似乎符合pod设计哲学,如Kubernetes文档中所描述的那样,但我认为只要 "sidecar" 运行,pod就会保持活动状态。在我的情况下, "main" 容器不是长期运行的;一旦它退出,"sidecar" 应该被终止。
我该如何实现这个功能?
5个回答

23
一个Pod的运行状态与它所包含的容器之一的运行状态相关联。如果您需要让它们同时退出,则必须安排边车退出。与生命周期相关的“主要”与“次要”容器概念我们并没有,不过这也很有趣。
其中一个选项是使用emptyDir卷,并编写一个文件告诉边车“时间到了”。当边车看到该文件时,它将退出。

在我的情况下,问题是辅助车不完全受我控制——它是来自第三方(闭源)的服务,因此我不知道如何安排停止此服务,除非可以向其进程发送信号。 - Anton Daneyko
一个常见的模式是将此容器用作自己镜像的基础镜像(dockerfile FROM)。添加一个脚本并更改入口点到该脚本,然后执行以下操作:在文件/pod/exit-now不存在的情况下,在后台运行“真实”应用程序,睡眠3秒钟;循环;杀死真实应用程序。 - Tim Hockin
此外,还有一个新的 KEP 来教 k8s 如何处理“main”容器。我还没有对其进行审查,但显然是必要的。 - Tim Hockin
好主意,谢谢分享。我最终得到了类似的东西——打开共享进程命名空间,然后“工作”容器向另一个我无法控制的容器发送SIGTERM信号(然而,这并没有完全解决我的问题,因为接收到SIGTERM信号的应用程序以非零代码退出,并且拥有该Pod的作业处于某种奇怪的状态[我现在不记得确切的ATM是什么了])。 - Anton Daneyko

6
如果您仍在寻找答案,那么边车功能正在开发中,并将在Kubernetes的v1.17版本中发布,该版本将具有此请求的确切行为。
从提案中得知:
增强描述:容器现在可以被标记为边车,以便它们在正常容器启动之前启动,并在所有其他容器终止后关闭。

https://github.com/kubernetes/enhancements/issues/753

更新:看起来现在计划在v1.18中实现


8
万一有人几年后来到这里:此功能将不会推出。 - MartinThé

1

当问题被提出时,该功能可能还不可用,但现在可以为Pod定义postStart和preStop处理程序。您可能可以在主容器中定义preStop以杀死sidecar容器。


1

6
是的,这些 Pod 在作业下运行。但我认为只要“副车”容器保持运行,作业就会继续运行。 - obeattie

0
您可以使用活跃探针来解决这个问题。该探针检查“主”容器(以及其自身的任何检查)。一旦主容器停止运行,活跃探针将失败,然后Pod应该被回收。

2
然而请注意,这将标记该Pod为失败,如果这在您的设置中是一个因素。 - Jonas D

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