在 pod 中重启容器

Restart container within pod

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

pod 是使用 deployment.yaml 创建的:

kubectl create -f deployment.yaml

Is it possible to restart a single container

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

how do I restart the pod

这取决于 Pod 的创建方式,但根据您提供的 Pod 名称,它似乎在 ReplicaSet 的监督下,因此您可以 kubectl delete pod test-1495806908-xn5jn 并且 kubernetes 将创建一个新的取而代之(新的 Pod 将有一个不同的名称,所以不要指望 kubectl get pods 到 return test-1495806908-xn5jn 再一次)

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

因为您有一个使用 replica setdeployment 设置。您可以使用 kubectl delete pod test-1495806908-xn5jn 删除 pod,kubernetes 将管理使用 2 个容器创建新 pod,而无需停机。尝试在 pods 中手动重启单个容器会抵消 kubernetes 的全部好处。

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

kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5 对我有用。

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

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

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

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

我的容器不允许重新启动,所以我不得不使用这个解决方法。

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

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

这将发送一个SIGTERM信号给进程1,它是容器中的主进程运行。所有其他进程都是进程 1 的子进程,并在进程 1 退出后终止。有关您可以发送的其他信号,请参阅 kill manpage

coredns pod 出现问题,我删除了这样的 pod

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

它的pod会自动重启。

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

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

  • 1) 将刻度设置为零:

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

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

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

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

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

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

假设容器 运行 作为根目录,不推荐。

在我的例子中,当我更改应用程序配置时,我不得不重新启动在边车模式中使用的容器,我会终止 spring 引导应用程序的 PID,该应用程序属于 docker 用户。

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

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 }'`

执行该命令后,除带有 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 }'`
fi

我正在使用

kubectl rollout restart deployment [deployment_name]

kubectl delete pod [pod_name]

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

每当我想这样做时,我只需对 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 为您进行受控重启。

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

Pods that run a single container. The "one-container-per-Pod" model is the most common Kubernetes use case; in this case, you can think of a Pod as a wrapper around a single container; Kubernetes manages Pods rather than managing the containers directly.

Note: Grouping multiple co-located and co-managed containers in a single Pod is a relatively advanced use case. You should use this pattern only in specific instances in which your containers are tightly coupled.

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