您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

图解Kubernetes故障排查指南

时间:2020-12-22 09:54:31  来源:  作者:

针对越来多的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处于待处理状态

当创建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

图解Kubernetes故障排查指南

 

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

kubectl describe pod Nginx-ingress-controller-6fc5bcc

图解Kubernetes故障排查指南

 

最后,连接到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故障排查指南


Tags:Kubernetes   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  Tags: Kubernetes  点击:(21)  评论:(0)  加入收藏
当我们通过kubectl来查看、修改Kubernetes资源时,有没有想过后面的接口到底是怎样的?有没有办法探查这些交互数据呢?Kuberenetes客户端和服务端交互的接口,是基于http协议的。所...【详细内容】
2021-11-23  Tags: Kubernetes  点击:(29)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: Kubernetes  点击:(60)  评论:(0)  加入收藏
虚拟节点(Virtual Node)实现了Kubernetes与弹性容器实例ECI的无缝连接,让Kubernetes集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。您可以灵活动态的按需创建ECI...【详细内容】
2021-04-15  Tags: Kubernetes  点击:(231)  评论:(0)  加入收藏
针对越来多的Kubernetes容器云,对Kubernetes集群的故障排查却成了一个棘手问题。本文虫虫给大家以直观图示方式介绍如何排查Kubernetes的故障。该篇是系列文章续&mdash;&mdas...【详细内容】
2020-12-22  Tags: Kubernetes  点击:(129)  评论:(0)  加入收藏
在过去几年,Kubernetes 在容器编排市场独占鳌头。自 2016 年以来,Docker Swarm 就退出了主要竞争者的行列,并且像 AWS 一样承诺对 K8s 进行支持和集成,换句话说,它承认了失败。目...【详细内容】
2020-11-30  Tags: Kubernetes  点击:(126)  评论:(0)  加入收藏
写在前面要出发周边游(以下简称要出发)是国内知名的主打「周边游」的在线旅行网站,为了降低公司内部各个业务模块的耦合度,提高开发、交付及运维效率,我们在 2017 年就基于 Sprin...【详细内容】
2020-11-27  Tags: Kubernetes  点击:(156)  评论:(0)  加入收藏
kubernetes的集群搭建有多种方式:二进制、kubeadm、ansible自动化、minikube。minikube方式比较简单,但是只是单节点,适合学习kubernetes基础的时候使用。其他的方式安装都会...【详细内容】
2020-11-10  Tags: Kubernetes  点击:(117)  评论:(0)  加入收藏
背景: 前端Pod 需要 访问 后端Pod ,可以采用service 的DNS 解析 ,为Kubernetes集群里的容器提供DNS服务,用于解析service名称一、部署CoreDNS Pod CoreDNS 是用于service做dns...【详细内容】
2020-11-03  Tags: Kubernetes  点击:(70)  评论:(0)  加入收藏
如果我们想要构建和运行一个现代的云基础设施,那么理解Docker和Kubernetes是必不可少的。本文主要给大家介绍Docker和Kubernetes技术以及它们之间的区别和联系。一、Docker1....【详细内容】
2020-10-19  Tags: Kubernetes  点击:(81)  评论:(0)  加入收藏
▌简易百科推荐
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(10)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(10)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(47)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(33)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(61)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(167)  评论:(0)  加入收藏
环境要求 ubuntu系统:20.04 docker版本:20.10.7 redis版本:6.0.6步骤由于我这里已经有相应的redis镜像,这里就不记录了,关于docker一些基础知识可以看我以前的笔记开启3台re...【详细内容】
2021-07-26  石老师小跟班    Tags:Redis主从复制   点击:(117)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条