k8s中故障排查可以分为节点的故障排查和kubernetes组件故障排查两大类。例如:基础架构守护进程问题,如NTP服务关闭,硬件问题:cpu、内存或者磁盘损坏,内核问题:内核死锁,文件系统损坏,容器运行时问题,例如运行的守护进程无响应。当kubernetes节点发生这些问题时,k8s服务组件并不能感知以上问题,会导致Pod仍然会调度到问题节点。为了解决该问题,社区引入了守护进程node-problem-detector,守护进程收集节点问题,并上报到api-server。例如可以诊断Runtime无响应,Linux Kernel无响应,网络异常,文件描述符异常,硬件问题如cpu,内存,磁盘等故障。
node-problem-detector通过设置NodeCondition或者创建Event对象来汇报问题,汇报问题有两种方式。
方式一:NodeCondition:针对永久性故障,会通过设置NodeCondition来改变节点状态。
方式二:临时故障通过Event来提醒相关对象,比如通知当前节点运行的所有Pod。
需要注意的是NPD只负责获取异常事件,并修改node condition,不会对节点状态和调度产生影响,所以需要自定义控制器,监听NPD汇报的condition,如果发现上报了节点出错的信息后,那么可以给node打上taint,这样就可以阻止Pod调度到故障节点,当问题修复后,重启NPD Pod来清理错误事件。node-problem-detector详细信息可查看官网信息。
可以通过helm的方式安装node-problem-detector,安装完成后可以通过kubectl get pod方式查看安装后的node-problem-detector,另外,安装node-problem-detector后,除了启动pod后,还会启动对应的daemonset。该集群上加上master节点,总共有3个节点,其中有个节点是NotReady状态,故helm安装后,启动了3个node-problem-detector。
除了通过安装node-problem-detector方式排查节点故障,还可以安装支持ssh的pod,并通过负载均衡的方式转发ssh请求,这样就可以连接到node节点里面,查看node节点情况。
除了通过安装node-problem-detector检查节点健康信息外,还可以journalctl查看k8s核心组件日志信息。例如查看kubelet日志信息。
journalctl -afu kubelet -S “2019-01-01 10:00:00”
-u unit,对应systemd拉起的组件,例如kubelet
-f follow 跟踪最新的日志
-a show all 显示所有的日志列
-S since,查看某一时间开始的日志
除了journalctl,还可以安装crictl查看pod,容器,image等信息。
例如:如果要查看pod的网络信息,内存等信息,那么可通过如下步骤查看
crictl pods | grep podName,获取到运行的pod的podID
crictl ps | grep podId,获取pod中运行的容器id
crictl inspect container-id| grep pid:获取容器的进程ID,有了进程Id那么可以查看很多信息,例如查看网络信息和内存信息
nsenter -t 进程id(process id) -n ip a: 查看网络配置信息
nsenter -t 进程id(process id) -n pi r: 查看路由信息
nsenter -t pid -n arping 路由地址: 查看信息转发到了哪里
ls /proc/进程id(process id):查看内存等信息
以下是演示获取pod的process id的过程。
有了pod的process id后可以看到很多信息,如下所示
除了上面的命令,crictl其他常用的命令如下所示:
crictl images: 查看下载的image信息
crictl ps:查看所有运行的pod的容器Id信息
crictl logs container-id:查看运行的容器的日志信息
上面介绍了通过crictl查看运行的pod的信息,实际查看pod的日志信息还可以通过kubectl实现。
kubectl logs podName: 查看pod运行的信息
kubectl logs -f -c containername podname: 查看pod中某个容器的运行信息
kubectl logs -f --all-containers podname: 查看pod中所有容器的运行信息
kubectl logs -f -c containername --previous: 如果pod重启过,要查看重启前的日志信息
kubectl exec -it podname --tail -f /path/log: 如果pod运行的日志信息被保存到某个目录下,那么可以通过exec进入pod,--tail命令查看日志信息
kubectl exec -it podname -- ls: exec进入运行的pod,在pod中执行linux命令
kubectl exec -it podname -- bash: exec进入pod,然后可以输入bash的命令,备注:需要启动的容器支持bash命令才行。
上面介绍了部分错误排查的方法,更多错误排查的方法,例如调试service,调试statefulset,调试init容器等,可以查看官网详细信息。
转载:https://blog.csdn.net/qiaotl/article/details/125724608