kubernetes在pod中重启容器

s5s*_*s5s 69 kubernetes kubectl

我有一个test-1495806908-xn5jn带2个容器的吊舱.我想重新启动其中一个叫container-test.是否可以重新启动pod中的单个容器以及如何?如果没有,我该如何重启pod?

pod是使用deployment.yaml创建的:

kubectl create -f deployment.yaml
Run Code Online (Sandbox Code Playgroud)

mda*_*iel 95

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

不通过kubectl,虽然取决于您的群集的设置,您可以"作弊" 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)

  • 默认重启策略始终为重启 (3认同)
  • 如果我可以这样做:`docker Kill the-sha-goes-here`,那么为什么不执行`docker container restart the-sha-goes-here`呢?为什么要依赖 kubelet 来重启呢?不管怎样,真正的问题是我在哪里运行“docker”命令,即使它是为了杀死容器。在 `could-shell` 上,`docker` 不显示 k8s 集群中的容器! (2认同)

Zso*_*ona 36

在某些情况下,您需要重新启动特定容器而不是删除容器并让Kubernetes重新创建它.

做一个kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5为我工作.

  • 并非每个容器都有`reboot`; 我更喜欢执行`/ sbin/killall5`; 杀死所有进程,容器将退出. (24认同)
  • 所以看起来 alpine 没有killall,但是 /sbin/reboot 效果很好。`kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot` 非常有效 (4认同)
  • -1,因为...您正在使用“重新引导”的副作用,它会杀死所有进程并对其进行Kubernetes恢复。它有很多假设:以root用户身份运行,容器中二进制文件的可用性,启用的restartPolicy等。而且,这会使有关进程失败的日志变得混乱,这并不理想。 (2认同)

ROY*_*ROY 20

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

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"
Run Code Online (Sandbox Code Playgroud)

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

  • 我尝试了其他答案,这是唯一对我有用的答案,在我看来,它是最通用的答案。 (4认同)

Aja*_*ddy 15

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

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

  • 1)将比例设置为零:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 2)要再次启动pod,将replicas设置为大于0

    kubectl scale deployment <<name>> --replicas=2 -n service
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 问题是询问如何重新启动 Pod 中的单个容器。 (9认同)

Inn*_*gbo 12

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

由于您有一个deployment使用的设置replica set.您可以删除pod kubectl delete pod test-1495806908-xn5jn,kubernetes将使用2个容器管理新pod的创建,而不会出现任何停机.尝试手动重启pod中的单个容器会抵消kubernetes的全部好处.

  • 当我删除部署中只有 1 个副本的 pod 时,我总是遇到停机时间。 (4认同)
  • 您需要小心地声明“没有任何停机时间”。这取决于您的确切配置。再加上零停机时间本身就有挑战。 (3认同)
  • 我经历了停机,因为终端吊舱的过程变为0/1 (2认同)

小智 11

我正在使用

kubectl rollout restart deployment [deployment_name]
Run Code Online (Sandbox Code Playgroud)

或者

kubectl delete pod [pod_name]

Run Code Online (Sandbox Code Playgroud)


Ale*_*ROS 5

我们使用非常方便的命令行来强制在集成 Pod 上重新部署新映像。
我们注意到我们的 alpine 容器都在 PID 5 上运行“维持”命令。因此,向其发送信号SIGTERM会导致容器关闭。imagePullPolicy设置为Always让 kubelet 在带回容器时重新拉取最新镜像。

kubectl exec -i [pod name] -c [container-name] -- kill -15 5
Run Code Online (Sandbox Code Playgroud)

  • @JohnBalvinArias它隐藏在上面的描述中,但是在“kill -15 5”中,您正在运行kill命令以向PID为5的进程发送信号“-15”。这就是您告诉进程您想要的方式让它终止(SIGTERM)并花时间清理所有打开的资源(临时文件、回滚数据库事务、关闭连接等)。与 -9 (SIGKILL) 相比,立即终止进程,不允许它清理任何打开的资源。 (4认同)