图解Kubernetes故障排查指南

针对越来多的Kubernetes容器云,对Kubernetes集群的故障排查却成了一个棘手问题 。本文虫虫给大家以直观图示方式介绍如何排查Kubernetes的故障 。该篇是系列文章续——故障排查篇 。关于图解部署配置请参考上一篇文章:图解Kubernetes应用部署

图解Kubernetes故障排查指南

文章插图
 
概述上一篇,我们介绍了Kubernetes三个关键组件入口、服务和Pods之间如何连接,以及相关配置关键点 。知道如何正确配置YAML只是开始,最重要最实用的是要知道出问题了如何排查 。
在深入研究排查部署之前,我们必须先给出排查Kubernetes故障的思维模型 。由于每个部署中都存在三个组件,因此需要从底部开始依次调试所有组件 。
关键点排查Kubernetes部署故障的3个步骤:
应确保Pods正常运行;
确保于服务可以将流量调度到Pod;
检查是否正确配置了入口 。
直观图示首先,检查Pod已经创建,并且正常 。
图解Kubernetes故障排查指南

文章插图
 
其次,如果Pod正常,则应检查服务是否可以将流量分配给Pod 。
图解Kubernetes故障排查指南

文章插图
 
最后,检查服务与入口之间的连接 。
图解Kubernetes故障排查指南

文章插图
 
Pod故障排查在大多数情况下,问题出在Pod本身 。应该确保Pod正在运行并准备就绪(READY为1) 。
检查方法:
 
kubectl get pods
图解Kubernetes故障排查指南

文章插图
 
如上述会话,最后一个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处于待处理状态
【图解Kubernetes故障排查指南】当创建Pod时,该Pod保持在待处理状态 。主要可能原因:
群集没有足够的资源(例如CPU和内存)来运行Pod;
当前的命名空间具有ResourceQuota对象,创建Pod将使命名空间超过配额;
Pod绑定到一个待处理的PersistentVolumeClaim;
解决方法:
检查kubectl describe命令的事件部分:
kubectl describe pod <pod name>
对于因ResourceQuotas而导致的错误,可以使用以下方法检查群集的日志:
kubectl get events --sort-by=.metadata.creationTimestamp


推荐阅读