繁体   English   中英

重新启动 pod 内的容器

[英]Restart container within pod

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

pod 是使用deployment.yaml创建的:

kubectl create -f deployment.yaml

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

不是通过kubectl ,尽管根据集群的设置,您可以“作弊”和docker kill the-sha-goes-here ,这将导致 kubelet 重新启动“失败”的容器(当然,假设为Pod 说这是它应该做的)

我如何重新启动吊舱

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

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

kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5对我kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5

(我根据以下建议将命令从reboot更改为/sbin/killall5 。)

pod 和容器都是临时的,尝试使用以下命令停止特定的容器,k8s 集群将重新启动一个新的容器。

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

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

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

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

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

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

  • 1)将比例设置为零:

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

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

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

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

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

我正在使用

kubectl rollout restart deployment [deployment_name]

kubectl delete pod [pod_name]

我们使用一个非常方便的命令行来强制在集成 pod 上重新部署新镜像。
我们注意到我们的 alpine 容器都在 PID 5 上运行它们的“维持”命令。因此,向它发送SIGTERM信号会使容器停止运行。 imagePullPolicy设置为Always ,kubelet 在将容器带回时重新拉取最新的图像。

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

coredns pod 中存在问题,我删除了这样的 pod

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

它的 pod 会自动重启。

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

假设容器以 root 身份运行,这是不推荐的。

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

终止 Dockerfile 的CMD / ENTRYPOINT中指定的进程对我ENTRYPOINT (容器自动重启)

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

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

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

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

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

如果您无法在 2 个不同但等效的标签之间切换(例如:latest / :1.2.3 ,其中最新实际上是1.2.3 版),那么您可以随时将其快速切换到无效标签(我在像: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 为您进行受控重启。

正确但可能不太受欢迎的答案是,如果您需要在 pod 中重新启动一个容器,那么它不应该在同一个 pod 中。 您无法根据设计重新启动 pod 中的单个容器。 只需将容器移到它自己的 pod 中即可。 从文档

运行单个容器的 Pod。 “每个 Pod 一个容器”model 是最常见的 Kubernetes 用例; 在这种情况下,您可以将 Pod 视为单个容器的包装器; Kubernetes 管理 Pod,而不是直接管理容器。

注意:在单个 Pod 中将多个共同定位和共同管理的容器分组是一个相对高级的用例。 您应该仅在容器紧密耦合的特定情况下使用此模式。

https://kubernetes.io/docs/concepts/workloads/pods/

有时没有人知道 pod 有哪个操作系统,pod 可能根本没有sudoreboot

更安全的选择是拍摄快照并重新创建 pod。

kubectl get <pod-name> -o yaml > pod-to-be-restarted.yaml; 
kubectl delete po <pod-name>; 
kubectl create -f pod-to-be-restarted.yaml

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM