欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓
在生产环境中,Linux 和 Kubernetes 系统往往会面临各种复杂的故障,快速准确的故障排查能力是系统管理员和 DevOps 工程师不可或缺的技能。本文将为大家介绍 Linux 和 Kubernetes 的 20 大常见故障排查方法,帮助你在面对问题时快速定位并解决。
1. Linux 故障排查命令及输出
1.1 系统负载过高
命令:top
输出:
top - 15:45:21 up 10 days, 4:35, 1 user, load average: 5.73, 4.65, 3.84
Tasks: 195 total, 1 running, 194 sleeping, 0 stopped, 0 zombie
%Cpu(s): 28.2 us, 3.3 sy, 0.0 ni, 68.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 8192.0 total, 2050.4 free, 6123.8 used, 1018.0 buff/cache
MiB Swap: 2048.0 total, 1500.0 free, 548.0 used. 2075.2 avail Mem
排错思路:
- 高负载通常表示有进程消耗过多的 CPU 或内存。
- 通过 `top` 命令可以看到哪些进程消耗资源,检查是否有异常进程。
- 如果是某些进程出现异常,可以尝试使用 `kill` 命令终止这些进程。
- 检查是否存在内存泄漏或 CPU 负载过高的原因。
1.2 磁盘空间不足
命令:df -h
输出:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 45G 3.0G 94% /
tmpfs 16G 1.1G 15G 7% /dev/shm
/dev/sdb1 20G 18G 1.2G 94% /mnt/data
命令:du -sh /var/log/*
输出:
1.3G /var/log/syslog
500M /var/log/auth.log
200M /var/log/kern.log
排错思路:
- 磁盘空间不足会导致服务无法正常运行,可以通过 `df -h` 检查磁盘使用情况。
- 检查哪些文件或日志文件占用了大量磁盘空间,使用 `du -sh` 命令。
- 删除不需要的文件或扩展磁盘空间。
1.3 网络连接问题
命令:ping 8.8.8.8
输出:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=13.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=13.3 ms
...
命令:traceroute 8.8.8.8
输出:
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 0.435 ms 0.425 ms 0.400 ms
2 * * *
3 10.3.1.1 (10.3.1.1) 5.089 ms 5.065 ms 5.063 ms
4 8.8.8.8 (8.8.8.8) 12.539 ms 12.533 ms 12.510 ms
排错思路:
- 如果无法 ping 通外部地址,可以先检查本地网络配置。
- 使用 `traceroute` 查看从本机到目标地址的路由情况,排查网络中间是否有问题。
- 如果发现中间路由或防火墙的问题,可以联系网络管理员进行处理。
2. Kubernetes 故障排查命令及输出
2.1 Pod 无法启动
命令:kubectl describe pod <pod-name>
输出:
Name: my-pod
Namespace: default
Priority: 0
Node: node-1/192.168.1.100
Start Time: Mon, 27 Nov 2024 10:35:00 -0500
Labels: app=my-app
version=1.0
Containers:
my-container:
Container ID: docker://d4f2e3a6b8db
Image: my-app:v1.0
Ports: 8080/TCP
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Error
...
命令:kubectl logs <pod-name>
输出:
Error: java.lang.ExceptionInInitializerError: Unable to initialize the application.
排错思路:
- Pod 无法启动可能是因为容器崩溃,查看容器的状态和日志。
- `CrashLoopBackOff` 状态表示容器反复启动失败,可以通过 `kubectl logs` 查看日志,找出具体错误信息。
- 根据错误信息修复应用配置、环境变量或依赖关系。
2.2 Kubernetes 集群节点不正常
命令:kubectl get nodes
输出:
NAME STATUS ROLES AGE VERSION
node-1 NotReady <none> 10d v1.23.4
node-2 Ready <none> 12d v1.23.4
命令:kubectl describe node node-1
输出:
Name: node-1
Roles: <none>
Labels: kubernetes.io/hostname=node-1
Annotations: node.kubernetes.io/instance-type=m5.large
kubernetes.io/arch=amd64
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ------------------ ------------------ ------ -------
Ready False Mon, 27 Nov 2024 11:15:00 -0500 Mon, 27 Nov 2024 11:15:00 -0500 KubeletNotReady Kubelet stopped posting node status.
OutOfDisk True Mon, 27 Nov 2024 11:10:00 -0500 Mon, 27 Nov 2024 11:05:00 -0500 NodeHasNoDiskPressure Node has no disk pressure
...
命令:journalctl -u kubelet
输出:
Nov 27 11:10:00 node-1 kubelet[1375]: E1127 11:10:00.000000 1375 kubelet.go:2295] node "node-1" has disk pressure, evicting pods
...
排错思路:
- 节点处于 `NotReady` 状态时,可能是由于资源(如磁盘、内存等)不足。
- 使用 `kubectl describe node` 查看节点的状态和条件,检查是否存在资源压力(如磁盘满了)。
- 通过 `journalctl -u kubelet` 查看 kubelet 日志,进一步排查问题。
2.3 服务不可访问
命令:kubectl get svc
输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service ClusterIP 10.96.0.1 <none> 80/TCP 12d
命令:kubectl describe svc my-service
输出:
Name: my-service
Namespace: default
Labels: app=my-app
Selector: app=my-app
Type: ClusterIP
IP: 10.96.0.1
Port: 80/TCP
Endpoints: 10.1.1.2:80,10.1.1.3:80
排错思路:
- 如果服务不可访问,首先检查服务的类型和端口。
- 使用 `kubectl describe svc` 查看服务的配置,确认服务是否暴露正确的端口。
- 确认服务端点是否有效,且 Pod 是否正常运行。
3. 数据库故障排查命令及输出
3.1 数据库连接失败
命令:mysql -u root -p
输出:
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
排错思路:
- 数据库连接失败可能是因为密码错误或者权限问题。
- 检查数据库用户的权限,确保正确配置了访问控制。
- 检查数据库是否正在运行,确保没有防火墙或网络问题阻止连接。
3.2 数据库表损坏
命令:mysqlcheck -u root -p --auto-repair --check --optimize
输出:
+------------+-------+---------+----------+---------+
| Table | Op | Msg_type| Msg_text | Errors |
+------------+-------+---------+----------+---------+
| mydb.table | check | Warning | Found row with wrong checksum |
...
排错思路:
- 使用 `mysqlcheck` 工具检查表的完整性并修复损坏。
- 定期备份数据以避免数据丢失问题。
3.3 数据库性能问题
命令:SHOW PROCESSLIST;
输出:
Id User Host db Command Time State Info
1234 app localhost mydb Query 10 Sending data SELECT * FROM large_table WHERE ...
1235 app localhost mydb Query 20 Sorting SELECT * FROM another_table ORDER BY ...
排错思路:
- 查看当前运行的查询,找出耗时过长的操作。
- 使用 `EXPLAIN` 命令分析慢查询并优化。
- 检查数据库的资源利用情况(CPU、内存、磁盘 I/O)。
3.4 数据库高负载
命令:SHOW GLOBAL STATUS LIKE 'Threads_running';
输出:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Threads_running | 250 |
+-----------------+-------+
命令:SHOW ENGINE INNODB STATUS\\G
输出:
------------------------
LATEST DETECTED DEADLOCK
------------------------
*** (1) TRANSACTION:
TRANSACTION 12345, ACTIVE 10 sec fetching rows
...
排错思路:
- 检查并优化并发线程数,避免锁争用。
- 如果存在死锁问题,调整事务隔离级别或重构查询逻辑。
- 定期分析和优化表结构及索引。
4. 应用程序故障排查命令及输出
4.1 应用崩溃
命令:journalctl -u myapp.service
输出:
Nov 27 12:00:00 myserver myapp[1234]: Error: OutOfMemoryError: Java heap space
Nov 27 12:01:00 myserver myapp[1234]: Service stopped unexpectedly.
排错思路:
- 检查应用的内存使用情况,确认是否分配了足够的内存。
- 调整 JVM 参数,例如 `-Xmx` 和 `-Xms`,以增加可用内存。
- 检查是否存在内存泄漏问题,使用工具如 VisualVM 或 MAT 进行分析。
4.2 应用启动缓慢
命令:strace -p <PID>
输出:
...
open("/var/lib/myapp/config.yaml", O_RDONLY) = -1 ENOENT (No such file or directory)
...
排错思路:
- 检查启动日志中是否存在文件缺失或权限问题。
- 确认配置文件路径是否正确,以及是否可读。
- 优化启动脚本,减少不必要的依赖加载。
4.3 应用性能问题
命令:top
输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 myuser 20 0 1.2g 500m 30m R 95.0 6.3 10:45.43 java
...
排错思路:
- 检查应用 CPU 和内存消耗是否异常。
- 使用性能分析工具(如 JProfiler 或 New Relic)识别热点代码。
- 检查外部依赖(如数据库和缓存)是否成为瓶颈。
4.4 日志堆积过多
命令:du -sh /var/log/myapp.log
输出:
20G /var/log/myapp.log
排错思路:
- 检查日志配置,确认是否启用了日志轮转机制(如 logrotate)。
- 设置合理的日志级别(如 INFO 或 ERROR),减少不必要的日志输出。
- 定期清理旧日志,释放磁盘空间。
近期热文:
云计算架构师韩先超亲身经历 | 记录从大学到现在工作经历
推荐书籍:《Kubernetes从入门到DevOps企业应用实战》——韩老师以企业实战为背景出版的一本高质量书籍
K8s Scheduler Pod 启动失败:Error: failed to reserve container name
欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以啃到技术群,点击即可加入学习交流群。↓↓↓
创作不易,关注,赞,在看,三连支持一波,感谢。↓