kubernetes在pod中重启容器

时间:2017-09-08 19:33:50

标签: kubernetes kubectl

我有一个包含2个容器的pod test-1495806908-xn5jn。我想重新启动其中一个名为container-test的人。是否可以重新启动pod中的单个容器以及如何?如果没有,我该如何重启pod?

使用deployment.yaml创建了pod:

kubectl create -f deployment.yaml

13 个答案:

答案 0 :(得分:57)

  

是否可以重新启动单个容器

不是通过kubectl,虽然根据群集的设置,您可以“欺骗”#34;和docker kill the-sha-goes-here,这将导致kubelet重新启动"失败"容器(当然,假设Pod的重启策略说它应该做什么)

  

如何重启pod

这取决于Pod的创建方式,但根据您提供的Pod名称,它似乎受ReplicaSet的监督,因此您可以kubectl delete pod test-1495806908-xn5jn和kubernetes在其中创建一个新的地点(新的Pod会有不同的名称,所以不要指望kubectl get pods再次返回test-1495806908-xn5jn

答案 1 :(得分:25)

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

kubectl exec POD_NAME -c CONTAINER_NAME reboot为我工作。

答案 2 :(得分:8)

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

由于您的 if(hour1<=hour2){ int i; QString list; QString newline=splitted[0]+" - "+splitted[1]; list.append(newline); if(times.contains(firsttime) && times.contains(secondtime)){ for(i=sayac1+1;i<=sayac2+1;i++){ ui->textBrowser_3->setText(list.at(i)); } } else QMessageBox::warning(this,"LIST","GİRDİĞİNİZ ZAMAN ARALIKLARI EŞLEŞMİYOR!"); } if(hour1>hour2) QMessageBox::warning(this,"LIST","İKİNCİ SAAT BİRİNCİDEN BÜYÜK OLAMAZ!"); file.close(); // return output; } } 设置使用deployment。您可以使用replica set删除pod,kubernetes将使用2个容器管理新pod的创建,而不会出现任何停机。尝试在pod中手动重启单个容器会抵消kubernetes的全部好处。

答案 3 :(得分:7)

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

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

答案 4 :(得分:6)

我正在使用

kubectl rollout restart deployment [deployment_name]

kubectl delete pod [pod_name]

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

coredns窗格中有一个问题,我删除了这样的窗格

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

其窗格将自动重新启动。

答案 8 :(得分:1)

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

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

以我为例,当我更改应用程序配置时,我不得不重新启动在sidecar模式下使用的容器,我将终止docker用户拥有的spring boot应用程序的PID。

答案 9 :(得分:0)

以上所有答案都提到了删除吊舱...但是,如果您有多个相同服务的吊舱,那么删除其中每个吊舱将很繁琐。...因此,我提出以下解决方案:

要重新启动,您需要执行两个步骤: 1)将比例尺设置为零-

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

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

的Pod

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

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

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

答案 10 :(得分:0)

我正在尝试重新启动容器的方法。我为我找到的是这个解决方案:

Dockerfile:

...
ENTRYPOINT [ "/app/bootstrap.sh" ]

/app/bootstrap.sh:

#!/bin/bash
/app/startWhatEverYouActuallyWantToStart.sh &
tail -f /dev/null

每当我想重新启动容器时,我都会使用 tail -f /dev/null 终止进程

kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print $1}'`

执行该命令后,除带有 PID==1 的进程之外的所有进程都将被终止,并且入口点(在我的情况下为 bootstrap.sh)将(再次)执行。

那是“重启”部分——这不是真正的重启,但它最终会做你想做的事。对于限制重新启动名为 container-test 的容器的部分,您可以将容器名称传递给相关容器(因为容器名称将在容器内不可用),然后您可以决定是否执行上述操作kill。 在您的 deployment.yaml:

中应该是这样的
    env:
    - name: YOUR_CONTAINER_NAME
      value: container-test

/app/startWhatEverYouActuallyWantToStart.sh:

#!/bin/bash
...
CONDITION_TO_RESTART=0
...
if [ "$YOUR_CONTAINER_NAME" == "container-test" -a $CONDITION_TO_RESTART -eq 1 ]; then
    kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print $1}'`
fi

答案 11 :(得分:0)

我们可以简单地使用这个命令来重启特定命名空间中的所有 pod

  kubectl -n namespace delete pods --all

答案 12 :(得分:0)

我意识到这个问题很老并且已经得到了回答,但我想我会用我的方法来解决。

每当我想这样做时,我只需对 pod 的容器的图像字段进行微小更改,这会导致 kubernetes 仅重新启动容器。

如果您无法在 2 个不同但等效的标签之间切换(例如 :latest / :1.2.3,其中最新的是实际上版本 1.2.3),那么您始终可以快速将其切换为无效标签(我在末尾放了一个 X,例如 :latestX 或其他东西),然后重新编辑它并在之后立即删除 X,这确实会导致容器从图像拉取开始失败错误几秒钟。

例如:

kubectl edit po my-pod-name

找到你想杀死的spec.containers[].name,然后找到它是image

apiVersion: v1
kind: Pod
metadata:
  #...
spec:
  containers:
  - name: main-container
    #...
  - name: container-to-restart
    image: container/image:tag
#...

您将搜索要重启的容器,然后将其映像更新为不同的内容,这将迫使 kubernetes 为您进行受控重启。