重新启动吊舱内的容器

我有一个带有两个容器的 test-1495806908-xn5jn分离舱。我想重启一个叫 container-test的程序。是否有可能在一个吊舱内重新启动一个容器? 如何重新启动?如果没有,我怎么重新启动逃生舱?

豆荚是使用 deployment.yaml创建的,具有:

kubectl create -f deployment.yaml
379597 次浏览

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

不是通过 kubectl,虽然取决于您的集群的设置,您可以“欺骗”和 docker kill the-sha-goes-here,这将导致忽必烈重新启动“失败的”容器(假设,当然,Pod 的重新启动策略说,这是它应该做的)

我怎么重新启动逃生舱

这取决于 Pod 是如何创建的,但是根据你提供的 Pod 名称,它似乎在 ReplicaSet 的监督之下,所以你可以只用 kubectl delete pod test-1495806908-xn5jn和 kubernetes 就可以在它的位置创建一个新的(新的 Pod 将有一个不同的名称,所以不要期望 kubectl get pods再次返回 test-1495806908-xn5jn)

拥有库伯内特的全部原因是因为它为你管理容器,所以你不必太在意容器在豆荚里的生命周期。

因为您有一个使用 replica setdeployment设置。您可以使用 kubectl delete pod test-1495806908-xn5jn删除吊舱和库伯内特将管理创建一个新的吊舱与2个容器没有任何停机时间。试图手动重新启动单个容器的吊舱否定了库伯内特的全部好处。

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

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

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

我们使用一个相当方便的命令行,以强制重新部署新鲜的图像集成吊舱。
我们注意到我们的高山集装箱都在 PID 5上运行它们的“维持”命令。因此,向它发送 SIGTERM信号会使容器下降。imagePullPolicy被设置为 Always有库伯列重新拉最新的图像时,它带回容器。

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

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

在我的容器中不允许重新引导,所以我必须使用这个变通方法。

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

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

这将向进程1发送一个 SIGTERM信号,进程1是在容器中运行的主进程。所有其他进程将是进程1的子进程,并将在进程1退出后终止。请参阅 杀人手册了解您可以发送的其他信号。

coredns分离舱出现问题,我删除了这个分离舱

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

它的分离舱会自动重启。

以上所有的答案都提到了删除 Pod... ... 但是如果你有很多同样服务的 Pod,那么删除它们中的每一个都会很乏味... ..。

因此,我提出以下解决方案,重新开始:

  • 1)设定比例为零:

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

    以上命令将终止名为 <<name>>的所有吊舱

  • 2)要重新启动豆荚,请将复制品设置为大于0

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

    上面的命令将使用2个副本重新启动您的 pods。

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

假设容器以 root 身份运行,不建议这样做。

在我的例子中,当我更改应用程序配置时,我必须重新启动在一个侧卡模式中使用的容器,我将杀死由 docker 用户拥有的 Spring 启动应用程序的 PID。

我一直在想重启一个容器的方法,我找到了这样一个解决方案:

文件夹:

...
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

/应用程式/ 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

我在吸毒

kubectl rollout restart deployment [deployment_name]

或者

kubectl delete pod [pod_name]


我意识到这个问题已经很老了,而且已经有答案了,但是我想我应该用我的方法来帮忙。

每当我想这样做的时候,我只需要对 pod 的容器的 image 字段做一个小小的更改,这会导致 kubernetes 重新启动容器。

如果你不能在两个不同但相等的标签之间切换(比如 :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 用例; 在这种情况下,您可以想到一个 豆荚作为一个单一容器的包装; 库伯内特斯管理豆荚 而不是直接管理容器。

注意: 在一个 Single Pod 是一个相对高级的用例 模式仅在容器所在的特定实例中使用 紧密结合。

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

有时没有人知道哪个操作系统的吊舱,吊舱可能没有 sudoreboot完全。

更安全的选择是拍一张快照,然后重建吊舱。

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