重新启动容器中的容器


112

我有一个test-1495806908-xn5jn装有2个容器的豆荚。我想重新启动其中一个叫container-test。是否可以重新启动容器中的单个容器,以及如何重启?如果没有,如何重新启动Pod?

此广告连播是通过使用deployment.yamlwith 创建的:

kubectl create -f deployment.yaml

Answers:


144

是否可以重启单个容器

不能通过kubectl,尽管您可以根据集群的设置进行“欺骗”和“操作” docker kill the-sha-goes-here,这将导致kubelet重新启动“失败的”容器(当然,假设Pod的重新启动策略表明应该这样做)

我如何重新启动Pod

这取决于Pod的创建方式,但是根据您提供的Pod名称,它似乎在ReplicaSet的监督之下,因此您可以使用kubectl delete pod test-1495806908-xn5jnkubernetes代替它创建一个新的Pod(新Pod将具有一个名称不同,因此不要指望再次kubectl get pods返回test-1495806908-xn5jn


7
默认的重新启动策略始终为重新启动
Hem

如果我可以这样做:docker kill the-sha-goes-here,那为什么不这样做docker container restart the-sha-goes-here呢?为什么要依靠kubelet重启呢?无论如何,真正的问题是我docker什至要在哪里运行命令以杀死容器。在上could-shelldocker不显示k8s集群中的容器!
Nawaz

53

在某些情况下,您想重新启动特定的容器而不是删除pod并让Kubernetes重新创建它。

kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5为我做工作。

(I改变命令从reboot/sbin/killall5根据以下建议)。


28
并非每个容器都有reboot; 我有更多的运气去执行/sbin/killall5。杀死所有进程,容器将退出。
Ingo Karkat

1
并非每个容器都有root用户;)
JuliSmz

4
-1,因为...您正在使用'reboot'的副作用,它杀死所有进程并对其进行Kubernetes恢复。它有很多假设:以root用户身份运行,容器中二进制文件的可用性,启用的restartPolicy等。而且,这会使有关进程失败的日志变得混乱,这并不理想。
gertvdijk

1
因此,看起来alpine没有killall,但是/ sbin / reboot很好用。 kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot就像魅力一样工作
Atifm

38

pod和container都是短暂的,请尝试使用以下命令停止特定的容器,并且k8s集群将重新启动新的容器。

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

这将向SIGTERM进程1 发送信号,该进程1是容器中运行的主要进程。所有其他进程将是进程1的子进程,并且将在进程1退出后终止。有关可发送的其他信号,请参见kill联机帮助页


3
我尝试了其他答案,而这是唯一对我有用的答案,在我看来,这是最通用的答案。
Batato

我如何获得在容器中运行的容器名称?
AATHITH RAJENDRAN

当我尝试此操作时,我的Alpine容器进入某种不健康状态。kubectl GET PO显示错误在吊舱的状态栏..
Atifm

17

拥有kubernetes的全部原因是,它可以为您管理容器,因此您不必太在意吊舱中容器的生命周期。

由于您有使用的deployment设置replica set。您可以使用删除Pod,kubectl delete pod test-1495806908-xn5jn并且kubernetes将使用2个容器管理新Pod的创建,而不会造成任何停机。尝试手动重启Pod中的单个容器会否定kubernetes的全部优势。


2
我的终止吊舱的流程变为0/1时,我经历了停机时间
Dean Christian Armada教务长

6
您需要小心地声明“没有任何停机时间”。这取决于您的确切配置。再加上零停机时间本身就有挑战。
尼古拉斯

当我在只有一个副本的部署中删除吊舱时,总是会遇到停机时间。
Nyein Chan Wynn

7

以上所有答案都提到了删除Pod ...但是,如果您有许多服务相同的Pod,那么删除其中每个Pod会很麻烦...

因此,我提出以下解决方案,重启

  • 1)将比例尺设置为零:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    上面的命令将终止所有名称为 <<name>>

  • 2)要再次启动Pod,请将副本设置为大于0

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    上面的命令将使用两个副本再次启动您的Pod。


5
问题是询问如何重新启动Pod中的单个容器。
克里斯海滩,

此外,将比例缩小到0的窗格将不适用于高可用性应用程序。使用kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"代替。这将更新部署,并因此根据滚动更新策略启动对其管理的所有Pod的重新创建。
Kostrahb

3

我们使用非常方便的命令行来强制在集成吊舱上重新部署新映像。
我们注意到,我们所有的高山容器都在PID 5上运行其“ sustaining”命令。因此,向其发送SIGTERM信号会使容器停机。imagePullPolicy设置Always为时,将kubelet带回容器时会重新拉动最新图像。

kubectl exec -i [pod name] -c [container-name] -- kill -15 5

1
-15和5代表什么?
约翰·巴尔文·阿里亚斯

2
@JohnBalvinArias包含在上面的描述中,但是在kill -15 5运行kill命令时,会将信号“ -15”发送到带有PID 5的进程。这就是您告诉进程您希望其终止的方式(SIGTERM ),并花费时间清理所有打开的资源(临时文件,回滚db事务,关闭连接等)。与-9(SIGKILL)相反,它会立即终止该进程,不允许其清理任何打开的资源。
Conrad.Dean

2

杀死Dockerfile的CMD/ 中指定的进程ENTRYPOINT对我有用。(容器自动重新启动)

容器中不允许重新启动,因此我不得不使用此替代方法。


2

广告coredns连播中存在问题,我通过以下方式删除了该广告连播

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

它的吊舱将自动重启。


2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

假设该容器以root用户身份运行,不建议这样做。

就我而言,当我更改应用程序配置时,我必须重新启动在Sidecar模式中使用的容器,我将终止docker用户拥有的spring boot应用程序的PID。


1
如果您编写kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...,它使人们可以更轻松地进行复制/粘贴。
威廉·珀塞尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.