k8s环境如何调试一启动就挂掉的pod

16792801:

1 问题描述

k8s中pod一开始运行,马上挂起死掉,每次手忙脚乱的敲好kubeclt log -n XXX ,还来不及看到,pod已经挂了,日志也没看到。

2 解决思路

2.1 pod运行先不执行原来的命令,执行sleep 3600 秒保持pod存活

2.2 找到pod之前运行的命令,进入pod内部直接输入运行命令,显式查看运行日志,找到报错原因。

3 实践

3.1 得到容器运行命令

新版的k8s环境使用containerd,不再使用docker,如何参看容器内的运行命令?docker是通过使用 docker inspect img_id 得到,在containerd环境下的操作思路是一样的,先找到关注的pod在哪个node运行,然后在该node得到image id,再使用crictl inpecti XXXX得到pod启动时候的运行命令

3.1.1 找到pod的运行pod

[root@node1 ingress_down]# kubectl get pod -n com-pre -owide|grep test
test-service-7cbddfccdc-zvtmw 2/2 Running 0 23h 10.244.33.139 node5

3.1.2 转到对应node,使用crictl images,得到pod使用的镜像id:

[root@node5 ~]# crictl images |grep test
harbor.myserver.com/data-sec/test 1.0.4 44c4651ee5970 327MB

3.1.3 使用 crictl inspecti image_id,得到打包镜像中的启动命令

[root@node5 ~]# crictl inspecti 44c4651ee5970


{
“created”: “2022-07-11T01:45:32.489102244Z”,
“created_by”: "/bin/sh -c #(nop) ENTRYPOINT [“java” “-Djava.security.egd=file:/dev/./urandom " “-jar” “/test.jar”]”,
“empty_layer”: true
}

通过上述操作,得到了test 镜像中的运行命令是:
java -Djava.security.egd=file:/dev/./urandom -jar test.jar

3.2 修改test.yaml文件


- name: test-service
image: harbor.myserver.com/data-sec/test:1.0.6
#command: [“/bin/sh”,“-c”,“touch /tmp/test; sleep 30; rm -f /tmp/test; sleep 3600”] #使用这句sleep,替代缺省的运行命令
imagePullPolicy: IfNotPresent
resources:
limits:

3.3 apply 新的yaml文件,进入容器,运行3.1.3得到的命令,观察运行日志排查错误

3.3.1 apply新的yaml文件

[root@node1 ingress_down]# kubectl apply -f test.yaml

3.3.2 进入pod

[root@node1 ingress_down]# kubectl exec -it -n my_ns test-service-7cbddfccdc-zvtmw -c test-service – /bin/bash

3.3.3 在pod内部输入命令行

然后在pod里直接运行上面得到的命令行:java -Djava.security.egd=file:/dev/./urandom -jar test.jar ,观察日志输出,进行调试
[root@kms-pm-service-7cbddfccdc-zvtmw /]# java -Djava.security.egd=file:/dev/./urandom -jar test.jar

3.3.4 从容调试,观察输出日志吧

这样就可以从容的观察日志,进行调试了,也不用担心报错后pod挂掉看不到输出日志。

4 总结

大部分报错直接用kubectl log 就可以看到报错日志,如果遇到一运行就报错,都看不到日志输出的情况,可以尝试使用上面的解决思路。希望这篇笔记能对大家有用。

猜你喜欢

转载自blog.csdn.net/aligeter/article/details/131201670