SRE 编排器
大多数生产事故是先前事故的重演,前二十分钟的工作大多围绕相同的四条命令展开:读取容器的输出、查看其资源使用情况、检查哪些内容发生了变化、检查是否仅限此实例。这类工作是机械性的,且发生在最糟糕的时间点,手动执行正是导致真正有价值的工作迟迟无法开始的原因。
一个独立的服务,它监控故障,收集人类会收集的证据,请求模型阅读这些证据,并将答案转化为一个事件,附上建议的修复方案。默认情况下,它不会执行修复方案。
有三种情况可以触发事件:
- 来自监控栈的警报;
- 服务在平台自身的事件键上看到的变更——部署失败、健康检查失败、应用程序错误;
- 有人通过控制台或助手的事件工具请求创建事件。
重复的警报会合并为一个事件。当两个警报的名称、容器和稳定标签在时间窗口内一致时,它们属于同一事件,因此容器循环重启只会产生一个需要查看的对象,而不是四十个。
事件如何处理
Section titled “事件如何处理”它首先被归属于一个租户。 如果标签指定了一个租户,则使用该标签;否则,将解析事件来源的节点,以确定拥有该节点的租户;否则,它属于平台。归属发生在任何其他操作之前,因为之后的所有数据都存储和读取在一个租户的范围内。
收集证据:容器的近期输出、资源使用情况、配置、其周围近期事件、重启和饱和度指标,以及任何追踪信息。
一个模型读取证据并以固定格式回答:风险程度、解决类型、建议的命令,以及是否需要人工介入。建议绝非服务直接执行的自由文本——它是一个结构化的回答,每个命令都有对应的风险等级。
随后,防护栏会评估每个命令,自动化流程在此决定是停止还是继续。
需要有人批准,否则什么都不会运行。 一个其命令被阻止的事件会等待批准。批准它会重新运行这些命令,并且它们会再次通过相同的阻止列表检查——批准绕过的是滚动更新阶段,而不是危险命令列表。
允许在无人工干预下运行的条件
Section titled “允许在无人工干预下运行的条件”默认情况下,什么都不做。该服务在四个滚动更新阶段中的第一个阶段发布,该阶段在任何风险级别都不允许自动补救;后续阶段会依次添加低、中、高风险。在阶段之上还有七项检查:一个被阻止的容器列表、一个被阻止的警报列表(数据库宕机和数据丢失警报都默认在其中)、一个与命令文本匹配的危险模式列表、一个严重性门控、一个风险门控、每个事件每小时三条命令的限制,以及同一指纹的补救措施之间的冷却时间。
关于这一点,有两点值得明确说明,而非留待自行发现。
诊断命令不受阶段限制。 当分析结论为无问题或原因在于外部时,系统会运行其提议的诊断命令以确认该结论,此行为适用于包括第一阶段在内的所有阶段。这些命令仍受危险模式列表的约束。
命令是一个 shell 命令。 没有程序的允许列表,也没有沙箱:介于提议的命令和机器之间的是模式列表和阶段。这是一个深思熟虑的设计点,而不是疏忽——该服务的价值在于它可以运行工程师本会运行的命令——但这正是滚动更新阶段存在的原因,也是默认不运行任何命令的原因。
实际配置了哪个阶段无法从源代码得知。 这是操作员设置的状态,从控制台编辑并存储于平台的键值存储中,如果缺失此状态,服务将拒绝启动。要了解某个给定部署将自动执行哪些操作,请阅读其配置,而非此页面。
一项服务,多个租户
Section titled “一项服务,多个租户”整个平台仅有一个进程,而非每个租户一个。隔离体现在数据层面:每起事故都存储在其所属租户下,每次读写操作都限定于一个租户,控制平面会在代理并注入已验证的租户身份之前,剥离调用者提供的任何租户标识。未选择租户的平台操作员可获得所有租户的视图,此权限提升操作会被记录到单独的审计日志中,而非静默执行。
自动化策略本身是平台范围的。 防护栏、滚动更新阶段和通知设置位于一个键下,由平台操作员更改;每个租户都在相同的策略下运行。不存在按租户的策略。
谁可以执行哪些操作
Section titled “谁可以执行哪些操作”读取事件需要一个权限,批准或关闭事件需要另一个,引发事件需要第三个,更改配置需要第四个,并且还需要平台运维人员身份。完整列表以及每个权限的持有角色是角色参考]。
Not this
本页不告诉您如何运行该服务或将其滚动更新阶段设置为什么;这是一个需要根据每个部署做出的运营决策。
此处有意不断言两点,因为源代码无法确定它们。实时控制台更新从服务推送到一个控制平面地址,该地址位于身份验证和权限之后注册,而服务自身的客户端不发送凭据,并将失败视为已记录的警告——此推送在给定部署中是否成功,应由该部署决定,而非此页面。事故存储在平台的键值存储中,按天数进行保留扫描;它们一直是该存储的最大单一消费者,目前尚无卸载机制。
在仪表板上跟踪事件
Section titled “在仪表板上跟踪事件”在侧边栏(运维部分)打开 SRE 自动化。一个打开的事件会显示其严重性、所属租户以及限制其自动操作范围的安全防护措施 — 参见 sre-orchestrator/app/safety_guardrails.py。批准修复需要 sre:approve 权限;更改编排器在无人值守时允许的操作需要 sre:configure。有关批准操作,请参阅任务指南](/docs/zh/guides/sre-automation/)。
