返回

线上k8s集群故障记录及排查思路分享

开发工具

一场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集群故障排查的思路和技巧,以便在遇到类似故障时能够快速定位问题,并找到解决方案。