mar*_*ind 11 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系统包装应用程序入口点,该系统可以正确地转发信号.
--init
在Kubernetes中是否有内置的旗帜?
我已经探讨了Kubernetes 1.10的Pod和Container对象规范,但没有看到任何与指定图像如何开始相关的内容.
另一种方法是在每个容器中明确地包含和使用Tini,但我真的希望某种方式能够透明地执行--init
标志的行为.
还有其他选择吗?
Art*_*aev 11
如果你假设 Kubernetes 使用 Docker 命令创建一个容器,那么你应该知道它对--init
key一无所知。换句话说,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"]
Run Code Online (Sandbox Code Playgroud)
如果您为Pod启用了进程(PID)命名空间共享,则初始化进程(pause
)将来自Kubernetes。如果您的容器具有单独的进程名称空间,则它们需要自己包含tini
或另一个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/
归档时间: |
|
查看次数: |
3945 次 |
最近记录: |