Kubernetes:故障排查(Trouble Shooting)方法总结
本文部分内容源自网络,侵删。
概述
为了跟踪和发现在Kubernetes集群中运行的容器应用出现的问题,我们常用如下排查方法:
- 查看Kubernetes对象的当前运行时信息,特别是与对象关联的
Event
事件。这些事件记录了相关主题、发生时间、最近发生时间、发生次数及事件原因等,对排查故障非常有价值。此外,通过查看对象的运行时数据,我们还可以发现参数错误、关联错误、状态异常等明显问题。由于在Kubernetes中多种对象相互关联,因此这一步可能会涉及多个相关对象的排查问题。 - 对于服务、容器方面的问题,可能需要深入容器内部进行故障诊断,此时可以通过查看容器的运行日志来定位具体问题。
- 对于某些复杂问题,例如
Pod
调度这种全局性的问题,可能需要结合集群中每个节点上的Kubernetes服务日志来排查。比如搜集Master
上的kube-apiserver
、kube-schedule
、kube-controler-manager
服务日志,以及各个Node上的kubelet
、kube-proxy
服务日志,通过综合判断各种信息,就能找到问题的成因并解决问题。
查看系统Event
Kubernetes提供了以下命令来查看一个Pod的详细信息:
kubectl describe pod -n <namespace>
通过以上命令可以显示Pod
创建时的配置定义、状态等信息,还可以显示与该Pod
相关的最近的Event事件,事件信息对于查错非常有用。
从Event事件中获知Pod
失败的原因可能有以下几种:
- 没有可用的
Node
以供调度。 - 开启了资源配额管理,但在当前调度的目标节点上资源不足。
- 镜像下载失败,镜像下载失败通常为网络问题。
同理,通过kubectl describe
命令,还可以查看其他Kubernetes对象,包括Node
、RC
、Service
、Namespace
、Secrets
等,对每种对象都会显示相关的其他信息。
查看容器日志
在需要排查容器内部应用程序生成的日志时,我们可以使用以下命令:
kubectl logs <pod_name> -n <namespace>
如果在某个Pod中包含多个容器,就需要通过-c参数指定容器的名称来查看
kubectl logs <pod_name> -c <container_name> -n <namespace>
容器中应用程序生成的日志与容器的生命周期是一致的,所以在容器被销毁之后,容器内部的文件也会被丢弃,包括日志等。如果需要保留容器内应用程序生成的日志,则可以使用挂载的Volume
将容器内应用程序生成的日志保存到宿主机,还可以通过一些工具如Fluentd、Elasticsearch等对日志进行采集。
查看Kubernetes服务日志
如果在Linux系统上安装Kubernetes,并且使用systemd
系统管理Kubernetes服务,那么systemd
的journal
系统会接管服务程序的输出日志。在这种环境中,可以通过使用systemd status
或journalctl
工具来查看系统服务的日志。
例如查看kube-controller-manager
服务的日志:
systemctl status kube-controller-manager
使用journalctl
命令查看:
journalctl -u kube-controller-manager
如果不使用systemd
系统接管Kubernetes服务的标准输出,则也可以通过日志相关的启动参数来指定日志的存放目录。
--logtostderr=false
:不输出到stderr
。--log-dir=/var/log/kubernetes
:日志的存放目录。--alsologtostderr=false
:将其设置为true
时,表示将日志同时输出到文件和stderr
。--v=0
:glog的日志级别。--vmodule=gfs*=2,test*=4
:glog基于模块的详细日志级别。
在大多数情况下,我们从WARNING
和ERROR
级别的日志中就能找到问题的成因,但有时还需要排查INFO
级别的日志甚至DEBUG
级别的详细日志。此外,etcd
服务也属于Kubernetes集群的重要组成部分,所以不能忽略它的日志。
如果某个Kubernetes对象存在问题,则可以用这个对象的名字作为关键字搜索Kubernetes的日志来发现和解决问题。在大多数情况下,我们遇到的主要是与Pod对象相关的问题,比如无法创建Pod、Pod启动后就停止或者Pod副本无法增加,等等。此时,可以先确定Pod在哪个节点上,然后登录这个节点,从kubelet的日志中查询该Pod的完整日志,然后进行问题排查。对于与Pod扩容相关或者与RC相关的问题,则很可能在kube-controller-manager
及kube-scheduler
的日志中找出问题的关键点。
另外,kube-proxy
经常被我们忽视,因为即使它意外停止,Pod的状态也是正常的,但会导致某些服务访问异常。这些错误通常与每个节点上的kube-proxy
服务有着密切的关系。遇到这些问题时,首先要排查kube-proxy
服务的日志,同时排查防火墙服务,要特别留意在防火墙中是否有人为添加的可疑规则。
常见问题
由于无法下载pause镜像导致Pod一直处于Pending状态
现象:无法下载pause镜像导致Pod一直处于Pending
状态。
解决方法如下:
- 如果服务器可以访问Internet,并且不希望使用HTTPS的安全机制来访问
gcr.io
,则可以在Docker Daemon
的启动参数中加上--insecure-registry gcr.io
,来表示可以匿名下载。 - 如果Kubernetes集群在内网环境中无法访问
gcr.io
网站,则可以先通过一台能够访问gcr.io
的机器下载pause镜像,将pause镜像导出后,再导入内网的Docker私有镜像库,并在kubelet的启动参数中加上--pod_infra_container_image
。
除了pause镜像,其他Docker镜像也可能存在无法下载的情况,与上述情况类似,很可能也是网络配置使得镜像无法下载,解决方法同上。
Pod创建成功,但RESTARTS数量持续增加
现象:创建一个RC之后,Pod一会儿是Running
状态,一会儿是ExitCode:0
状态,在READY
列中始终无法变成1/1
,而且RESTARTS
(重启的数量)的数量不断增加。
原因:在Kubernetes中根据RC定义创建Pod,之后启动容器。在容器的启动命令执行完成时,认为该容器的运行已经结束,并且是成功结束(ExitCode=0
)的。根据Pod的默认重启策略定义(RestartPolicy=Always
),RC将启动这个容器。
解决:新的容器在执行启动命令后仍然会成功结束,之后RC会再次重启该容器,如此往复。其解决方法为将Docker镜像的启动命令设置为一个前台运行的命令。
通过服务名无法访问服务
在Kubernetes集群中应尽量使用服务名访问正在运行的微服务,但有时会访问失败。由于服务涉及服务名的DNS域名解析、kube-proxy组件的负载分发、后端Pod列表的状态等,所以可通过以下几方面排查问题。
1.查看Service的后端Endpoint是否正常
可以通过kubectl get endpoints <service_name>
命令查看某个服务的后端Endpoint列表,如果列表为空,则可能因为:
- Service的Label Selector与Pod的Label不匹配;
- 后端Pod一直没有达到Ready状态(通过kubectl get pods进一步查看Pod的状态);
- Service的targetPort端口号与Pod的containerPort不一致等。
2.查看Service的名称能否被正确解析为ClusterIP地址
可以通过在客户端容器中ping <service_name>.<namespace>.svc
进行检查,如果能够得到Service的ClusterIP地址,则说明DNS服务能够正确解析Service的名称;如果不能得到Service的ClusterIP地址,则可能是因为Kubernetes集群的DNS服务工作异常。
3.查看kube-proxy的转发规则是否正确
我们可以将kube-proxy
服务设置为IPVS或iptables负载分发模式。
对于IPVS负载分发模式,可以通过ipvsadm工具查看Node上的IPVS规则,查看是否正确设置Service ClusterIP的相关规则。
对于iptables负载分发模式,可以通过查看Node上的iptables规则,查看是否正确设置ServiceClusterIP的相关规则。
Kubernetes:故障排查(Trouble Shooting)方法总结的更多相关文章
- 图解Kubernetes——故障排查指南
针对越来多的Kubernetes容器云,对Kubernetes集群的故障排查却成了一个棘手问题.本文虫虫给大家以直观图示方式介绍如何排查Kubernetes的故障.该篇是系列文章续——故障排查篇. 概 ...
- 【集群实战】NFS服务常见故障排查和解决方法
NFS,全名叫Network File System,中文叫网络文件系统,是Linux.UNIX系统的分布式文件系统的一个组成部分,可实现在不同网络上共享远程文件系统. NFS由Sun公司开发,目前已 ...
- CentOS6系列系统启动常见故障排查与解决方法
情景一.内核文件损坏 /boot/vmlinuz-2.6.32-642.el6.x86_64 内核文件 1.故障现象 2.解决方法:挂载光盘,进入rescue(救援)模式 3.选择--English- ...
- 1个工具,助你提升K8S故障排查效率!
Kubernetes的故障排查一直困扰众多运维团队或DevOps,除了Kubernetes本身的复杂性之外,还有Kubernetes的工作负载是动态的原因.本文将介绍1个工具可以帮助你可视化K8S的网 ...
- Linux 常见的trouble shooting故障排错
Linux 常见的trouble shooting故障排错 备份开机所必须运行的程序对一个运维人员来说是非常有必要的.在实际生产环境中,系统和数据基本都是安装在不同的硬盘上面,因为企业最关心的还是数据 ...
- 使用strace工具故障排查的5种简单方法
使用strace工具故障排查的5种简单方法 本文源自5 simple ways to troubleshoot using strace strace 是一个非常简单的工具,用来跟踪可执行程序的系统调 ...
- 关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法
一.常见故障介绍 最近在开发相机项目(项目细节由于公司保密就不介绍了),程序运行5个来月以来首次出现msvcr100.dll故障等问题,于是乎开始了分析之路,按照度娘上的一顿操作,期间也是出现了各种不 ...
- 超长可视化指南!带你理清K8S部署的故障排查思路,让bug无处遁形
本文将帮助你厘清在Kubernetes中调试 deployment的思路.下图是完整的故障排查思路,如果你想获得更清晰的图片,请在公众号后台(RancherLabs)回复"troublesh ...
- 一次“不负责任”的 K8s 网络故障排查经验分享
作者 | 骆冰利 来源 | Erda 公众号 某天晚上,客户碰到了这样的问题:K8s 集群一直扩容失败,所有节点都无法正常加入集群.在经过多番折腾无解后,客户将问题反馈到我们这里,希望得到技术支持 ...
随机推荐
- Windows系统安装ActiveMQ
1.下载安装包:https://activemq.apache.org/components/classic/download/ 选择自己的版本进行下载 2.安装JDK 3.把下载的ActiveMQ压 ...
- Windows系统安装Redis服务
下载压缩包,登录 https://github.com/MicrosoftArchive/redis/releases 下载Redis-x64-3.0.504.zip 我也上传了一份 https: ...
- 【LeetCode】1466. 重新规划路线 Reorder Routes to Make All Paths Lead to the City Zero (Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://lee ...
- 【九度OJ】题目1171:C翻转 解题报告
[九度OJ]题目1171:C翻转 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1171 题目描述: 首先输入一个5 * 5的数组,然 ...
- 【LeetCode】19. Remove Nth Node From End of List 删除链表的倒数第 N 个结点
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:链表, 删除节点,双指针,题解,leetcode, 力扣 ...
- 「算法笔记」Min_25 筛
戳 这里(加了密码).虽然写的可能还算清楚,但还是不公开了吧 QwQ. 真的想看的 私信可能会考虑给密码 qwq.就放个板子: //LOJ 6053 简单的函数 f(p^c)=p xor c #inc ...
- 编写Java程序,应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能
查看本章节 查看作业目录 需求说明: 应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能 实现思路: 创建 Java 项目,在项目中创建服务端类 ChatServerThre ...
- 编写Java程序,以继承和多态思想模拟饲养员喂养不同动物的不同行为
返回本章节 返回作业目录 需求说明: 以继承和多态思想模拟饲养员喂养不同动物的不同行为 动物园有饲养员和动物,其中动物有老虎.马.猴子.羊.狼等. 饲养员对不同的动物有不同的喂养行为. 实现思路: 以 ...
- 编写Java程序,编写自定义异常类封装将棋子落在格子中已有棋子的异常
返回本章节 返回作业目录 需求说明: 完善控制台版五子棋,判断用户所下棋子的位置,是否已经存在棋子,如果已经存在,则抛出用户自定义异常,提示用户该位置已经有棋子. 实现思路: 创建用户自定义异常类Go ...
- FastStoneCapture屏幕截图软件
1.简介 FastStone Capture(FSCapture)是经典的屏幕截图软件, 可以捕捉全屏图像.活动窗口.任意指定截图形状, 而且还有图像编辑和屏幕录制功能, 还能支持屏幕放大镜和屏幕取色 ...