我有一个包含2个容器的pod test-1495806908-xn5jn
。我想重新启动其中一个名为container-test
的人。是否可以重新启动pod中的单个容器以及如何?如果没有,我该如何重启pod?
使用deployment.yaml创建了pod:
kubectl create -f deployment.yaml
答案 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 >>
的Pod2)要再次启动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 为您进行受控重启。