Kubernetes相当于`docker run --init`

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 命令创建一个容器,那么你应该知道它对--initkey一无所知。换句话说,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)

  • 嗯..什么?好吧,也许不是很清楚,但是 - Kubernetes 不支持任何特定于运行时的功能,如果它们不是 OpenContainer 标准的一部分,则不会支持它们。此外,由于内部结构和要求,添加特定于运行时的内容并不容易。如果您认为不同,您可以随时提交具有该小功能的合并请求。 (4认同)
  • @AntonKostenko“K8s 可以使用 RKT”并不意味着“K8s 不能包含任何 Docker 特定的支持”。提供特定于运行时的配置选项非常简单。他们只是没有这样做。 (3认同)
  • 在 Dockerfile 中安装 tini 的替代方法(此语法适用于 Alpine Linux):`RUN apk add --no-cache tini` `ENTRYPOINT ["/sbin/tini", "--"]`。从 @emj365 的链接得到这个 (3认同)
  • @marcind Kubernetes 是一个编排容器的系统,Docker `--init` 是容器运行时的一个特性(例如,您可以使用 RKT 代替 Docker for Kubernetes)。因此,Kubernetes 不能包含任何特性,如自定义 init 系统,因为它们是特定于运行时的,而 Kubernetes 不是。 (2认同)

Rol*_*ber 5

如果您为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/

  • 为了快速参考,需要将 `shareProcessNamespace: true` 添加到 Pod 规范中。 (2认同)