Skip to content
This repository was archived by the owner on Feb 21, 2024. It is now read-only.

kubediag/kubediag

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Kube Diagnoser

License

Kube Diagnoser 是什么

Kube Diagnoser 是一个用于 Kubernetes 集群故障发现、诊断以及恢复的框架,集群的每个节点上运行着 Kube Diagnoser 的 Agent 组件来处理故障事件。Abnormal 自定义资源是对故障事件的抽象。通过创建 Abnormal 自定义资源,用户可以启动对已知的故障事件自动化诊断恢复的流水线。Kube Diagnoser 维护了故障诊断过程中的状态机,用户通过查看 Status 字段可以获取诊断结果。一次成功的故障诊断通常由以下几个组件完成,每个组件分别对应了故障诊断过程中的状态:

  • 故障事件源:产生故障事件,故障通常由 Prometheus 报警、Event 或者用户自定义逻辑生成。
  • 信息采集器:采集诊断需要的信息,也可以用于监控功能增强(如应用程序性能剖析)。
  • 故障分析器:对故障进行分析并标记是否被成功识别。
  • 故障恢复器:对被成功识别的故障进行恢复。

部署 Kube Diagnoser

Kube Diagnoser 包括 Master 和 Agent 组件,Master 在集群中以 Deployment 的方式部署,Agent 在集群中以 DaemonSet 的方式部署。Kube Diagnoser 要求 Kubernetes 集群版本不低于 1.15

Kube Diagnoser Master 建议使用 Cert Manager 管理 Webhook Server 的证书。如果集群中未部署 Cert Manager 可参考官方文档进行安装,运行以下命令进行快速安装:

# Kubernetes 1.16+
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.2/cert-manager.yaml

# Kubernetes <1.16
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.2/cert-manager-legacy.yaml

使用 kubectl 命令行工具进行部署:

kubectl create namespace kube-diagnoser
kubectl apply -f config/deploy

查看是否所有运行 Kube Diagnoser 的 Pod 处于 Running 状态:

kubectl get -n kube-diagnoser pod -o wide

在开发环境进行调试时,如果安装了 kustomize 工具,运行以下命令可以将当前分支上的代码打包成镜像并进行部署:

make docker-build
make deploy

通过 Abnormal 触发故障诊断流程

Abnormal 自定义资源是对故障事件的抽象。通过创建 Abnormal 可以启动对已知的故障事件自动化诊断恢复的流水线,一个查看某个节点上磁盘使用量过高 Pod 列表的 Abnormal 如下所示:

apiVersion: diagnosis.netease.com/v1
kind: Abnormal
metadata:
  name: pod-disk-usage-diagnosis
  namespace: default
spec:
  assignedDiagnosers:
  - name: pod-disk-usage-diagnoser
    namespace: kube-diagnoser
  assignedInformationCollectors:
  - name: pod-collector
    namespace: kube-diagnoser
  nodeName: 10.177.16.22
  source: Custom
status:
  conditions:
  - lastTransitionTime: "2020-08-13T07:44:42Z"
    status: "True"
    type: InformationCollected
  - lastTransitionTime: "2020-08-13T07:44:42Z"
    status: "True"
    type: Identified
  - lastTransitionTime: "2020-08-13T07:44:42Z"
    status: "True"
    type: Recovered
  context:
    podDiskUsageDiagnosis:
    - diskUsage: 77824
      metadata:
        creationTimestamp: "2020-07-15T03:35:24Z"
        generateName: kube-flannel-ds-amd64-
        labels:
          app: flannel
          controller-revision-hash: 7f489b5c67
          pod-template-generation: "1"
          tier: node
        name: kube-flannel-ds-amd64-qdjtb
        namespace: kube-system
        ownerReferences:
        - apiVersion: apps/v1
          blockOwnerDeletion: true
          controller: true
          kind: DaemonSet
          name: kube-flannel-ds-amd64
          uid: 94094c6d-4779-4172-9d39-dce884184fef
        resourceVersion: "1762390"
        selfLink: /api/v1/namespaces/kube-system/pods/kube-flannel-ds-amd64-qdjtb
        uid: 2bfed5a3-67fd-4721-99ae-6d584150c891
      path: /var/lib/kubelet/pods/2bfed5a3-67fd-4721-99ae-6d584150c891
  diagnoser:
    name: pod-disk-usage-diagnoser
    namespace: kube-diagnoser
  identifiable: true
  phase: Succeeded
  recoverable: true
  startTime: "2020-08-13T07:44:42Z"

该故障定义了一次对节点 10.177.16.22 的磁盘使用量诊断,整个处理流程如下:

  • Kube Diagnoser Agent 向信息采集器 pod-collector 发送请求以获取该节点上的 Pod 信息。
  • Kube Diagnoser Agent 向故障诊断器 pod-disk-usage-diagnoser 发送请求以获取 Pod 磁盘使用量诊断结果。故障诊断成功后 .status.identifiable 字段被设置为 true,磁盘使用量较多的 Pod 列表被记录到 .status.context.podDiskUsageDiagnosis 字段。
  • 由于 .spec.skipRecovery 字段被设置为 true,自动恢复流程被跳过。
  • 诊断成功结束后 .status.phase 字段被设置为 Succeeded

详细信息参考 Abnormal API 设计

可观测性

Kube Diagnoser 实现了 Prometheus 接口,通过访问节点的 10357 端口可以获取 Prometheus 监控数据:

curl 0.0.0.0:10357/metrics

内置功能

Kube Diagnoser 集成了以下常用故障诊断功能:

About

Problem diagnosis and operation orchestration for Kubernetes

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 6

Languages