图解Kubernetes故障排查指南( 二 )


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故障排查指南

文章插图




推荐阅读