Kubernetes - 如何使用2个进程启动容器并绑定到它们?

时间:2017-04-20 05:27:08

标签: kubernetes

我需要一个部署,其中每个pod都有一个容器,每个容器都有2个java进程在运行。因为,容器以进程(P1)开始,如果该特定进程(P1)被终止,则pod重新启动。是否有可能,我启动容器从2个进程开始,即使其中一个被杀死,容器(或我们的情况下的pod,因为每个pod只有一个容器)重新启动?我找不到任何与此相关的文档,说它可以/不可以完成。另外,如何使用2个进程启动容器?如果我在docker镜像中尝试这样的东西(javaProcess是一个java文件),它只运行第一个进程:

java -jar abc.jar
java javaProcess
or 
java javaProcess
java -jar abc.jar

如果我使用一个进程启动容器(P1)并在容器启动后启动另一个进程(P2),则容器将不会绑定到P2,因此如果P2终止,容器将不会重新启动。但是,我需要重启!

3 个答案:

答案 0 :(得分:4)

您可以使用supervisord执行此操作。您的主进程应该绑定到docker image中的supervisord,并且应该使用supervisord管理两个java进程。

  

supervisord的主要目的是创建和管理基于流程的流程   在其配置文件中的数据。它通过创造来做到这一点   子进程。由主管生成的每个子进程都是为管理的   由supervisord完成其整个生命周期(supervisord是父母   它创建的每个过程的过程)。当一个孩子去世时,主管就是   通过SIGCHLD信号通知其死亡,并执行   适当的操作。

以下是一个启动两个java进程的示例supervisord配置文件。 (supervisord.conf)

[supervisord]
nodaemon=true

[program:java1]
user=root
startsecs = 120
autorestart = true
command=java javaProcess1

[program:java2]
user=root
startsecs = 120
autorestart = true
command=java javaProcess2

在您的泊坞窗文件中,您应该执行以下操作:

RUN apt-get update && apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]

答案 1 :(得分:2)

从Kubernetes配置运行主管

要添加到@AnuruddhaLankaLiyanarachchi答案中,您还可以通过在Yaml文件中提供commandargs键,从Kubernetes设置中运行超级用户:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-example
spec:
  containers:
    - name: nginx-pod-example
      image: library/nginx
      command: ["/usr/bin/supervisord"]
      args: ["-n", "-c", "/etc/supervisor/supervisord.conf"]

答案 2 :(得分:0)

您可以添加'&'签名以在后台运行进程。

java javaProcess &
java -jar abc.jar

通过这种方式,您将在pod中运行两个进程。但是,您的容器将绑定到前台的进程!