服务可用性定位问题常用命令

离职系列 第五篇
离职系列,想想这几年在公司的成长,在这做个记录。上一篇现场故障定位指南,主要讲的方法论,这篇主要对服务可用性的几个场景总结下相应的命令。

以下命令主要针对现场经常出现的安装失败、升级失败、补丁失败、服务不断重启、服务不可用几个场景:

  1. 安装失败,通常就是现场环境问题,比如服务器的磁盘性能不达标、网络通信问题、服务器DNS配置错误、集群IP段不可用
  2. 升级失败,通常和服务器的资源紧张有关(内存、磁盘、CPU等)
  3. 服务不断重启,通常是基础组件问题如redis异常、应用pod自身程序的bug如OOM、k8s组件问题如etcd重启
  4. 服务不可用,通常就是集群出了问题,比如磁盘满了导致镜像丢失

命令

  1. 确认环境信息
    • 环境信息
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      # 操作系统版本
      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集群状态
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      # 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 <node-name>
      kubectl get events -n <namespace> #Kubernetes 事件日志
      journalctl -u kubelet -f # 日志查看
      cat /var/log/messages | grep xx # 日志查看

      # 应用Pod状态
      kubectl get pods -n <namespace> -o wide
      ping pod_ip # 判断容器之间的联通性
      kubectl describe <pod-name> -n <namespace>
      kubectl exec -it <pod-name> -n <namespace> /bin/sh # 进入容器内部
      kubectl logs <pod-name> -n <namespace>

      # 集群资源状态
      kubectl top nodes
      kubectl top pods -n <namespace>
  • 客户网络环境限制(可用端口、防火墙策略)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 网络组件
    ip link show
    iptables -L

    # DNS配置
    cat /etc/resolv.conf
    # 网络分析
    curl url # 应用连通性
    fping -c xx -p xx 目标IP或域名 # 基础连通性
    ping <目标IP> # 基础连通性
    telnet <IP> <端口> # 端口连通性
    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/