针对越来多的Kubernetes容器云,对Kubernetes集群的故障排查却成了一个棘手问题。本文虫虫给大家以直观图示方式介绍如何排查Kubernetes的故障。该篇是系列文章续——故障排查篇。

概述

上一篇,我们介绍了Kubernetes三个关键组件入口、服务和Pods之间如何连接,以及相关配置关键点。知道如何正确配置YAML只是开始,最重要最实用的是要知道出问题了如何排查。

在深入研究排查部署之前,我们必须先给出排查Kubernetes故障的思维模型。由于每个部署中都存在三个组件,因此需要从底部开始依次调试所有组件。

关键点

排查Kubernetes部署故障的3个步骤:

应确保Pods正常运行;

确保于服务可以将流量调度到Pod;

检查是否正确配置了入口。

直观图示

首先,检查Pod已经创建,并且正常。

其次,如果Pod正常,则应检查服务是否可以将流量分配给Pod。

最后,检查服务与入口之间的连接。

Pod故障排查

在大多数情况下,问题出在Pod本身。应该确保Pod正在运行并准备就绪(READY为1)。

检查方法:

kubectl get pods

如上述会话,最后一个Pod处于"Running"和"就绪"状态,前两个Pod都没有处于Running状,状态也未"就绪"。

关键点

可以用下面几个命令用来排查Pod故障:

kubectl logs <pod name> :用来查看Pod容器日志。

kubectl describe pod <pod name>:用于查看与Pod相关的事件列表。

kubectl get pod <pod name>:用于获取Pod的YAML定义。

kubectl exec -ti <pod name> bash:对进入Pod容器进行交互式终端。

常见Pod错误列表

Pod可能会出现各种启动和运行时错误。

启动错误:

ImagePullBackoff,ImageInspectError,ErrImagePull,ErrImageNeverPull,RegistryUnavailable,InvalidImageName

运行时错误:

CrashLoopBackOff,RunContainerError,KillContainerError,VerifyNonRootError,RunInitContainerError,CreatePodSandboxError,ConfigPodSandboxError,KillPodSandboxError,SetupNetworkError,TeardownNetworkError

关键错误代码及其修复方法

ImagePullBackOff

当Kubernetes无法检索Pod容器之一的图像时,将出现此错误。

主要三个原因:

镜像名称无效。例如,输错名字,或者镜像不存在。

为镜像指定了一个不存在的标签。

尝试检索的镜像属于一个私有注册表,但是Kubernetes没有设置权限访问。

解决方法:

前两种情况可以通过修改镜像名和标签来解决。

第三个问题,需要在注册表中添加凭据,并在Pod中引用。

官方文档中有一个有关如何实现此目标的示例。

CrashLoopBackOff

如果容器无法启动,则Kubernetes status会显示CrashLoopBackOff错误。

通常,Pod在以下情况下容器无法启动:

应用程序中出现错误,阻止其启动;

未正确配置容器;

Liveness探针失败太多次;

解决方法:

应该查看容器中日志,了解详细失败的原因。

kubectl logs <pod-name> --previous

RunContainerError

当容器无法启动时出现错误,直至在容器内的应用程序启动之前。

该问题通常是由于配置错误,例如:

挂载不存在的卷,例如ConfigMap或Secrets

将只读卷安装为可读写

解决方法:

对该错误应该使用kubectl describe pod <pod-name>来收集和分析错误。

Pod处于待处理状态

当创建Pod时,该Pod保持在待处理状态。主要可能原因:

群集没有足够的资源(例如CPU和内存)来运行Pod;

当前的命名空间具有ResourceQuota对象,创建Pod将使命名空间超过配额;

Pod绑定到一个待处理的PersistentVolumeClaim;

解决方法:

检查kubectl describe命令的事件部分:

kubectl describe pod <pod name>

对于因ResourceQuotas而导致的错误,可以使用以下方法检查群集的日志:

kubectl get events --sort-by=.metadata.creationTimestamp

Pod处于未就绪状态

如果Pod正在运行但未就绪,则表示"就绪"探针失败。

当就绪探针失败时,Pod未连接到服务,并且不会有流量转发到该实例。

解决方法

准备就绪探针失败是特定于应用程序的错误,因此应该检查kubectl描述中的"事件"部分以识别错误。

服务故障排查

如果的Pod正在运行且已就绪,但仍无法收到应用程序的响应,则应检查服务的配置是否正确。

关键点

服务的主要功能是根据流量的标签将流量路由到Pod。所以,先应该检查服务定位了多少个Pod,可以通过检查服务中的端点来查看:

kubectl describe service <service-name> | grep Endpoints

端点是一对<ip address:port>,并且在服务(至少)以Pod为目标时,应该至少有一个。

如果"端点"部分为空,则有两种原因:

没有运行带有正确标签的Pod,应检查是否在正确的命名空间。

服务的选择器标签中有错字;

如果可以看到端点列表,但仍然无法访问应用程序,则很大原因是服务中的targetPort配置有误。

可以通过使用kubectl port-forward连接到服务具体排查:

kubectl port-forward service/<service-name> 3000:80

入口故障排查

如果Pod运行正常,服务可以分配流量到Pod,则可能原因是入口配置有误:

根据入口可能使用不同控制器类型,需要按具体对应方法进行调试。

关键点

检查入口配置参数serviceName和servicePort配置是否正确。可以使用下面命令检查:

kubectl describe ingress <ingress-name>

如果"后端"列为空,则配置中肯定有一个错误。

如果可以在"后端"列中看到端口,但是仍然无法访问该应用程序,则可能是以下问题:

没有如何将入口发布到公网;没有如何将群集发布到公网;

可以通过直接连接到Ingress Pod来将基础结构问题与入口隔离开。

首先,查看入口控制器Pod列表:

kubectl get pods --all-namespaces

其次,使用kubectl describe命令查看端口:

kubectl describe pod nginx-ingress-controller-6fc5bcc

最后,连接到Pod:

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

这样,访问计算机上的端口3000时,请求都会转发到Pod上的端口80。现在应用可以用吗?

如果可行,则问题出在基础架构中。应该检查如何将流量调度到群集。

如果还不行,则问题出在入口控制器中。应该调试入口控制器。常见的入口控制包括Nginx,HAProxy,Traefik等,可以查看具体控制器相关文档进行问题排查。此处我们以Nginx为例:

排查Nginx控制器

Ingress-nginx项目是Kubectl官方插件。可以使用kubectl ingress-nginx执行以下操作:

查看日志,后端,证书等;

连接到入口;

检查当前配置。

对应的命令有:

kubectl ingress-nginx lint:用于检查nginx.conf

kubectl ingress-nginx backend:用于检查后端(类似于kubectl describe ingress <ingress-name>)

kubectl ingress-nginx logs:查看控制器日志。

总结

对一个诸如Kubernetes之类复杂架构的集群,进行故障排除是一项艰巨的任务。有句俗语"老虎吃天,无处下爪"。面对艰巨的任务,首要任务是找到故障排查的思路,对Kubernetes集群的故障排查应该遵循从下至上排查方法:先从Pod开始,然后是服务和入口,依次按顺序排查。

图解Kubernetes——故障排查指南的更多相关文章

  1. Docker - 故障排查指南

    这阵子开始捣鼓 Docker,遇到过不少问题,下面记录下问题以及解决方案 一.Docker 报 Failed to start Docker Application Container Engine ...

  2. 超长可视化指南!带你理清K8S部署的故障排查思路,让bug无处遁形

    本文将帮助你厘清在Kubernetes中调试 deployment的思路.下图是完整的故障排查思路,如果你想获得更清晰的图片,请在公众号后台(RancherLabs)回复"troublesh ...

  3. 052.Kubernetes集群管理-故障排错指南

    一 故障指南 1.1 常见问题排障 为了跟踪和发现在Kubernetes集群中运行的容器应用出现的问题,常用如下查错方法: 查看Kubernetes对象的当前运行时信息,特别是与对象关联的Event事 ...

  4. Linux系统运维故障排查

    一.思路 1.处理问题要求 2.一般思路 二.具体问题 1.网络问题 (1)网络不通 (2)网络很慢 2.硬件问题 3.操作系统问题 (1)系统无法正常启动 (2)系统运行慢或死机 4.服务或程序问题 ...

  5. 1个工具,助你提升K8S故障排查效率!

    Kubernetes的故障排查一直困扰众多运维团队或DevOps,除了Kubernetes本身的复杂性之外,还有Kubernetes的工作负载是动态的原因.本文将介绍1个工具可以帮助你可视化K8S的网 ...

  6. 一次“不负责任”的 K8s 网络故障排查经验分享

    作者 | 骆冰利 来源 | Erda 公众号 ​ 某天晚上,客户碰到了这样的问题:K8s 集群一直扩容失败,所有节点都无法正常加入集群.在经过多番折腾无解后,客户将问题反馈到我们这里,希望得到技术支持 ...

  7. 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)

    原贴如下 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查) 虽然我用的是PHPstudy部署的dedecms,还是一样栽倒这个坑里了. 总结经验:本地测试使用8000~9000的端口比较安全.

  8. Java线上应用故障排查之二:高内存占用

    搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java ...

  9. paip.hql的调试故障排查流程总结

    paip.hql的调试故障排查流程总结 环境.myeclipse7.0 1 Hql的调试工具myeclipxe默认工具.../Hibernate8IDE 1 故障的排除方法overview 1 Hql ...

随机推荐

  1. node+ajax实战案例(6)

    8.删除客户 8.1.发送id到后台 删除用户信息比较简单,只需要把对应行的id发送到后台就可以了 oTable.onclick = function (ev) { var ev = ev || ev ...

  2. 如何去除List集合中重复的元素

    1.通过循环进行删除 public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ...

  3. 使用Xmanager连接linux,操作“xhost +”时出现类似“xhost: unable to open display "192.168.1.1811:1.0" ”问题的解决

    远程连接linux服务器时,有的时候需要把服务器上的图形界面投影到本地来进一步操作,比如linux下安装oracle时就需要在oracle用户下允许视图状态投影到本地,这需要使用命令: xhost + ...

  4. NOIp (on line) 入门组 2020 总结

    得分情况 : 估分: 100+30+30=160: 实际: 95+70+25=190: T1 : 题意: 有n块钱,买三种文具,分别为 a:7元.b:4元.c:3元,问怎么买能让n元钱全部用完,而且使 ...

  5. sendRedirect()和forward()方法的区别

    sendRedirect()和forward()方法的区别 之前好像曾经整理过,但忘了放在哪里了,好像压根就没整理过,博客里也没有,故今天重新整理一下. 我们知道页面之间的跳转有两种方式:重定向与转发 ...

  6. 朋友HDU - 5963 (思维题) 三种方法

    传送门 题目描述 输入 输出 样例输入 Sample Input 样例输出 Boys win! Girls win! Girls win! Boys win! Girls win! Boys win! ...

  7. day61 django入门(2)

    目录 一.数据的查.改.删 1 查 2 改 3 删 二.django orm中如何创建表关系 三.django请求生命周期流程图 四.路由层 1 无名分组 2 有名分组 3 两种分组不能混用,单个可以 ...

  8. flask 源码专题(十一):LocalStack和Local对象实现栈的管理

    目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于localstack的实现 3. 总结 04 LocalS ...

  9. Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

    当大潮退去,才知道谁在裸泳..关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis. ...

  10. redis入门指南(四)—— redis如何节省空间

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 节省空间 1.redis对于它所支持的五种数据类型,每种都提供了两种及以上的编码方式去存储(具体 ...