Kubernetes相当于`docker run --init`

时间:2018-06-11 17:35:56

标签: node.js docker kubernetes

建议最佳做法是不要将dockerized Node.JS应用程序作为PID 1(请参阅https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#handling-kernel-signals)运行,以便正确捕获信号。

docker run命令提供--init标志,用一个小的init系统包装应用程序入口点,该系统可以正确转发信号。

Kubernetes中是否有内置等效的--init标志?

我已经探讨了Kubernetes 1.10的Pod和Container对象规范,但没有看到任何与指定图像如何开始相关的内容。

另一种方法是在每个容器中明确包含和使用Tini,但我真的希望某种方式以--init标志的行为方式透明地进行。{/ p>

还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

如果您为Pod启用了进程(PID)名称空间共享,则初始化进程(SELECT T.id, MAX(T.date) max_date, ( SELECT MAX(N.date) FROM YourTable N WHERE N.id = T.id AND N.date < MAX(T.date) ) penultimate FROM YourTable T GROUP BY T.id )将来自Kubernetes。如果您的容器具有单独的进程名称空间,则它们需要自己包含pause或其他init进程。

根据https://www.ianlewis.org/en/almighty-pause-container,Kubernetes 1.7默认情况下具有共享的进程名称空间,并且具有kubelet标志来禁用它,1.8缺省情况下具有它的关闭状态以及kubelet标志来启用它。 Kubernetes 1.11具有Alpha功能以启用共享的进程名称空间: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/

答案 1 :(得分:2)

如果您认为Kubernetes使用Docker命令创建容器,那么您应该知道它对--init密钥一无所知。换句话说,Kubernetes没有用另一个初始过程启动容器的包装器。

因此,如果您想在Kubernetes中使用此功能,则需要准备一个包含Tini的Docker镜像。

实际上,Tini包含在Docker 1.13或更高版本中,您只需将--init标记传递给docker run即可启用它。因此,要将Tini添加到图像中,请使用Dockerfile中的以下代码:

# Add Tini
ENV TINI_VERSION <check-version-on-github>
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]

# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]