Answers:
是否可以重启单个容器
不能通过kubectl
,尽管您可以根据集群的设置进行“欺骗”和“操作” docker kill the-sha-goes-here
,这将导致kubelet重新启动“失败的”容器(当然,假设Pod的重新启动策略表明应该这样做)
我如何重新启动Pod
这取决于Pod的创建方式,但是根据您提供的Pod名称,它似乎在ReplicaSet的监督之下,因此您可以使用kubectl delete pod test-1495806908-xn5jn
kubernetes代替它创建一个新的Pod(新Pod将具有一个名称不同,因此不要指望再次kubectl get pods
返回test-1495806908-xn5jn
)
docker kill the-sha-goes-here
,那为什么不这样做docker container restart the-sha-goes-here
呢?为什么要依靠kubelet
重启呢?无论如何,真正的问题是我docker
什至要在哪里运行命令以杀死容器。在上could-shell
,docker
不显示k8s集群中的容器!
在某些情况下,您想重新启动特定的容器而不是删除pod并让Kubernetes重新创建它。
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5
为我做工作。
(I改变命令从reboot
到/sbin/killall5
根据以下建议)。
reboot
; 我有更多的运气去执行/sbin/killall5
。杀死所有进程,容器将退出。
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot
就像魅力一样工作
pod和container都是短暂的,请尝试使用以下命令停止特定的容器,并且k8s集群将重新启动新的容器。
kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"
这将向SIGTERM
进程1 发送信号,该进程1是容器中运行的主要进程。所有其他进程将是进程1的子进程,并且将在进程1退出后终止。有关可发送的其他信号,请参见kill联机帮助页。
拥有kubernetes的全部原因是,它可以为您管理容器,因此您不必太在意吊舱中容器的生命周期。
由于您有使用的deployment
设置replica set
。您可以使用删除Pod,kubectl delete pod test-1495806908-xn5jn
并且kubernetes将使用2个容器管理新Pod的创建,而不会造成任何停机。尝试手动重启Pod中的单个容器会否定kubernetes的全部优势。
以上所有答案都提到了删除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。
kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"
代替。这将更新部署,并因此根据滚动更新策略启动对其管理的所有Pod的重新创建。
我们使用非常方便的命令行来强制在集成吊舱上重新部署新映像。
我们注意到,我们所有的高山容器都在PID 5上运行其“ sustaining”命令。因此,向其发送SIGTERM
信号会使容器停机。imagePullPolicy
设置Always
为时,将kubelet带回容器时会重新拉动最新图像。
kubectl exec -i [pod name] -c [container-name] -- kill -15 5
kill -15 5
运行kill命令时,会将信号“ -15”发送到带有PID 5的进程。这就是您告诉进程您希望其终止的方式(SIGTERM ),并花费时间清理所有打开的资源(临时文件,回滚db事务,关闭连接等)。与-9(SIGKILL)相反,它会立即终止该进程,不允许其清理任何打开的资源。