故障诊断

更新时间: 2023-04-11 22:31:32

用户可定义诊断规则来快速帮助定位问题并给出诊断建议。当集群内资源符合某些特征时,给出预置的解决方案,从而快速帮助运维人员解决问题。诊断建议将会被展示在ADP-Local上,也可以通过获取CR的status查询到诊断规则匹配的对象。

功能概述

ADP底座提供的故障诊断引擎包含以下能力:

  • 对告警消息进行诊断并提供修复建议;

  • 对于组件整体提供诊断数据并分析根因;

  • 关联运维操作提供修复方案。

接入流程

ADP-Local的故障诊断引擎,允许客户根据业务场景配置诊断规则,然后根据诊断素材匹配诊断规则,并给出诊断建议,除了文档帮助,还可以关联运维操作进行问题修复。

image

匹配k8s资源属性或状态

通过判断特定类型资源某个参数值符合某特征

此样例:查找所有Pod,任意Container因OOMKilled而terminated,即命中规则,给出诊断建议

apiVersion: diagnosis.adp.aliyuncs.com/v1beta1
kind: DiagnosisRule
metadata:
  creationTimestamp: null
  name: pod-oom-killed
spec:
  # 诊断匹配规则,任意一条命中,就会判断匹配成功
  rules:
  # 数据来源
  - sources:
    # 取 K8s 对象
    - type: K8SObjects
      objects:
      - apiVersion: v1
        kind: Pod
    # 分析流水线
    analyzePipeline:
    # 使用jq表达式对取到Pod的信息进行筛选匹配
    - type: jq
      expression: '[.status.containerStatuses[]?.lastState.terminated.reason=="OOMKilled"]|any'
    # 对jq表达式的结果进行匹配,结果是否匹配'true'
    - type: regexp
      expression: "true"
  # 问题严重等级:Critical/Warning/Info
  level: Critical
  # 问题总结
  summary: Pod因OOM被Kill
  # 问题原因, 支持markdown格式
  reason: 某容器的内存使用超过了.spec.containers[].resource.limits.memory定义的数值,造成了OOM(Out Of Memory)错误,进程被系统kill
  # 处置建议,支持markdown格式
  suggestion: |-
    建议:
    - 提升配置,增加limits.memory的值(可在ADP-Local中,在组件的【组件运维】菜单,使用【垂直扩容】功能进行操作)
    - 排查程序是否存在内存泄露问题

匹配标准输出日志关键字

apiVersion: diagnosis.adp.aliyuncs.com/v1beta1
kind: DiagnosisRule
metadata:
  creationTimestamp: null
  name: loki-err-creating-index
spec:
  level: Warning
  sources:
    # 日志类型
    - type: Log
      logOptions:
        labelSelector:
          matchLabels:
            app: loki
        level: Pod
        # 取最后100行
        tail: 100
      # 取特定namespace下资源
      namespaceSelector:
        matchNames:
        - acs-system
  rules:
  - analyzePipeline:
    # 正则匹配
    - expression: file size too small\\nerror creating index
      type: regexp
    # 模板数据,可将实际数据用于渲染suggestion建议模板
    - templateData:
      - key: index
        value:
          expression: index_[0-9]*
          type: regexp
      - key: podUID
        value:
          expression: .metadata.uid
          type: jq
      - key: podName
        value:
          expression: .metadata.name
          type: jq
      - key: hostIP
        value:
          expression: .status.hostIP
          type: jq
      type: prepareTemplateData
  summary: Loki创建index失败
  reason: 问题来源于Loki v2.1版本的BUG,需要手动修复
  # 使用go-template语法,变量将会被templateData中的数据渲染
  suggestion: |-
    执行下面命令修复此问题:
    ```bash
    kubectl -n acs-system exec -it loki-stack-0 -- sh
    rm -rf /data/loki/boltdb-shipper-active/{{.index}}  /data/loki/boltdb-shipper-cache/{{.index}}
    ## 如果由于Pod始终处于waiting状态无法 `kubectl exec`,报错为error: unable to upgrade connection: container not found ("loki"), 则只能到 POD 所在节点删除文件,参考以下操作(需要ssh跨节点,输入节点密码)

    ## ssh到Pod所在主机
    ssh root@{{.hostIP}}

    ## 在目标主机上进入Pod挂载点
    cd $(mount | grep {{.podUID}} | grep ext4 | awk '{print $3}')/loki

    ## 删除错误的文件
    rm -rf boltdb-shipper-active/{{.index}} boltdb-shipper-cache/{{.index}}

    ## 完成退出 ssh
    exit
    ## 重启Pod
    kubectl -n acs-system delete pod {{.podName}}
    ```
    等待一段时间后便可观察到恢复,如新的Pod启动后还是同样的错误,可能是由于错误文件未删除干净,请重新运行此诊断程序获取新的命令进行执行

阿里云首页 云原生应用交付平台 相关技术圈