我正在测试日志先前命令,为此我需要一个pod来重新启动。
我可以使用像
这样的命令来获取我的podkubectl get pods -n $ns -l $label
,这表明我的豆荚没有重新启动为止。我想测试这个命令:
kubectl logs $podname -n $ns --previous=true
这个命令失败,因为我的pod没有重新启动,使得--previous=true
开关没有意义。
我知道这个命令在配置改变时重新启动pod:
kubectl rollout restart deployment myapp -n $ns
这并不启动容器的方式是有意义的对我的日志的命令测试而是终止旧的豆荚和创建新的豆荚(已重新开始计数为0)。
我尝试了各种版本的exec,看看是否可以从内部关闭它们,但我使用的大多数命令都没有在该容器中找到:
kubectl exec $podname -n $ns -- shutdown
kubectl exec $podname -n $ns -- shutdown now
kubectl exec $podname -n $ns -- halt
kubectl exec $podname -n $ns -- poweroff
我如何使用kubectl
命令强制重启pod,使其保留其身份,并且重启计数器增加1,以便我的测试日志命令有一个先前的实例来返回日志。
编辑:连接到pod有很好的描述。
kubectl -n $ns exec --stdin --tty $podname -- /bin/bash
进程列表只显示少数正在运行的进程:
ls -1 /proc | grep -Eo "^[0-9]{1,5}$"
进程1似乎是运行pod的进程。kill 1
什么也不做,甚至杀死proc pid 1
我还考虑这个。
有不同的方法来实现你的目标。我将在下面描述最有用的选项。
Crictl
最正确和有效的方法-在容器运行时级别重新启动pod。
我在Google Cloud Platform - GKE和minikube上使用docker
驱动程序进行了测试。
您需要将ssh
放入运行pod的工作节点。然后找到POD ID
:
$ crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
9863a993e0396 87a94228f133e 3 minutes ago Running nginx-3 2 6d17dad8111bc
或
$ crictl pods -s ready
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
6d17dad8111bc About an hour ago Ready nginx-3 default 2 (default)
然后停止:
$ crictl stopp 6d17dad8111bc
Stopped sandbox 6d17dad8111bc
一段时间后,kubelet
将再次启动这个pod(在CRI中使用不同的pod ID,但kubernetes集群将此pod视为相同):
$ crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
f5f0442841899 87a94228f133e 41 minutes ago Running nginx-3 3 b628e1499da41
在集群中是这样的:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-3 1/1 Running 3 48m
获取带有--previous=true
标志的日志也确认了kubernetes的POD是相同的。
杀死进程1
它适用于大多数图像,但并非总是如此。
。我测试了一个简单的pod与nginx
图像:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 27h
$ kubectl exec -it nginx -- /bin/bash
root@nginx:/# kill 1
root@nginx:/# command terminated with exit code 137
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 1 27h
有用的链接:
- 使用crictl 调试Kubernetes节点