提升运维效率:Linux和Kubernetes常见故障的20种解决方案

欢迎关注我的公众号「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),减少不必要的日志输出。

- 定期清理旧日志,释放磁盘空间。

近期热文:

欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以啃到技术群,点击即可加入学习交流群。↓↓↓

      创作不易,关注,,在看,三连支持一波,感谢。↓

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩先超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值