Kubernetes 创建新Pod时注册kubectl exec命令

Kubernetes 创建新Pod时注册kubectl exec命令,kubernetes,kubectl,Kubernetes,Kubectl,我有一个Dockerfile,它将安装程序复制到容器中,Dockerfile中指定的默认命令是/usr/sbin/init,因为我需要运行某些服务。一旦通过kubectl create-f server rc.yml命令创建了容器,我将在交互模式下运行一个kubectl exec命令来运行该安装程序并通过node.js脚本自动提供输入,该命令如下kubectl exec$container-I-t--bash-c“node install.js”(这将运行安装程序并通过stdin自动提供输入),

我有一个Dockerfile,它将安装程序复制到容器中,Dockerfile中指定的默认命令是
/usr/sbin/init
,因为我需要运行某些服务。一旦通过
kubectl create-f server rc.yml
命令创建了容器,我将在交互模式下运行一个kubectl exec命令来运行该安装程序并通过node.js脚本自动提供输入,该命令如下
kubectl exec$container-I-t--bash-c“node install.js”
(这将运行安装程序并通过stdin自动提供输入),从而启动我在pods上的自定义服务

到目前为止一切都很好。现在让我们说,在2个吊舱中,有一个吊舱死亡,一个新的吊舱生成。现在,我如何确保我最初在吊舱上运行的这些交互式命令也在新生成的吊舱上运行?我不确定在规范中使用
命令
参数
是否有效,因为它们都在非交互式模式。如有任何关于如何解决此问题的想法,将不胜感激

编辑:

Dockerfile(部分代码):

node.js脚本通过
child\u process.spawn
打开
test.bin
,然后侦听
process.stdout.on
,并根据stdout上接收到的内容,通过
process.stdin.write
提供输入


谢谢。

我不知道你说的交互是什么意思。如果这意味着脚本需要人工交互,你就不能自动执行(因为你需要有人这样做)

由于Kubernetes Pods可以在任何时候死亡,您应该使脚本非交互式并扩展/,因此在启动实际服务器之前,它会执行
节点install.js
。MySQL的官方Docker映像就是一个例子,它在启动之前做了一些预配置

很难说得更精确,因为我们没有Dockerfile或
install.js
脚本


Edit如果
install.js
在Dockerfile中运行会更好,因为这将加快启动速度并使服务器代码不可变。

init容器()会有帮助吗?(在卷中安装节点应用程序,然后由容器装载)您可以在configmap中添加输入值,并将configmap作为文件装载到pod中。这将删除交互部分。我刚刚用Dockerfile更新了我的问题,以及install.js脚本的功能。是的,该脚本需要人工交互,但我正在install.js文件中模拟它,以侦听
process.stdout.on
,然后将输入写入
process.stdin.write
。在这种情况下,您只需编写一个脚本,首先执行此操作,最后执行
/usr/sbin/init
。此脚本需要替换
CMD[“/usr/sbin/init”]
在您的Dockerfile中。通过shell脚本执行
/usr/sbin/init
似乎对我不起作用。获取以下错误
无法找到替代telinit实现来生成
。目前,我使用CMD作为
/usr/sbin/init
本身,但注册一个cron作业以在一分钟后通过crontab.Kin运行脚本da hacky解决方案。您可以尝试
exec/usr/sbin/init
。除此之外,您的
CMD
看起来像一个沉重的init进程,这对Docker来说是一个糟糕的做法。请参阅。
FROM centos:7

ENV container docker

RUN yum -y update; yum clean all

VOLUME [ “/sys/fs/cgroup” ]

RUN yum -y install nodejs npm && npm install progress

RUN mkdir -p /tmp

COPY ./install.js /tmp

COPY ./test.bin /tmp/

CMD ["/usr/sbin/init"]