我有一个名为 test-1495806908-xn5jn
的Pod,其中包含2个容器。 我想重新启动其中一个名为 container-test
的容器。 是否可以重新启动Pod中的单个容器? 如果不行,那么如何重新启动Pod?
该Pod是使用deployment.yaml
创建的:
kubectl create -f deployment.yaml
我有一个名为 test-1495806908-xn5jn
的Pod,其中包含2个容器。 我想重新启动其中一个名为 container-test
的容器。 是否可以重新启动Pod中的单个容器? 如果不行,那么如何重新启动Pod?
该Pod是使用deployment.yaml
创建的:
kubectl create -f deployment.yaml
CMD
/ ENTRYPOINT
进程终止对我有用。(容器会自动重新启动)restartPolicy: Always
(对于大多数工作负载来说,默认设置即可)
- 使主容器进程停止而不删除Pod。这是有趣的部分。node
)。这意味着:
root
用户,您可以制造一些混乱,我想我不需要进行描述,对吧?但大多数情况下您不是。这是一件好事。kubectl exec
命令进入它
kubectl exec -it $POD -c $CONTAINER -- sh -c 'kill 1'
这将向进程1
发送一个TERM
信号,之后大多数行为良好的进程会相对优雅地退出。进程1
通常是容器的主进程(或者有时不是),在其退出后,容器将被销毁并由kubelet
接管重新启动。如果进程很顽固,您可以尝试kill -9 1
,这应该彻底杀死它,但效果可能因情况而异。kubectl debug -it --image=busybox $POD --target=$CONTAINER -- sh -c 'kill 1'
这将在Pod中创建一个新的"临时容器",该容器几乎与--target
容器处于相同的环境中。这使您能够查看目标进程并将其终止,使用的工具是提供的--image
中的工具。我使用了busybox
,因为它很小而且能够完成工作,但您当然可以使用任何更大的镜像,如ubuntu
。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
sudo
或者 reboot
命令。kubectl get <pod-name> -o yaml > pod-to-be-restarted.yaml;
kubectl delete po <pod-name>;
kubectl create -f pod-to-be-restarted.yaml
kubectl delete pods POD_NAME
这个命令将会自动删除该Pod并重新启动另一个。