Kube Diagnoser 是一个用于 Kubernetes 集群故障发现、诊断以及恢复的框架,集群的每个节点上运行着 Kube Diagnoser 的 Agent 组件来处理故障事件。Abnormal 自定义资源是对故障事件的抽象。通过创建 Abnormal 自定义资源,用户可以启动对已知的故障事件自动化诊断恢复的流水线。Kube Diagnoser 维护了故障诊断过程中的状态机,用户通过查看 Status 字段可以获取诊断结果。一次成功的故障诊断通常由以下几个组件完成,每个组件分别对应了故障诊断过程中的状态:
- 故障事件源:产生故障事件,故障通常由 Prometheus 报警、Event 或者用户自定义逻辑生成。
- 信息采集器:采集诊断需要的信息,也可以用于监控功能增强(如应用程序性能剖析)。
- 故障分析器:对故障进行分析并标记是否被成功识别。
- 故障恢复器:对被成功识别的故障进行恢复。
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 可以启动对已知的故障事件自动化诊断恢复的流水线,一个查看某个节点上磁盘使用量过高 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 集成了以下常用故障诊断功能:
- Command Executor:用于在节点上执行命令。
- Profiler:用于在节点上获取某个进程的性能剖析数据。
- Container Collector:采集节点上的容器信息并将结果记录到 Abnormal 中。
- Pod Collector:采集节点上的 Pod 信息并将结果记录到 Abnormal 中。
- Process Collector:采集节点上的进程信息并将结果记录到 Abnormal 中。
- Systemd Collector:采集节点上的 Systemd 相关信息并将结果记录到 Abnormal 中。
- Pod Disk Usage Diagnoser:分析 Pod 磁盘使用量并将结果记录到 Abnormal 中。
- Terminating Pod Diagnoser:分析节点上无法正常删除的 Pod 并将结果记录到 Abnormal 中。
- Signal Recoverer:向节点上的进程发送信号并将结果记录到 Abnormal 中。