Kubernetes--一个容器如何启动两个进程并同时绑定到这两个进程?

pxiryf3j  于 2022-09-20  发布在  Kubernetes
关注(0)|答案(4)|浏览(329)

我需要一个部署,每个豆荚有一个单一的容器,每个容器有2个Java进程运行。由于容器以进程(P1)启动,如果该特定进程(P1)被终止,则Pod重新启动。有没有可能,容器从两个进程开始,即使其中一个进程被终止,容器(或Pod,在我们的例子中,因为每个Pod只有一个容器)会重新启动?我找不到任何与此相关的文件,说明它可以或不能这样做。另外,如何使用2个进程启动容器?如果我在我的docker映像中尝试这样的操作(javaProcess是一个Java文件),它只运行第一个进程:

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

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

4si2a6ki

4si2a6ki1#

您可以使用supervisord完成此操作。您的主进程应该绑定到docker映像中的Supervisor ord,并且应该使用Supervisor管理两个Java进程。
Supervisor的主要用途是基于其配置文件中的数据创建和管理流程。它通过创建子流程来实现这一点。Supervisor产生的每个子进程在其整个生命周期内都由Superord管理(Superord是它创建的每个进程的父进程)。当孩子死亡时,Supervisor通过SIGCHLD信号通知其死亡,并执行适当的操作。

以下是启动两个Java进程的Superord配置文件示例。(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

在您的docker文件中,您应该这样做:

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"]
4smxwvx5

4smxwvx52#

从Kubernetes配置运行Supervisor

要添加到@AnuruddhaLankaLiyanarachchi答案,您还可以通过在YAML文件中提供commandargs密钥,从Kubernetes安装程序运行Supervisor:

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"]
lf3rwulv

lf3rwulv3#

您可以添加‘&’符号在后台运行进程。

java javaProcess &
java -jar abc.jar

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

osh3o9ms

osh3o9ms4#

我需要一个部署,每个豆荚有一个单一的容器,每个容器有2个Java进程运行。

这是一个在一个吊舱中运行两个集装箱的典型案例。我能想到的唯一例外是P1和P2共享一个套接字,或者(更糟糕的是)使用共享内存。

使用Superord将会起作用,但它是Kubernetes的反模式。正如你已经注意到的,有几种P1/P2故障的组合最好由Kubernetes直接处理。

相关问题