线上k8s集群故障记录及排查思路分享
2024-01-28 03:30:03
一场Kubernetes集群故障自救史
背景
Kubernetes是一个强大的容器编排系统,为容器化的应用提供了高可用性、可伸缩性和可管理性。但在实际的生产环境中,Kubernetes集群也会遇到各种各样的故障,影响应用的正常运行。因此,掌握Kubernetes集群故障排查的思路和技巧是非常重要的。
故障现象
最近,我们的线上k8s集群出现了一个奇怪的故障现象:k8s dashboard无法访问,应用node、pod运行状态均正常,但是无法通过ingress配置的子域名访问应用。
排查过程
1. 查看k8s集群状态
首先,我们通过kubectl命令查看了k8s集群的状态,发现集群中的所有节点都是正常状态,也没有任何明显的错误信息。
kubectl get nodes
2. 检查ingress配置
接下来,我们检查了ingress配置,发现配置没有问题,ingress controller也是正常运行的。
kubectl get ingress
3. 检查防火墙规则
我们还检查了防火墙规则,发现也没有问题,ingress controller的端口也没有被防火墙阻断。
sudo iptables -L
4. 查看应用日志
我们查看了应用的日志,发现也没有任何明显的错误信息。
kubectl logs <pod-name>
5. 重新部署应用
我们尝试重新部署应用,但问题仍然存在。
kubectl rollout restart deployment <deployment-name>
6. 查看k8s事件
我们查看了k8s事件,发现了一个与ingress相关的事件:
kubectl get events --field-selector involvedObject.kind=Ingress
该事件表明,ingress controller遇到了一个错误:
Error syncing ingress "ingress-name"
7. 查看ingress controller日志
我们查看了ingress controller的日志,发现了一个更详细的错误信息:
[error] error syncing ingress "ingress-name": config for ingress "ingress-name" was rejected: spec.backend.serviceName is invalid: backend "default-http-backend" not found
该错误信息表明,ingress controller找不到名为"default-http-backend"的服务。
8. 检查服务
我们检查了服务,发现名为"default-http-backend"的服务确实不存在。
kubectl get service
9. 创建服务
我们创建了名为"default-http-backend"的服务,并重新部署应用。
kubectl create service clusterip default-http-backend --tcp=80:80
kubectl rollout restart deployment <deployment-name>
10. 故障解决
经过以上一系列的排查,我们终于找到了故障的原因,并解决了问题。
总结
通过这次故障排查,我们总结了以下经验:
- 在排查Kubernetes集群故障时,首先要查看集群的状态、ingress配置、防火墙规则和应用日志。
- 如果以上检查都没有发现问题,可以查看k8s事件和ingress controller日志,以获取更详细的错误信息。
- 在解决Kubernetes集群故障时,需要耐心和细心,一步一步地排查,才能找到问题的根源。
希望这篇文章能够帮助读者快速掌握Kubernetes集群故障排查的思路和技巧,以便在遇到类似故障时能够快速定位问题,并找到解决方案。