title: 服务可用性定位问题常用命令
author: Gamehu
tags:
- LMT
categories:
- 工作
date: 2024-06-15 20:07:00
---
离职系列
第五篇
离职系列,想想这几年在公司的成长,在这做个记录。上一篇{% post_link 现场故障定位 %},主要讲的方法论,这篇主要对服务可用性的几个场景总结下相应的命令。
以下命令主要针对现场经常出现的安装失败、升级失败、补丁失败、服务不断重启、服务不可用几个场景:
1. 安装失败,通常就是现场环境问题,比如服务器的磁盘性能不达标、网络通信问题、服务器DNS配置错误、集群IP段不可用
2. 升级失败,通常和服务器的资源紧张有关(内存、磁盘、CPU等)
3. 服务不断重启,通常是基础组件问题如redis异常、应用pod自身程序的bug如OOM、k8s组件问题如etcd重启
4. 服务不可用,通常就是集群出了问题,比如磁盘满了导致镜像丢失
#### 命令
1. 确认环境信息
- 环境信息
```
# 操作系统版本
cat /etc/redhat-release # CentOS版本
cat /etc/openEuler-release # 欧拉版本
uname -r # 内核版本
cat /proc/version # 内核编译信息
hostnamectl # 查看完整的系统信息
# 系统基础信息
df -h # 磁盘空间
free -h # 内存使用
top # CPU和进程状态
netstat -ant # 网络连接
uptime # 系统负载
iostat -x 1 10 # 磁盘状态
# 进程分析
ps -ef | grep 进程名
pstree -p 进程ID
lsof -p 进程ID
# 分区及挂载
lsblk # 查看块设备
df -Th # 查看文件系统类型和空间
mount | grep -E "^/dev" # 查看挂载参数
# 磁盘空间
du -sh /* | sort -hr # 大文件目录排序
# 时间同步状态
chronyc sources -v
```
- K8s集群状态
```
# K8s集群状态
systemctl status kubelet # kubelet是否正常
systemctl status docker # docker是否正常
systemctl status NetworkManager # 网络连接工具是否正常
kubectl cluster-info #查看集群信息
kubectl get nodes # kubelet集群节点
kubectl get po -A # 查看所以pod状态
kubectl get po -A -owide # 查看所以pod的ip和所在的node
kubectl describe node
kubectl get events -n #Kubernetes 事件日志
journalctl -u kubelet -f # 日志查看
cat /var/log/messages | grep xx # 日志查看
# 应用Pod状态
kubectl get pods -n -o wide
ping pod_ip # 判断容器之间的联通性
kubectl describe -n
kubectl exec -it -n /bin/sh # 进入容器内部
kubectl logs -n
# 集群资源状态
kubectl top nodes
kubectl top pods -n
```
- 客户网络环境限制(可用端口、防火墙策略)
```
# 网络组件
ip link show
iptables -L
# DNS配置
cat /etc/resolv.conf
# 网络分析
curl url # 应用连通性
fping -c xx -p xx 目标IP或域名 # 基础连通性
ping <目标IP> # 基础连通性
telnet <端口> # 端口连通性
traceroute # 路由跟踪
tcpdump -i any port <端口> -w dump.pcap # 抓包分析
```
### 参考
https://jimmysong.io/kubernetes-hndbaook/guide/using-kubectl.html
https://kubernetes.io/zh-cn/docs/tasks/debug/_print/
https://cheat.sh/
https://kubernetes.io/docs/reference/kubectl/cheatsheet/
https://kubernetes.io/zh/docs/reference/kubectl/
https://docs.docker.com/engine/reference/run/