3. 台账数据结构设计:事故ID、时间戳、影响范围、严重等级、责任人、状态等字段定义
事故响应台账是SRE团队在Kubernetes环境下进行故障复盘、趋势分析和合规审计的核心数据载体。一个设计良好的台账数据结构,必须兼顾可追溯性、可查询性和自动化集成能力。本章将定义一套适用于Kubernetes事故场景的标准化字段模型,并给出对应的YAML配置示例。
3.1 核心字段定义与语义
下表列出了事故台账的必填字段和推荐字段,每个字段都对应Kubernetes原生资源或运维元数据,便于后续与集群事件、监控告警系统联动。
| 字段名 | 类型 | 必填 | 说明与Kubernetes映射 |
|---|---|---|---|
| incidentId | string (UUID) | 是 | 全局唯一事故标识,建议使用UUID v4。对应Kubernetes Event的uid或自定义资源名称。 |
| timestamp | RFC3339 | 是 | 事故首次发现时间(UTC)。对应Prometheus Alert的startsAt或Kubernetes Event的lastTimestamp。 |
| severity | enum | 是 | 严重等级:P0(灾难)、P1(严重)、P2(一般)、P3(轻微)。对应告警的severity标签。 |
| scope | string | 是 | 影响范围描述,如“production/us-east-1/payment-service”。支持命名空间、集群、区域粒度。 |
| status | enum | 是 | 当前状态:open、investigating、mitigating、resolved、closed。对应事故生命周期。 |
| assignee | string | 是 | 当前责任人(SRE工程师用户名或邮箱)。对应Kubernetes RBAC中的用户或ServiceAccount。 |
| title | string | 是 | 事故简要标题,如“支付服务Pod CrashLoopBackOff”。 |
| description | text | 否 | 详细描述,包含故障现象、初步诊断结论。 |
| affectedResources | []string | 否 | 受影响的Kubernetes资源列表,如[“Deployment/payment-v2”, “Service/payment-svc”]。 |
| rootCause | string | 否 | 根因分析结论,通常在resolved后填写。 |
| resolution | text | 否 | 解决措施与恢复步骤。 |
| duration | int (秒) | 否 | 事故持续时长(从open到resolved)。用于计算MTTR。 |
| tags | map[string]string | 否 | 自定义标签,如{“team”: “platform”, “region”: “us-east-1”}。 |
设计要点: 字段
scope 和 affectedResources 是Kubernetes环境特有的核心字段。通过它们可以快速定位事故影响的命名空间、Deployment、StatefulSet等资源,避免在复盘时手动翻查日志。
3.2 字段关系与事故生命周期
事故台账的字段并非静态存在,而是随着事故处理阶段动态演进的。下图展示了核心字段在事故生命周期中的变化关系。
3.3 严重等级(Severity)分级标准
在Kubernetes环境中,严重等级直接决定了响应SLA和升级路径。建议采用P0~P3四级分类,并与告警路由、值班调度策略绑定。
| 等级 | 标签 | 定义标准 | Kubernetes典型场景 | 响应SLA |
|---|---|---|---|---|
| P0 | 灾难 | 核心服务完全不可用,影响所有用户或造成数据丢失 | etcd集群宕机、控制平面不可用、关键Deployment副本数归零 | 15分钟响应 |
| P1 | 严重 | 主要功能受损,影响大量用户,但存在临时规避方案 | Ingress控制器故障、数据库连接池耗尽、节点NotReady | 30分钟响应 |
| P2 | 一般 | 非核心功能异常,影响部分用户,业务可降级运行 | Sidecar容器OOM、日志采集延迟、HPA扩缩容异常 | 2小时响应 |
| P3 | 轻微 | 不影响用户,但需要跟踪修复的运维问题 | 镜像漏洞扫描告警、Pod Pending(资源不足)、证书即将过期 | 24小时响应 |
注意: 严重等级应在事故创建时由值班SRE初步判定,并在调查阶段根据实际影响范围进行升级或降级。严禁将P0事故降级为P2以规避SLA考核。
3.4 状态(Status)流转规则
状态字段是台账工作流的核心,必须严格遵循以下流转方向,避免状态回跳导致数据混乱。
- open:事故被创建,尚未分配责任人。系统自动生成incidentId和timestamp。
- investigating:责任人已确认,正在收集信息、分析根因。此时应更新assignee和description。
- mitigating:已找到临时缓解措施(如回滚、扩容、重启),正在执行。此时应记录affectedResources。
- resolved:服务已恢复,根因已定位,resolution字段填写完成。duration自动计算。
- closed:复盘完成,所有字段已归档,不可再修改。仅允许添加tags。
3.5 Kubernetes CRD 定义示例
将台账数据结构定义为Kubernetes自定义资源(CRD),可以实现事故记录的声明式管理,并直接通过 kubectl 进行增删改查。以下是一个完整的CRD YAML示例:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: incidents.sre.example.com
spec:
group: sre.example.com
names:
kind: Incident
plural: incidents
singular: incident
shortNames:
- inc
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
required:
- spec
properties:
spec:
type: object
required:
- incidentId
- timestamp
- severity
- scope
- status
- assignee
- title
properties:
incidentId:
type: string
description: "全局唯一事故ID (UUID v4)"
timestamp:
type: string
format: date-time
description: "事故发现时间 (RFC3339)"
severity:
type: string
enum: ["P0", "P1", "P2", "P3"]
description: "严重等级"
scope:
type: string
description: "影响范围,如 cluster/namespace/service"
status:
type: string
enum: ["open", "investigating", "mitigating", "resolved", "closed"]
description: "事故状态"
assignee:
type: string
description: "责任人邮箱或用户名"
title:
type: string
maxLength: 200
description: "事故标题"
description:
type: string
description: "详细描述"
affectedResources:
type: array
items:
type: string
description: "受影响的Kubernetes资源列表"
rootCause:
type: string
description: "根因"
resolution:
type: string
description: "解决措施"
duration:
type: integer
description: "持续时长(秒)"
tags:
type: object
additionalProperties:
type: string
description: "自定义标签"
实战建议: 将CRD部署到集群后,可以使用
kubectl create incident 创建事故记录,配合 kubectl get incidents 查看台账列表。结合Kubernetes Event和Prometheus Alertmanager的Webhook,可以实现事故台账的自动创建和状态更新。
3.6 字段校验与自动化集成
为了保障数据质量,建议在CRD的 openAPIV3Schema 中配置字段校验规则,并在Controller中实现自动化状态机。以下是一些关键的校验策略:
- incidentId:使用
pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"强制UUID格式。 - timestamp:设置
format: date-time,确保时间字符串符合RFC3339标准。 - severity:使用
enum限制取值范围,避免非法等级。 - status:在Controller中实现状态机,拒绝非法状态转换(如从resolved直接跳回open)。
- assignee:建议与LDAP或GitHub账号联动,确保责任人可追溯。